# HG changeset patch # User paulo@thepaulopc # Date 1276761035 25200 # Node ID 0d5dc7c29c7892440b2af2795640d2ad69a40086 # Parent ab8a496afb67970f5ce04ed7cef77ec42379405d fix tabbing diff -r ab8a496afb67 -r 0d5dc7c29c78 keynav.c --- a/keynav.c Tue Sep 08 22:45:57 2009 -0700 +++ b/keynav.c Thu Jun 17 00:50:35 2010 -0700 @@ -27,497 +27,497 @@ struct /* undo stack */ { - int x[N_UNDO]; - int y[N_UNDO]; - int w[N_UNDO]; - int h[N_UNDO]; - int ninegrid[N_UNDO]; + int x[N_UNDO]; + int y[N_UNDO]; + int w[N_UNDO]; + int h[N_UNDO]; + int ninegrid[N_UNDO]; } u; void toggleninegrid() { - if (ninegrid) - ninegrid = 0; - else - ninegrid = 1; + if (ninegrid) + ninegrid = 0; + else + ninegrid = 1; } void stats(int hits, int moves) { - allhits += hits; - allmoves += moves; - allclicks++; - printf("hits=%d, moves=%d \n", hits, moves); - printf("total hits=%d, total moves=%d, total clicks=%d, avg. hit/click=%.2f, avg. moves/click=%.2f \n", allhits, allmoves, allclicks, (float)allhits/(float)allclicks, (float)allmoves/(float)allclicks); - fflush(stdout); fflush(stderr); // force buffers to write out + allhits += hits; + allmoves += moves; + allclicks++; + printf("hits=%d, moves=%d \n", hits, moves); + printf("total hits=%d, total moves=%d, total clicks=%d, avg. hit/click=%.2f, avg. moves/click=%.2f \n", allhits, allmoves, allclicks, (float)allhits/(float)allclicks, (float)allmoves/(float)allclicks); + fflush(stdout); fflush(stderr); // force buffers to write out } void grab(char *keyname, int mods) { - int key; - - key = XKeysymToKeycode(dpy, XStringToKeysym(keyname)); - XGrabKey(dpy, key, mods, root, False, - GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, key, mods | CAPSLOCKMASK, root, False, - GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, key, mods | NUMLOCKMASK, root, False, - GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, key, mods | CAPSLOCKMASK | NUMLOCKMASK, root, False, - GrabModeAsync, GrabModeAsync); + int key; + + key = XKeysymToKeycode(dpy, XStringToKeysym(keyname)); + XGrabKey(dpy, key, mods, root, False, + GrabModeAsync, GrabModeAsync); + XGrabKey(dpy, key, mods | CAPSLOCKMASK, root, False, + GrabModeAsync, GrabModeAsync); + XGrabKey(dpy, key, mods | NUMLOCKMASK, root, False, + GrabModeAsync, GrabModeAsync); + XGrabKey(dpy, key, mods | CAPSLOCKMASK | NUMLOCKMASK, root, False, + GrabModeAsync, GrabModeAsync); } void ungrab(char *keyname, int mod) { - int key; - - key = XKeysymToKeycode(dpy, XStringToKeysym(keyname)); - XUngrabKey(dpy, key, mod, root); - XUngrabKey(dpy, key, mod | CAPSLOCKMASK, root); - XUngrabKey(dpy, key, mod | NUMLOCKMASK, root); - XUngrabKey(dpy, key, mod | CAPSLOCKMASK | NUMLOCKMASK, root); + int key; + + key = XKeysymToKeycode(dpy, XStringToKeysym(keyname)); + XUngrabKey(dpy, key, mod, root); + XUngrabKey(dpy, key, mod | CAPSLOCKMASK, root); + XUngrabKey(dpy, key, mod | NUMLOCKMASK, root); + XUngrabKey(dpy, key, mod | CAPSLOCKMASK | NUMLOCKMASK, root); } void buttondown(int i) { - XTestFakeButtonEvent(dpy, i, True, 50); + XTestFakeButtonEvent(dpy, i, True, 50); } void buttonup(int i) { - XTestFakeButtonEvent(dpy, i, False, 50); + XTestFakeButtonEvent(dpy, i, False, 50); } void warppointer(int x, int y, int w, int h) { - XWarpPointer(dpy, None, root, 0, 0, 0, 0, x + w/2, y + h/2); + XWarpPointer(dpy, None, root, 0, 0, 0, 0, x + w/2, y + h/2); } /* operations for undo */ void undo_stack_push(int x, int y, int w, int h) { - int i; + int i; - if (x >= 0 && y >= 0 && w > 0 && h > 0) { - fprintf(stderr,"undo_stack_push success: @(%d,%d) #(%d,%d)\n", x, y, w, h); - for (i=N_UNDO-1; i>0; i--) { - u.x[i] = u.x[i-1]; - u.y[i] = u.y[i-1]; - u.w[i] = u.w[i-1]; - u.h[i] = u.h[i-1]; - u.ninegrid[i] = u.ninegrid[i-1]; + if (x >= 0 && y >= 0 && w > 0 && h > 0) { + fprintf(stderr,"undo_stack_push success: @(%d,%d) #(%d,%d)\n", x, y, w, h); + for (i=N_UNDO-1; i>0; i--) { + u.x[i] = u.x[i-1]; + u.y[i] = u.y[i-1]; + u.w[i] = u.w[i-1]; + u.h[i] = u.h[i-1]; + u.ninegrid[i] = u.ninegrid[i-1]; + } + u.x[0] = x; + u.y[0] = y; + u.w[0] = w; + u.h[0] = h; + u.ninegrid[0] = ninegrid; } - u.x[0] = x; - u.y[0] = y; - u.w[0] = w; - u.h[0] = h; - u.ninegrid[0] = ninegrid; - } } int undo_stack_pop(int *x, int *y, int *w, int *h, int *ninegrid) { - int i; - int ret = 0; + int i; + int ret = 0; + + int rx = u.x[0]; + int ry = u.y[0]; + int rw = u.w[0]; + int rh = u.h[0]; + int rninegrid = u.ninegrid[0]; - int rx = u.x[0]; - int ry = u.y[0]; - int rw = u.w[0]; - int rh = u.h[0]; - int rninegrid = u.ninegrid[0]; - - if (rx >= 0 && ry >= 0 && rw > 0 && rh > 0) { - fprintf(stderr,"undo_stack_pop success: @(%d,%d) #(%d,%d)\n", *x, *y, *w, *h); - ret = 1; // return success - for (i=0; i= 0 && ry >= 0 && rw > 0 && rh > 0) { + fprintf(stderr,"undo_stack_pop success: @(%d,%d) #(%d,%d)\n", *x, *y, *w, *h); + ret = 1; // return success + for (i=0; i 0) *x -= *w; // shift left - } - if (chk_keysym(keysym, KEY_DOWN) || chk_keysym(keysym, KEY_DOWNLEFT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { - if ((*y + *h) < attr.height) *y += *h; // shift down - } - if (chk_keysym(keysym, KEY_UP) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_UPRIGHT)) { - if (*y > 0) *y -= *h; // shift up - } - if (chk_keysym(keysym, KEY_RIGHT) || chk_keysym(keysym, KEY_UPRIGHT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { - if ((*x + *w) < attr.width) *x += *w; // shift right + if (mod & SHIFTMASK || mod & SHIFTMASK & NUMLOCKMASK || mod & SHIFTMASK & CAPSLOCKMASK || mod & SHIFTMASK & CAPSLOCKMASK & NUMLOCKMASK) { + if (chk_keysym(keysym, KEY_CENTER)) + toggleninegrid(); + if (chk_keysym(keysym, KEY_LEFT) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_DOWNLEFT)) { + if (*x > 0) *x -= *w; // shift left + } + if (chk_keysym(keysym, KEY_DOWN) || chk_keysym(keysym, KEY_DOWNLEFT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { + if ((*y + *h) < attr.height) *y += *h; // shift down + } + if (chk_keysym(keysym, KEY_UP) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_UPRIGHT)) { + if (*y > 0) *y -= *h; // shift up + } + if (chk_keysym(keysym, KEY_RIGHT) || chk_keysym(keysym, KEY_UPRIGHT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { + if ((*x + *w) < attr.width) *x += *w; // shift right + } + } else { + if (ninegrid) { + if (chk_keysym(keysym, KEY_UPLEFT)) { + *w /= 3; *h /= 3; // split upper left + } else if (chk_keysym(keysym, KEY_UP)) { + *w /= 3; *h /= 3; // split up + *x += *w; + } else if (chk_keysym(keysym, KEY_UPRIGHT)) { + *w /= 3; *h /= 3; // split upper right + *x += *w * 2; + } else if (chk_keysym(keysym, KEY_LEFT)) { + *w /= 3; *h /= 3; // split left + *y += *h; + } else if (chk_keysym(keysym, KEY_CENTER)) { + *w /= 3; *h /= 3; // split center + *x += *w; *y += *h; + } else if (chk_keysym(keysym, KEY_RIGHT)) { + *w /= 3; *h /= 3; // split right + *x += *w * 2; *y += *h; + } else if (chk_keysym(keysym, KEY_DOWNLEFT)) { + *w /= 3; *h /= 3; // split bottom left + *y += *h * 2; + } else if (chk_keysym(keysym, KEY_DOWN)) { + *w /= 3; *h /= 3; // split down + *x += *w; *y += *h * 2; + } else if (chk_keysym(keysym, KEY_DOWNRIGHT)) { + *w /= 3; *h /= 3; // split bottom right + *x += *w * 2; *y += *h * 2; + } + } else { + if (chk_keysym(keysym, KEY_LEFT) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_DOWNLEFT)) { + *w /= 2; // split left + } + if (chk_keysym(keysym, KEY_DOWN) || chk_keysym(keysym, KEY_DOWNLEFT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { + *h /= 2; // split down + *y += *h; + } + if (chk_keysym(keysym, KEY_UP) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_UPRIGHT)) { + *h /= 2; // split up + } + if (chk_keysym(keysym, KEY_RIGHT) || chk_keysym(keysym, KEY_UPRIGHT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { + *w /= 2; // split right + *x += *w; + } + } } - } else { - if (ninegrid) { - if (chk_keysym(keysym, KEY_UPLEFT)) { - *w /= 3; *h /= 3; // split upper left - } else if (chk_keysym(keysym, KEY_UP)) { - *w /= 3; *h /= 3; // split up - *x += *w; - } else if (chk_keysym(keysym, KEY_UPRIGHT)) { - *w /= 3; *h /= 3; // split upper right - *x += *w * 2; - } else if (chk_keysym(keysym, KEY_LEFT)) { - *w /= 3; *h /= 3; // split left - *y += *h; - } else if (chk_keysym(keysym, KEY_CENTER)) { - *w /= 3; *h /= 3; // split center - *x += *w; *y += *h; - } else if (chk_keysym(keysym, KEY_RIGHT)) { - *w /= 3; *h /= 3; // split right - *x += *w * 2; *y += *h; - } else if (chk_keysym(keysym, KEY_DOWNLEFT)) { - *w /= 3; *h /= 3; // split bottom left - *y += *h * 2; - } else if (chk_keysym(keysym, KEY_DOWN)) { - *w /= 3; *h /= 3; // split down - *x += *w; *y += *h * 2; - } else if (chk_keysym(keysym, KEY_DOWNRIGHT)) { - *w /= 3; *h /= 3; // split bottom right - *x += *w * 2; *y += *h * 2; - } - } else { - if (chk_keysym(keysym, KEY_LEFT) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_DOWNLEFT)) { - *w /= 2; // split left - } - if (chk_keysym(keysym, KEY_DOWN) || chk_keysym(keysym, KEY_DOWNLEFT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { - *h /= 2; // split down - *y += *h; - } - if (chk_keysym(keysym, KEY_UP) || chk_keysym(keysym, KEY_UPLEFT) || chk_keysym(keysym, KEY_UPRIGHT)) { - *h /= 2; // split up - } - if (chk_keysym(keysym, KEY_RIGHT) || chk_keysym(keysym, KEY_UPRIGHT) || chk_keysym(keysym, KEY_DOWNRIGHT)) { - *w /= 2; // split right - *x += *w; - } + + if (ox != *x || oy != *y || ow != *w || oh != *h) { + undo_stack_push(ox, oy, ow, oh); + *moves += 1; } - } + else if (chk_keysym(keysym, KEY_UNDO)) { + int i, j; - if (ox != *x || oy != *y || ow != *w || oh != *h) { - undo_stack_push(ox, oy, ow, oh); - *moves += 1; - } - else if (chk_keysym(keysym, KEY_UNDO)) { - int i, j; + if (mod & SHIFTMASK) j = 0; + else j = SHIFT_N_UNDO-1; - if (mod & SHIFTMASK) j = 0; - else j = SHIFT_N_UNDO-1; + for (i=j; i= ninegrid_n_switch) - ninegrid = 0; - hits++; - XMoveResizeWindow(dpy, zone, x, y, w, h); - drawquadrants(zone, w, h); - } else - done++; + drawquadrants(zone, w, h); + XMapWindow(dpy, zone); + drawquadrants(zone, w, h); + + fprintf(stderr,"Starting quadrants...\n"); + while (!done) { + XEvent e; + XNextEvent(dpy, &e); + if (e.type == KeyPress) { + keysym = XKeycodeToKeysym(dpy, e.xkey.keycode, 0); + mod = e.xkey.state; + if (chk_keysym(keysym, KEY_Q_CLICK)) { + done++; + click = 1; + } else if (chk_keysym(keysym, KEY_Q_RCLICK)) { + done++; + click = 3; + } else if (chk_keysym(keysym, KEY_QW_CLICK)) { + done++; + warp = 1; + click = 1; + } else if (chk_keysym(keysym, KEY_Q_MCLICK)) { + done++; + click = 2; + } else if (chk_keysym(keysym, KEY_QW_RCLICK)) { + done++; + warp = 1; + click = 3; + } else if (chk_keysym(keysym, KEY_HIDE)) { + done++; + warp = 1; + x = w; y = h; + } else if (chk_keysym(keysym, KEY_ESCAPE)) { + warp = 0; + done++; + } else if (!drag && chk_keysym(keysym, KEY_ONE)) { + buttondown(1); + buttonup(1); + } else if (!drag && chk_keysym(keysym, KEY_TWO)) { + buttondown(2); + buttonup(2); + } else if (!drag && chk_keysym(keysym, KEY_THREE)) { + buttondown(3); + buttonup(3); + } else { + if (k = handlekey(keysym, mod, &moves, &x, &y, &w, &h)) { + if (ninegrid_default && ninegrid_n_switch && k < 2 && moves >= ninegrid_n_switch) + ninegrid = 0; + hits++; + XMoveResizeWindow(dpy, zone, x, y, w, h); + drawquadrants(zone, w, h); + } else + done++; } } - } + } - // end mouse key - XUngrabKeyboard(dpy, CurrentTime); - XDestroyWindow(dpy, zone); - undo_stack_push(x, y, w, h); + // end mouse key + XUngrabKeyboard(dpy, CurrentTime); + XDestroyWindow(dpy, zone); + undo_stack_push(x, y, w, h); - if (warp) - warppointer(x, y, w, h); - if (click == 1) { - if (!drag) - buttondown(1); - if (mod & DRAGMASK && !drag) - drag = 1; - else if (mod & DRAGMASK) { - buttonup(1); - buttondown(1); - } else { - buttonup(1); - drag = 0; + if (warp) + warppointer(x, y, w, h); + if (click == 1) { + if (!drag) + buttondown(1); + if (mod & DRAGMASK && !drag) + drag = 1; + else if (mod & DRAGMASK) { + buttonup(1); + buttondown(1); + } else { + buttonup(1); + drag = 0; + } + } else if (click) { + buttondown(click); + buttonup(click); + } + + if (click) stats(hits, moves); + + // loop back if in drag mode + if (drag) { + usleep(50); + startmousekey(0); } - } else if (click) { - buttondown(click); - buttonup(click); - } - if (click) stats(hits, moves); - - // loop back if in drag mode - if (drag) { - usleep(50); - startmousekey(0); - } - - // re-enable trigger keygrabs - grab(KEY_TRIGGER, TRIGGERMASK); - grab(KEY_UNDO, TRIGGERMASK); + // re-enable trigger keygrabs + grab(KEY_TRIGGER, TRIGGERMASK); + grab(KEY_UNDO, TRIGGERMASK); } int main(int argc, char **argv) { - char *pcDisplay; - - if ((dpy = XOpenDisplay(pcDisplay = getenv("DISPLAY"))) == NULL) { + char *pcDisplay; + + if ((dpy = XOpenDisplay(pcDisplay = getenv("DISPLAY"))) == NULL) { fprintf(stderr,"Error: Can't open display: %s", pcDisplay); exit(1); - } - fprintf(stderr,"Display: %s\n", pcDisplay); + } + fprintf(stderr,"Display: %s\n", pcDisplay); - // parse options - if (argc > 1) - if (argv[1][0] && argv[1][0] == '-') - if (argv[1][1] && argv[1][1] == 'n') { - ninegrid_default = 1; - fprintf(stderr,"nine-grid default mode \n"); - if (argv[2]) { - ninegrid_n_switch = atoi(argv[2]); - fprintf(stderr,"nine-grid autoswitch num: %d \n", ninegrid_n_switch); - } - } + // parse options + if (argc > 1) + if (argv[1][0] && argv[1][0] == '-') + if (argv[1][1] && argv[1][1] == 'n') { + ninegrid_default = 1; + fprintf(stderr,"nine-grid default mode \n"); + if (argv[2]) { + ninegrid_n_switch = atoi(argv[2]); + fprintf(stderr,"nine-grid autoswitch num: %d \n", ninegrid_n_switch); + } + } - root = XDefaultRootWindow(dpy); - XGetWindowAttributes(dpy, root, &attr); - - // these are the trigger keygrabs - grab(KEY_TRIGGER, TRIGGERMASK); - grab(KEY_UNDO, TRIGGERMASK); - - while (1) { + root = XDefaultRootWindow(dpy); + XGetWindowAttributes(dpy, root, &attr); + + // these are the trigger keygrabs + grab(KEY_TRIGGER, TRIGGERMASK); + grab(KEY_UNDO, TRIGGERMASK); + + while (1) { XEvent e; XNextEvent(dpy, &e); if (e.type == KeyPress) - if (chk_keysym(XKeycodeToKeysym(dpy, e.xkey.keycode, 0), KEY_UNDO)) - startmousekey(1); - else - startmousekey(0); - } + if (chk_keysym(XKeycodeToKeysym(dpy, e.xkey.keycode, 0), KEY_UNDO)) + startmousekey(1); + else + startmousekey(0); + } }