From 422be6425b61457d8122b6e9ebe5e05ea241b380 Mon Sep 17 00:00:00 2001 From: tissoire Date: Wed, 30 Jan 2008 13:42:07 +0000 Subject: Inversion des ~v~nements 'move' et 'click' --- src/ivypointer.c | 202 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 72 deletions(-) (limited to 'src/ivypointer.c') diff --git a/src/ivypointer.c b/src/ivypointer.c index 95ade81..55b9343 100644 --- a/src/ivypointer.c +++ b/src/ivypointer.c @@ -26,9 +26,17 @@ # include # include # include +//# include +//# include # define XK_MISCELLANY # define XK_XKB_KEYS # include +# ifndef IsXExtensionKeyboard +# define IsXExtensionKeyboard 3 +# endif +# ifndef IsXExtensionPointer +# define IsXExtensionPointer 4 +# endif # if HAVE_X11_EXTENSIONS_XTEST_H # include # else @@ -70,6 +78,7 @@ #define TIME_BETWEEN_CLICK 200 Display* display = NULL; +XDevice* device = NULL; int width,height; float coords_input[4] = {0.0,0.0,100.0,100.0}; int width_input,height_input, offsetx, offsety; @@ -77,6 +86,9 @@ int width_input,height_input, offsetx, offsety; int dragged = 0; int relative = 0; +int champX = 1; +int champY = 2; + Display* openDisplay(const char* displayName) { @@ -125,6 +137,41 @@ openDisplay(const char* displayName) } #endif +// XDeviceInfo* devices; +// int devicecount; +// +// devices = XListInputDevices(display, &devicecount); +//// printf("there are %d available devices :\n",devicecount); +// while(devicecount) +// { +// XDeviceInfo* currDevice; +// +// currDevice = &devices[--devicecount]; +// switch(currDevice->use){ +// case IsXPointer: +// printf("xpointer id=%d\n",(int)currDevice->id); +// device = XOpenDevice(display, currDevice->id); +// if (device == NULL) { +// printf("EE : can't open device \"%d\"\n", (int)currDevice->id); +// return NULL; +// // throw XScreenUnavailable(60.0); +// } +// break; +// case IsXKeyboard: +// printf("xkeyboard id=%d\n",(int)currDevice->id); +// break; +// case IsXExtensionDevice: +// printf("xextensiondevice id=%d\n",(int)currDevice->id); +// break; +// case IsXExtensionKeyboard: +// printf("XExtensionKeyboard id=%d\n",(int)currDevice->id); +// break; +// case IsXExtensionPointer: +// printf("XExtensionPointer id=%d\n",(int)currDevice->id); +// break; +// } +// } + return display; } @@ -287,82 +334,86 @@ void CallbackButton (IvyClientPtr app, void *user_data, int argc, char *argv[]) // -------------------------------------------------------------------------- void CallbackPointer (IvyClientPtr app, void *user_data, int argc, char *argv[]) { -// char *id = argv[0]; - float x = atof(argv[1]); - float y = atof(argv[2]); - int time = atoi(argv[11]); - int presure = atoi(argv[3]); - static float old_x = 0; - static float old_y = 0; - static int old_time = 0; - static int should_click = 0; - static int clicked = 0; - if (dragged && presure==0){ - fakeMouseButton(1,0); - dragged = 0; - } - if (!relative) { - if (!dragged && presure>0){ - fakeMouseButton(1,1); - dragged = 1; - } - } -// printf("x = %f,y = %f; ",x,y); - if (valid(x,y)){ - x = offsetx + (x-coords_input[0])*width/width_input; - y = offsety + (y-coords_input[1])*height/height_input; -// printf("x = %f,y = %f\n",x,y); - if (!relative) { - fakeMouseMove((int)x,(int)y); - } else { - int dx = (int)(x-old_x); - int dy = (int)(y-old_y); - int dt = time-old_time; + // char *id = argv[0]; + float x = atof(argv[champX]); // predicted position + float y = atof(argv[champY]); // predicted position + int time = atoi(argv[11]); + int presure = atoi(argv[3]); + static float old_x = 0; + static float old_y = 0; + static int old_time = 0; + static int should_click = 0; + static int clicked = 0; + if (!valid(x,y)){ + // ignore outside events + return; + } + // printf("x = %f,y = %f; ",x,y); + x = offsetx + (x-coords_input[0])*width/width_input; + y = offsety + (y-coords_input[1])*height/height_input; + + + if (!relative) { + //absolute mode + fakeMouseMove((int)x,(int)y); + if (!dragged && presure>0){ + fakeMouseButton(1,1); + dragged = 1; + } + } else { + //relative mode + int dx = (int)(x-old_x); + int dy = (int)(y-old_y); + int dt = time-old_time; // if (old_time) // printf("time=%d, old_time=%d, dt=%d\n",time, old_time, dt); - if (presure > 0) { - if (!should_click){ - old_time = time; - dt = 0; - should_click = 1; -// printf("armement du timeout\n"); + if (presure > 0) { + if (!should_click){ + old_time = time; + dt = 0; + should_click = 1; +// printf("armement du timeout\n"); + } else { + if (should_click ==1 && dt > TIME_CLICK){ + should_click = 2; +// printf("timeout\n"); + } + } + fakeMouseRelativeMove(dx,dy); } else { - if (should_click ==1 && dt > TIME_CLICK){ - should_click = 2; -// printf("timeout\n"); - } - } - fakeMouseRelativeMove(dx,dy); - } else { - if (should_click == 1) { -// printf("dt = %d\n",dt); - if (clicked) { - //double click -// printf("ck\n"); - fakeMouseButton(1,0); - } -// printf("cli\n"); - clicked = 1; - old_time = time; - fakeMouseButton(1,1); - } - should_click = 0; - if (clicked) { - if (dt > TIME_BETWEEN_CLICK){ -// printf("ck\n"); - fakeMouseButton(1,0); - clicked = 0; + if (should_click == 1) { +// printf("dt = %d\n",dt); + if (clicked) { + //double click +// printf("ck\n"); + fakeMouseButton(1,0); + } +// printf("cli\n"); + clicked = 1; + old_time = time; + fakeMouseButton(1,1); + } + should_click = 0; + if (clicked) { + if (dt > TIME_BETWEEN_CLICK){ +// printf("ck\n"); + fakeMouseButton(1,0); + clicked = 0; + } + } else { + old_time = 0; } - } else { - old_time = 0; } - } } - old_x = x; - old_y = y; -// } else { -// printf("bad event\n"); - } + + // release (common of both modes) + if (dragged && presure==0){ + fakeMouseButton(1,0); + dragged = 0; + } + + old_x = x; + old_y = y; } void CallbackPad (IvyClientPtr app, void *user_data, int argc, char *argv[]) { @@ -400,6 +451,7 @@ void printHelpMsg(const char *name){ "\t-c x0,y0,x1,y1\tspecify the coords of the input used (only used with wacom)\n" "\t-C x0,y0,x1,y1\tspecify the coords of the screen used\n" "\t-r\tuse relative mode by default\n" + "\t-p\tuse predictive mode\n" "\t-v\t\tprints the ivy relase number\n\n" ; printf("usage: %s %s",name,helpmsg); @@ -451,7 +503,7 @@ int main(int argc, char *argv[]) { int coordsI[4] = {0,0,0,0}; int coordsO[4] = {0,0,0,0}; int c; - while ((c = getopt(argc, argv, "vb:wc:C:r")) != EOF) + while ((c = getopt(argc, argv, "vb:wc:C:rp")) != EOF) switch (c) { case 'b': strcpy (busbuf, optarg); @@ -466,6 +518,10 @@ int main(int argc, char *argv[]) { case 'w': wacom = 1; break; + case 'p': + champX = 7; + champY = 8; + break; case 'c': user_coordsI = extractValues(optarg, coordsI, argv[0]); break; @@ -511,7 +567,9 @@ int main(int argc, char *argv[]) { printf("screen : %d+%d x %d+%d\n",offsetx,width,offsety,height); // verifications - if (width < 2 || height < 2 || width_input < 2 || height_input < 2){ + if (width < 2 || height < 2 || (wacom && (width_input < 2 || height_input < 2))){ + print_coords_input(); + printf("%d %d %d %d\n",width,height,width_input,height_input); printHelpMsg(argv[0]); exit(1); } -- cgit v1.1