diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ivypointer.c | 203 |
1 files changed, 118 insertions, 85 deletions
diff --git a/src/ivypointer.c b/src/ivypointer.c index 55b9343..6f72a60 100644 --- a/src/ivypointer.c +++ b/src/ivypointer.c @@ -12,6 +12,8 @@ * copyright notice regarding this software */ +//#define _MPX_ + #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -68,26 +70,36 @@ #define REGEXP_REL_MOVE "^TelepointerRelativeMotion Id=(.*) X=(.*) Y=(.*)" #define REGEXP_BUTTON "^TelepointerButton Id=(.*) Button=(.*) status=(.*)" -#define REGEXP_POINTER "^pointer_event device_id=(.*) x=(.*) y=(.*) presure=(.*) tilt_x=(.*) tilt_y=(.*) wheel=(.*) predicted_x=(.*) predicted_y=(.*) type=(.*) serial_number=(.*) time=(.*)" +#define REGEXP_POINTER "^pointer_event device_id=(.*) x=(.*) y=(.*) presure=(.*) tilt_x=(.*) tilt_y=(.*) wheel=(.*) predicted_x=(.*) predicted_y=(.*) type=(.*) serial_number=(.*) time=(.*) hires_x=(.*) hires_y=(.*) proximity=(.*)" #define REGEXP_PAD "^pad_event device_id=(.*) button=(.*) status=(.*) time=(.*)" #define REGEXP_SLIDER "^slider_event device_id=(.*) value=(.*) side=(.*) time=(.*)" +#define REGEXP_BUTTON_WACOM "^button_event device_id=(.*) button=(.*) status=(.*) x=(.*) y=(.*) presure=(.*) tilt_x=(.*) tilt_y=(.*) wheel=(.*) predicted_x=(.*) predicted_y=(.*) type=(.*) serial_number=(.*) time=(.*) hires_x=(.*) hires_y=(.*) proximity=(.*)" + #define WIDTH_WACOM 1600.0 #define HEIGHT_WACOM 1200.0 +//#define WIDTH_WACOM 1.0 +//#define HEIGHT_WACOM 1.0 #define TIME_CLICK 200 #define TIME_BETWEEN_CLICK 200 Display* display = NULL; -XDevice* device = NULL; -int width,height; +#ifdef _MPX_ +XDevice* dev = NULL; +//#else +//# error plop +#endif +float width,height; float coords_input[4] = {0.0,0.0,100.0,100.0}; -int width_input,height_input, offsetx, offsety; +float width_input,height_input, offsetx, offsety; int dragged = 0; int relative = 0; -int champX = 1; -int champY = 2; +//int champX = 1; +//int champY = 2; +int champX = 12; +int champY = 13; Display* openDisplay(const char* displayName) @@ -137,50 +149,19 @@ 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; } +XDevice *openDevice(Display * dpy, int id){ + return XOpenDevice(dpy, id); +} + // -------------------------------------------------------------------------- // tools // -------------------------------------------------------------------------- void print_coords_input(void){ - printf("coords of input : %.0f,%.0f %.0f,%.0f\n", coords_input[0], coords_input[1], coords_input[2], coords_input[3]); + printf("coords of input : %.2f,%.2f %.2f,%.2f\n", coords_input[0], coords_input[1], coords_input[2], coords_input[3]); } int valid(float x, float y) { @@ -208,10 +189,15 @@ int valid(float x, float y) { // -------------------------------------------------------------------------- void -fakeMouseButton(const unsigned int xButton, Bool press) +fakeMouseButton(const unsigned int xButton, Bool press, int x, int y) { if (xButton != 0) { - XTestFakeButtonEvent(display, xButton, press ? True : False, 0); +#ifndef _MPX_ + XTestFakeButtonEvent(display, xButton, press ? True : False, CurrentTime); +#else + int axes[2] = {x,y}; + XTestFakeDeviceButtonEvent(display, dev, xButton, press ? True : False, axes, 2, CurrentTime); +#endif XFlush(display); } } @@ -219,7 +205,13 @@ fakeMouseButton(const unsigned int xButton, Bool press) void fakeMouseMove(int x, int y) { +// printf("x = %d,y = %d;\n ",x,y); +#ifndef _MPX_ XTestFakeMotionEvent(display, DefaultScreen(display), x, y, CurrentTime); +#else + int axes[2] = {x,y}; + XTestFakeDeviceMotionEvent(display, dev, False, 0, axes, 2, CurrentTime); +#endif //XWarpPointer(display, None, RootWindow(display, 0), 0, 0, 0, 0, x, y); XFlush(display); } @@ -227,7 +219,12 @@ fakeMouseMove(int x, int y) void fakeMouseRelativeMove(int dx, int dy) { +#ifndef _MPX_ XTestFakeRelativeMotionEvent(display, dx, dy, CurrentTime); +#else + int axes[2] = {dx,dy}; + XTestFakeDeviceMotionEvent(display, dev, True, 0, axes, 2, CurrentTime); +#endif //XWarpPointer(display, None, None, 0, 0, 0, 0, dx, dy); XFlush(display); } @@ -265,9 +262,9 @@ void CallbackScreen(IvyClientPtr app, void *user_data, int argc, char *argv[]) { offsety = y0; width = x1-x0; height = y1-y0; - printf("screen : %d+%d x %d+%d\n",offsetx,width,offsety,height); + printf("screen : %f+%f x %f+%f\n",offsetx,width,offsety,height); } else { - printf("bad coords received : %.0f,%.0f %.0f,%.0f\n",x0,y0,x1,y1); + printf("bad coords received : %.2f,%.2f %.2f,%.2f\n",x0,y0,x1,y1); } } @@ -279,36 +276,37 @@ void CallbackMove (IvyClientPtr app, void *user_data, int argc, char *argv[]) { // printf ("%s sent (size : %d)",IvyGetApplicationName(app),argc); // for (i = 0; i < argc; i++) // printf(" '%s'",argv[i]); - if (dragged){ - fakeMouseButton(1,0); - dragged = 0; - } -// char *id = argv[0]; float x = atof(argv[1]); float y = atof(argv[2]); -// printf("x = %f,y = %f; ",x,y); x = x*width/100.0; y = y*height/100.0; +// char *id = argv[0]; +// printf("x = %f,y = %f; ",x,y); // printf("x = %f,y = %f\n",x,y); - if (valid(x,y)) - fakeMouseMove((int)x,(int)y); -// IvyUnbindMsg(*ptr); + if (valid(x,y)){ + fakeMouseMove((int)x,(int)y); + if (dragged){ + fakeMouseButton(1,0,x,y); + dragged = 0; + } + } } void CallbackDrag (IvyClientPtr app, void *user_data, int argc, char *argv[]) { - if (!dragged){ - fakeMouseButton(1,1); - dragged = 1; - } // char *id = argv[0]; float x = atof(argv[1]); float y = atof(argv[2]); x *= width/100.0; y *= height/100.0; // printf("x = %f,y = %f\n",x,y); - if (valid(x,y)) - fakeMouseMove((int)x,(int)y); + if (valid(x,y)){ + fakeMouseMove((int)x,(int)y); + if (!dragged){ + fakeMouseButton(1,1,x,y); + dragged = 1; + } + } } void CallbackRelMove (IvyClientPtr app, void *user_data, int argc, char *argv[]) { @@ -326,7 +324,7 @@ void CallbackButton (IvyClientPtr app, void *user_data, int argc, char *argv[]) int press = atoi(argv[2]); // if (!b) // return - fakeMouseButton(b,press); + fakeMouseButton(b,press,0,0); } // -------------------------------------------------------------------------- @@ -348,7 +346,7 @@ void CallbackPointer (IvyClientPtr app, void *user_data, int argc, char *argv[]) // ignore outside events return; } - // printf("x = %f,y = %f; ",x,y); +// printf("x = %f,y = %f;\n ",x,y); x = offsetx + (x-coords_input[0])*width/width_input; y = offsety + (y-coords_input[1])*height/height_input; @@ -357,7 +355,7 @@ void CallbackPointer (IvyClientPtr app, void *user_data, int argc, char *argv[]) //absolute mode fakeMouseMove((int)x,(int)y); if (!dragged && presure>0){ - fakeMouseButton(1,1); + fakeMouseButton(1,1,x,y); dragged = 1; } } else { @@ -386,18 +384,18 @@ void CallbackPointer (IvyClientPtr app, void *user_data, int argc, char *argv[]) if (clicked) { //double click // printf("ck\n"); - fakeMouseButton(1,0); + fakeMouseButton(1,0,x,y); } // printf("cli\n"); clicked = 1; old_time = time; - fakeMouseButton(1,1); + fakeMouseButton(1,1,x,y); } should_click = 0; if (clicked) { if (dt > TIME_BETWEEN_CLICK){ // printf("ck\n"); - fakeMouseButton(1,0); + fakeMouseButton(1,0,x,y); clicked = 0; } } else { @@ -408,7 +406,7 @@ void CallbackPointer (IvyClientPtr app, void *user_data, int argc, char *argv[]) // release (common of both modes) if (dragged && presure==0){ - fakeMouseButton(1,0); + fakeMouseButton(1,0,x,y); dragged = 0; } @@ -430,7 +428,7 @@ void CallbackPad (IvyClientPtr app, void *user_data, int argc, char *argv[]) { //inversion du mode relative = !relative; } else { - fakeMouseButton(b,press); + fakeMouseButton(b,press,0,0); } } @@ -444,10 +442,20 @@ void CallbackSlider (IvyClientPtr app, void *user_data, int argc, char *argv[]) // fakeMouseButton(b,press); } +void CallbackButtonWacom (IvyClientPtr app, void *user_data, int argc, char *argv[]) { +// char *id = argv[0]; + int b = atoi(argv[1]); + if (b == 1) // gestion propre du bouton 1 + return; + int press = strcmp(argv[2],"up"); + fakeMouseButton(b,press,0,0); +} + + void printHelpMsg(const char *name){ const char* helpmsg = "[options] [regexps]\n\t-b bus\t\tdefines the Ivy bus to which to connect to, defaults to 127:2010\n" - "\t-w\t\tuse data from xinput_wacom instead of ModeManager\n" + "\t-t\t\tuse data from ModeManager instead of xinput_wacom\n" "\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" @@ -457,11 +465,11 @@ void printHelpMsg(const char *name){ printf("usage: %s %s",name,helpmsg); } -int extractValues(char optarg[], int* output, const char name[]){ +int extractValues(char optarg[], float* output, const char name[]){ int i = 0; int j = 0; int last = 0; - int coupures[4] = {0,0,0,0}; + float coupures[4] = {0,0,0,0}; while(optarg[i]){ if (optarg[i] == ','){ @@ -484,7 +492,7 @@ int extractValues(char optarg[], int* output, const char name[]){ for (k = 0; k < length; k++) { buf[k] = optarg[last+k]; } - output[i] = atoi(buf); + output[i] = atof(buf); last = coupures[i]+1; } return 1; @@ -497,13 +505,15 @@ int extractValues(char optarg[], int* output, const char name[]){ int main(int argc, char *argv[]) { const char* bus = 0; char busbuf [1024] = ""; - int wacom = 0; - int user_coordsI = 0; - int user_coordsO = 0; - int coordsI[4] = {0,0,0,0}; - int coordsO[4] = {0,0,0,0}; + int wacom = 1; + int predictive_mode = 0; + float user_coordsI = 0; + float user_coordsO = 0; + float coordsI[4] = {0,0,0,0}; + float coordsO[4] = {0,0,0,0}; int c; - while ((c = getopt(argc, argv, "vb:wc:C:rp")) != EOF) + int id = -1; + while ((c = getopt(argc, argv, "vb:twc:C:rpd:")) != EOF) switch (c) { case 'b': strcpy (busbuf, optarg); @@ -516,11 +526,14 @@ int main(int argc, char *argv[]) { relative = 1; break; case 'w': - wacom = 1; + break; + case 't': + wacom = 0; break; case 'p': champX = 7; champY = 8; + predictive_mode = 1; break; case 'c': user_coordsI = extractValues(optarg, coordsI, argv[0]); @@ -528,7 +541,11 @@ int main(int argc, char *argv[]) { case 'C': user_coordsO = extractValues(optarg, coordsO, argv[0]); break; + case 'd': + id = atoi(optarg); + break; default: + printf("bad option : %s\n",(char*)&c); printHelpMsg(argv[0]); exit(1); } @@ -536,6 +553,15 @@ int main(int argc, char *argv[]) { if (!d){ return 1; } +#ifdef _MPX_ + if (id >=0){ + printf("opening device id=%d\n",id); + dev = openDevice(d,id); + if (!dev) { + printf("unable to open device id=%d\n",id); + } + } +#endif if (wacom) { if (user_coordsI){ @@ -544,8 +570,13 @@ int main(int argc, char *argv[]) { coords_input[i] = coordsI[i]; } } else { - coords_input[2] = WIDTH_WACOM; - coords_input[3] = HEIGHT_WACOM; + if (predictive_mode){ + coords_input[2] = WIDTH_WACOM; + coords_input[3] = HEIGHT_WACOM; + } else { + coords_input[2] = 1.0; + coords_input[3] = 1.0; + } } print_coords_input(); width_input = coords_input[2]-coords_input[0]; @@ -564,12 +595,12 @@ int main(int argc, char *argv[]) { height = DisplayHeight(d, DefaultScreen(d)); } - printf("screen : %d+%d x %d+%d\n",offsetx,width,offsety,height); + printf("screen : %.2f+%.2f x %.2f+%.2f\n",offsetx,width,offsety,height); // verifications - if (width < 2 || height < 2 || (wacom && (width_input < 2 || height_input < 2))){ + if (width < 2 || height < 2 ){//|| (wacom && (width_input < || height_input < 2))){ print_coords_input(); - printf("%d %d %d %d\n",width,height,width_input,height_input); + printf("%.2f %.2f %.2f %.2f\n",width,height,width_input,height_input); printHelpMsg(argv[0]); exit(1); } @@ -597,6 +628,8 @@ int main(int argc, char *argv[]) { // printf("bound to %s\n",REGEXP_SLIDER); ptrMove=IvyBindMsg(CallbackPad,&ptrButton,REGEXP_PAD); printf("bound to %s\n",REGEXP_PAD); + ptrMove=IvyBindMsg(CallbackButtonWacom,&ptrButton,REGEXP_BUTTON_WACOM); + printf("bound to %s\n",REGEXP_BUTTON_WACOM); } ptrMove=IvyBindMsg(CallbackScreen,&ptrMove,REGEXP_CHANGE_GEOMETRY_SCREEN); printf("bound to %s\n",REGEXP_CHANGE_GEOMETRY_SCREEN); |