diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | config.h | 52 | ||||
-rw-r--r-- | xmouseless.c | 122 |
4 files changed, 122 insertions, 55 deletions
@@ -11,7 +11,7 @@ BIN = xmouseless all: $(BIN) -$(BIN): $(SRC) +$(BIN): $(SRC) config.h $(CC) $(CFLAGS) -o $(BIN) $(SRC) $(LDFLAGS) clean: @@ -1 +1,2 @@ - call XInitThreads +- check if key repeat is enabled at start diff --git a/config.h b/config.h new file mode 100644 index 0000000..7023886 --- /dev/null +++ b/config.h @@ -0,0 +1,52 @@ +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +/* the rate at which the mouse moves */ +#define MOVE_RATE 30 + +/* the speed with no modifier */ +#define DEFAULT_SPEED 10 + +#define EXIT_KEY XK_q + +typedef struct { + KeySym keysym; + int x; + int y; +} MoveBinding; + +typedef struct { + KeySym keysym; + int button; +} ClickBinding; + +typedef struct { + KeySym keysym; + int speed; +} SpeedBindings; + +static MoveBinding move_bindings[] = { + /* key x y */ + { XK_j, -1, 0 }, + { XK_l, 1, 0 }, + { XK_i, 0, -1 }, + { XK_comma, 0, 1 }, + { XK_u, -1, -1 }, + { XK_o, 1, -1 }, + { XK_m, -1, 1 }, + { XK_period, 1, 1 }, +}; + +static ClickBinding click_bindings[] = { + /* key button */ + { XK_f, 1 }, + { XK_d, 2 }, + { XK_s, 3 }, +}; + +static SpeedBindings speed_bindings[] = { + /* key speed */ + { XK_Super_L, 200 }, + { XK_Alt_L, 50 }, + { XK_a, 2 }, +}; diff --git a/xmouseless.c b/xmouseless.c index 197be5b..65f3e13 100644 --- a/xmouseless.c +++ b/xmouseless.c @@ -8,26 +8,28 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> +#include <X11/XKBlib.h> #include <X11/extensions/XTest.h> +#include "config.h" -int MOVE_RATE = 30; -int SPEED = 10; +#define LENGTH(X) (sizeof X / sizeof X[0]) Display *dpy; int screen; Window root; pthread_t movethread; +unsigned int speed = DEFAULT_SPEED; + struct { int x; int y; - int movex; - int movey; + int move_x; + int move_y; } mouseinfo; - int getrootptr(int *x, int *y); void moverelative(int x, int y); void click(int button, int is_press); @@ -76,66 +78,81 @@ void close_x() { void *moveforever(void *val) { /* this is executed in a thread */ while (1) { - if (mouseinfo.movex != 0 || mouseinfo.movey != 0) { - moverelative(SPEED * mouseinfo.movex, SPEED * mouseinfo.movey); + if (mouseinfo.move_x != 0 || mouseinfo.move_y != 0) { + moverelative(speed * mouseinfo.move_x, speed * mouseinfo.move_y); } usleep(1000000 / MOVE_RATE); } } void handle_keypress(XKeyEvent event) { - if (event.keycode == 24 || event.keycode == 0x09) { + unsigned int i; + KeySym keysym; + + keysym = XkbKeycodeToKeysym(dpy, event.keycode, + 0, event.state & ShiftMask ? 1 : 0); + + /* exit */ + if (keysym == EXIT_KEY) { close_x(); exit(0); } - else if (event.keycode == 45) { - mouseinfo.movex = 0; - mouseinfo.movey = 0; - } - else if (event.keycode == 44) { - mouseinfo.movex -= 1; - } - else if (event.keycode == 46) { - mouseinfo.movex += 1; - } - else if (event.keycode == 31) { - mouseinfo.movey -= 1; - } - else if (event.keycode == 59) { - mouseinfo.movey += 1; - } - else if (event.keycode == 64) { - SPEED = 40; + + /* move bindings */ + for (i = 0; i < LENGTH(move_bindings); i++) { + if (move_bindings[i].keysym == keysym) { + printf("move: %i, %i\n", move_bindings[i].x, move_bindings[i].y); + mouseinfo.move_x += move_bindings[i].x; + mouseinfo.move_y += move_bindings[i].y; + } } - else if (event.keycode == 41) { - click(1, True); + + /* click bindings */ + for (i = 0; i < LENGTH(click_bindings); i++) { + if (click_bindings[i].keysym == keysym) { + printf("click: %i\n", click_bindings[i].button); + click(click_bindings[i].button, True); + } } - else if (event.keycode == 39) { - click(3, True); + + /* speed bindings */ + for (i = 0; i < LENGTH(speed_bindings); i++) { + if (speed_bindings[i].keysym == keysym) { + printf("speed: %i\n", speed_bindings[i].speed); + speed = speed_bindings[i].speed; + } } } void handle_keyrelease(XKeyEvent event) { - if (event.keycode == 44) { - mouseinfo.movex += 1; - } - else if (event.keycode == 46) { - mouseinfo.movex -= 1; - } - else if (event.keycode == 31) { - mouseinfo.movey += 1; - } - else if (event.keycode == 59) { - mouseinfo.movey -= 1; - } - else if (event.keycode == 64) { - SPEED = 10; + unsigned int i; + KeySym keysym; + + keysym = XkbKeycodeToKeysym(dpy, event.keycode, + 0, event.state & ShiftMask ? 1 : 0); + + /* move bindings */ + for (i = 0; i < LENGTH(move_bindings); i++) { + if (move_bindings[i].keysym == keysym) { + mouseinfo.move_x -= move_bindings[i].x; + mouseinfo.move_y -= move_bindings[i].y; + } } - else if (event.keycode == 41) { - click(1, False); + + /* click bindings */ + for (i = 0; i < LENGTH(click_bindings); i++) { + if (click_bindings[i].keysym == keysym) { + printf("click release: %i\n", click_bindings[i].button); + click(click_bindings[i].button, False); + } } - else if (event.keycode == 39) { - click(3, False); + + /* speed bindings */ + for (i = 0; i < LENGTH(speed_bindings); i++) { + if (speed_bindings[i].keysym == keysym) { + printf("speed: %i\n", DEFAULT_SPEED); + speed = DEFAULT_SPEED; + } } } @@ -146,8 +163,8 @@ int main () { init_x(); getrootptr(&mouseinfo.x, &mouseinfo.y); - mouseinfo.movex = 0; - mouseinfo.movey = 0; + mouseinfo.move_x = 0; + mouseinfo.move_y = 0; // start the thread for mouse movement rc = pthread_create(&movethread, NULL, &moveforever, NULL); @@ -162,14 +179,11 @@ int main () { switch (event.type) { case KeyPress: getrootptr(&mouseinfo.x, &mouseinfo.y); - printf("You pressed %i\n", event.xkey.keycode); - handle_keypress(event.xkey); break; case KeyRelease: - printf("You released %i\n", event.xkey.keycode); - + getrootptr(&mouseinfo.x, &mouseinfo.y); handle_keyrelease(event.xkey); break; } |