From: Rob Davis <rob.davis@virgin.net>
To: Marcel Holtmann <marcel@holtmann.org>
Cc: BlueZ Mailing List <bluez-users@lists.sourceforge.net>
Subject: Re: [Bluez-users] epox-presenter
Date: Thu, 29 Jan 2004 16:42:08 +0000 [thread overview]
Message-ID: <401937E0.6000800@virgin.net> (raw)
In-Reply-To: <1075355198.26729.58.camel@pegasus>
[-- Attachment #1: Type: text/plain, Size: 910 bytes --]
Marcel Holtmann wrote:
>Hi Rob,
>
>
>
>>Okay, my first ever C hack...
>>
>>
>
>no problem, because everyone has to start sometime :)
>
>
>
>>Implemented three functions, back button triggers mouse button 4, next
>>button triggers mouse button 5, fn button triggers a keyboard alt + tab,
>>which changes window focus in kde, and probably gnome.
>>
>>I have also reduced the speed of the pointer from 12 to 4, which I am
>>much happier with as I have a hope of landing on the correct window.
>>
>>
>
>Can we get some command options to change this behaviour?
>
>
>
>>Sorry, I'm not sure how to do patch, but the file is small...
>>
>>
>
>take a look at "man diff" and do "diff -urN <orig> <modified>". It is
>much more easier for me to look at a patch, because in most cases only
>the changes matters.
>
>Regards
>
>Marcel
>
>
>
Okay... This is a slight bug fix over the previous one..
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 5402 bytes --]
diff -urN epox-presenter.orig/src/main.c epox-presenter-0.2/src/main.c
--- epox-presenter.orig/src/main.c 2003-08-15 11:41:29.000000000 +0100
+++ epox-presenter-0.2/src/main.c 2004-01-29 16:39:19.000000000 +0000
@@ -39,21 +39,28 @@
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
-
+#include <X11/keysym.h>
#include <math.h>
+/* Sends Alt + Tab when Fn Button is Pressed */
static void func(Display *display)
{
+ XTestGrabControl(display, True);
+ XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_Alt_L),
+ True, CurrentTime );
+ XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_Tab),
+ True, CurrentTime );
+ XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_Tab),
+ False, CurrentTime );
+ XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_Alt_L),
+ False, CurrentTime );
+ XTestGrabControl(display, False);
+ XFlush(display);
}
-static void back(Display *display)
-{
-}
-static void next(Display *display)
-{
-}
+/* Mouse Button */
static void button(Display *display, unsigned int button, Bool is_press)
{
@@ -62,31 +69,42 @@
XTestGrabControl(display, False);
XFlush(display);
}
+/* Mouse Movement */
-static void move(Display *display, unsigned int direction)
+static void move(Display *display, unsigned int direction, unsigned int speed)
{
double angle;
int x, y;
-
+ speed++;
angle = (direction * 22.5) * 3.1415926 / 180;
- x = (int) (sin(angle) * 12);
- y = (int) (cos(angle) * -12);
-
+ x = (int) (sin(angle) * speed);
+ y = (int) (cos(angle) * (0 - (int)(speed)));
XTestGrabControl(display, True);
XTestFakeRelativeMotionEvent(display, x, y, CurrentTime);
XTestGrabControl(display, False);
XFlush(display);
}
-static void decode_event(Display *display, unsigned char event)
+static void decode_event(Display *display, unsigned char event, unsigned int speed)
{
switch (event) {
case 48:
func(display); break;
- case 55:
- back(display); break;
+
+/* Next two cases are to implement mouse buttons 4 and 5.
+ ZAxisMapping must be defined in XF86Config for the CorePointer
+ Unlike Button 1 and 3, no unpress case is generated, so we sleep for
+ a tenth of a second before turning the button off. - Rob Davis
+*/
+
+ case 55:
+ button(display, 4, True);
+ sleep(0.1);
+ button(display, 4, False); break;
case 56:
- next(display); break;
+ button(display, 5, True);
+ sleep(0.1);
+ button(display, 5, False); break;
case 53:
button(display, 1, True); break;
case 121:
@@ -98,39 +116,40 @@
case 120:
button(display, 3, False); break;
case 112:
- break;
+ break;
+
case 51:
- move(display, 0); break;
+ move(display, 0, speed); break;
case 97:
- move(display, 1); break;
+ move(display, 1, speed); break;
case 65:
- move(display, 2); break;
+ move(display, 2, speed); break;
case 98:
- move(display, 3); break;
+ move(display, 3, speed); break;
case 50:
- move(display, 4); break;
+ move(display, 4, speed); break;
case 99:
- move(display, 5); break;
+ move(display, 5, speed); break;
case 67:
- move(display, 6); break;
+ move(display, 6, speed); break;
case 101:
- move(display, 7); break;
+ move(display, 7, speed); break;
case 52:
- move(display, 8); break;
+ move(display, 8, speed); break;
case 100:
- move(display, 9); break;
+ move(display, 9, speed); break;
case 66:
- move(display, 10); break;
+ move(display, 10, speed); break;
case 102:
- move(display, 11); break;
+ move(display, 11, speed); break;
case 49:
- move(display, 12); break;
+ move(display, 12, speed); break;
case 103:
- move(display, 13); break;
+ move(display, 13, speed); break;
case 57:
- move(display, 14); break;
+ move(display, 14, speed); break;
case 104:
- move(display, 15); break;
+ move(display, 15, speed); break;
case 69:
break;
default:
@@ -241,14 +260,16 @@
"\n");
printf("Options:\n"
- "\t-i [hciX|bdaddr] Local HCI device or BD Address\n"
- "\t-h, --help Display help\n"
+ "\t-i [hciX|bdaddr] Local HCI device or BD Address\n"
+ "\t-h, --help Display help\n"
+ "\t-s, --speed [1 - 50] Speed of Mouse Pointer - Default 4\n"
"\n");
}
static struct option main_options[] = {
{ "help", 0, 0, 'h' },
{ "device", 1, 0, 'i' },
+ { "speed", 1, 0, 's' },
{ 0, 0, 0, 0 }
};
@@ -263,11 +284,13 @@
char bda[18];
bdaddr_t src, dst;
uint8_t channel;
- int i, opt, sk, len;
+ int i, opt, sk, len, speed;
+
+ speed = 4;
bacpy(&src, BDADDR_ANY);
- while ((opt = getopt_long(argc, argv, "+i:h", main_options, NULL)) != -1) {
+ while ((opt = getopt_long(argc, argv, "+i:hs:", main_options, NULL)) != -1) {
switch(opt) {
case 'i':
if (!strncmp(optarg, "hci", 3))
@@ -278,6 +301,19 @@
case 'h':
usage();
exit(0);
+ case 's':
+ speed = atoi(optarg);
+ if (speed <1)
+ { printf ("Invalid Speed\n");
+ usage();
+ exit(1); }
+ if (speed >50)
+ { printf ("Invalid Speed\n");
+ usage();
+ exit(1); }
+
+ printf ("Speed settings %d\n", speed );
+ break;
default:
exit(0);
}
@@ -364,7 +400,7 @@
break;
for (i = 0; i < len; i++)
- decode_event(display, buf[i]);
+ decode_event(display, buf[i], speed);
}
printf("Disconnected\n");
prev parent reply other threads:[~2004-01-29 16:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-28 18:02 [Bluez-users] epox-presenter Rob Davis
2004-01-28 18:34 ` Marcel Holtmann
2004-01-28 21:59 ` Rob Davis
2004-01-28 22:34 ` Michal Semler (volny.cz)
2004-01-29 5:46 ` Marcel Holtmann
2004-01-29 16:42 ` Rob Davis [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=401937E0.6000800@virgin.net \
--to=rob.davis@virgin.net \
--cc=bluez-users@lists.sourceforge.net \
--cc=marcel@holtmann.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox