Opws merikoi kserete, edw kai dyo bdomades talaipwroymai me RSI. Diabazontas gia ayto, synanthsa thn ennoia toy "click-less mouse use", dhladh na mh xreiazetai na kaneis click kathe ligo kai ligaki. To dokimasa kai enthoysiasthka! Poly boliko! Opote shmera poy antexa na plhktrologhsw ligo, ekatsa ki egrapsa ena aplo programma gia X11 poy kanei aytomata click otan to pontiki menei akinhto gia ligo (.5 sec). H logikh einai oti *synhthws* koynas to pontiki gia na to pas kapoy kai na kaneis click -- e, ayto to click sto glytwnei. Den einai gia panta, alla moy einai xrhsimo gia megalo meros ths meras moy... Attached the source code. Just compile & run. Fancy stuff, like GUI or command-like options for specifying granularity, etc. will have to wait a later version, when I can type better. Try it and you'll be amazed! Paraklhsh: an kapoios kserei apo programmatismo Windows, tha ektimoysa ta megista ena antistoixo programma -- pros to paron boleyomai me to demo toy Nib: http://www.aerobicmouse.com/software-overview/nib/ Prosexete thn ygeia sas! -- -- zvr -- -- +---------------------------+ Alexios Zavras (-zvr-) | H eytyxia den exei enoxes | zvr [ at ] zvr [ dot ] gr +-----------------------zvr-+
/* * mclick -- click the left mousebutton whenever the cursor pauses */ /* * Copyright (c) 2007, Alexios Zavras <zvr [ at ] zvr [ dot ] gr> * Last modified by zvr on: Wed 09 May 2007 (day 129) 12:15:02 [20070509.121502] */ /* * Compile with: gcc -O3 -o mclick mclick.c -lXtst -lXt */ #include <X11/Shell.h> #include <X11/extensions/XTest.h> #define CHECK_EVERY 100 /* milliseconds */ #define STATIONARY 5 /* consecutive checks without movement */ XtAppContext ctx; Display * dpy; int cursor_moved_or_button_pressed(void) { Window root; Window child; int root_x; int root_y; int win_x; int win_y; unsigned int mask; int ret = 0; static Window prev_root = -1; static int prev_root_x = -1; static int prev_root_y = -1; #define CHECK_SAME(v) do { \ if (v != prev_ ## v) ret = 1; prev_ ## v = v; \ } while (0) #define CHECK_BUTTON(n) do { \ if (mask & Button ## n ## Mask) ret = 1; \ } while (0) XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child, &root_x, &root_y, &win_x, &win_y, &mask); CHECK_SAME(root); CHECK_SAME(root_x); CHECK_SAME(root_y); CHECK_BUTTON(1); CHECK_BUTTON(2); CHECK_BUTTON(3); CHECK_BUTTON(4); CHECK_BUTTON(5); return(ret); #undef CHECK_SAME #undef CHECK_BUTTON } void click(void) { XTestFakeButtonEvent(dpy, 1, True, CurrentTime); XTestFakeButtonEvent(dpy, 1, False, CurrentTime); XFlush(dpy); } void check(XtPointer closure, XtIntervalId *id) { static int cnt = 0; static int clicked = 0; cnt++; if (cursor_moved_or_button_pressed()) clicked = cnt = 0; if (!clicked && cnt >= STATIONARY) cnt = 0, click(), clicked++; XtAppAddTimeOut(ctx, CHECK_EVERY, (XtTimerCallbackProc) check, NULL); } int main(int argc, char ** argv) { Widget top; top = XtOpenApplication(&ctx, "MClick", NULL, 0, &argc, argv, NULL, applicationShellWidgetClass, NULL, 0); dpy = XtDisplay(top); XtAppAddTimeOut(ctx, CHECK_EVERY, (XtTimerCallbackProc) check, NULL); XtAppMainLoop(ctx); }