/* $XConsortium: XSendEv.c,v 1.4 94/02/21 10:40:37 rws Exp $ */ /************************************************************************ * * XSendEv.c. * This program does the following: * - opens all extension input devices * - creates a test window and selects input from those devices in * that window. * - warps the pointer to that window. * - uses XSendExtensionEvent to send all valid extension events to * that window as if they had come from the extension * input devices. * - compares the contents of extension events it receives to what it sent. * */ #include #include #include #include "stdio.h" #define NOPRINT 0 #define PRINTTITLE 1 #define PRINT 2 #define XGetExtensionVersion_code 1 #define XListInputDevices_code 2 #define XOpenDevice_code 3 #define XCloseDevice_code 4 #define XSetDeviceMode_code 5 #define XSelectExtensionEvent_code 6 #define XGetSelectedExtensionEvents_code 7 #define XChangeDeviceDontPropagateList_code 8 #define XGetDeviceDontPropagateList_code 9 #define XGetDeviceMotionEvents_code 10 #define XChangeKeyboardDevice_code 11 #define XChangePointerDevice_code 12 #define XGrabDevice_code 13 #define XUngrabDevice_code 14 #define XGrabDeviceKey_code 15 #define XUngrabDeviceKey_code 16 #define XGrabDeviceButton_code 17 #define XUngrabDeviceButton_code 18 #define XAllowDeviceEvents_code 19 #define XGetDeviceFocus_code 20 #define XSetDeviceFocus_code 21 #define XGetFeedbackControl_code 22 #define XChangeFeedbackControl_code 23 #define XGetDeviceKeyMapping_code 24 #define XChangeDeviceKeyMapping_code 25 #define XGetDeviceModifierMapping_code 26 #define XSetDeviceModifierMapping_code 27 #define XGetDeviceButtonMapping_code 28 #define XSetDeviceButtonMapping_code 29 #define XQueryDeviceState_code 30 char *ext_errors[] = {"BadDevice","BadEvent","BadMode","DeviceBusy","BadClass"}; char *std_errors[] = {"Success","BadRequest","BadValue","BadWindow","BadPixmap", "BadAtom","BadCursor","BadFont","BadMatch","BadDrawable", "BadAccess","BadAlloc","BadColor","BadGC","BadIDChoice", "BadName","BadLength","BadImplementation"}; char *extfuncs[] = {"undefined", "GetExtensionVersion","ListInputDevices", "OpenDevice", "CloseDevice","SetDeviceMode","SelectExtensionEvent", "GetSelectedExtensionEvents", "ChangeDeviceDontPropagateList", "GetDeviceDontPropagateList","GetDeviceMotionEvents", "ChangeKeyboardDevice", "ChangePointerDevice","GrabDevice","UngrabDevice", "GrabDeviceKey", "UngrabDeviceKey","GrabDeviceButton","UngrabDeviceButton", "AllowDeviceEvents", "GetDeviceFocus","SetDeviceFocus", "GetFeedbackControl", "ChangeFeedbackControl","GetDeviceKeyMapping","ChangeDeviceKeyMapping", "GetDeviceModifierMapping","SetDeviceModifierMapping","GetDeviceButtonMapping", "SetDeviceButtonMapping","QueryDeviceState"}; int Dflag = 0; int gstatus; int expect = Success; int error_code; int major_code; int first_err; Time currenttime; int devicekeypress; int devicekeyrelease; int devicebuttonpress; int devicebuttonrelease; int devicemotionnotify; int devicefocusin; int devicefocusout; int proximityin; int proximityout; int devicemappingnotify; int devicestatenotify; int changedevicenotify; struct classes { int valid; XEventClass class[15]; } class[256]; int ndevices; XEvent savev[16]; XDeviceInfoPtr savlist[256]; XDevice *sdev[256]; main(argc,argv) int argc; char *argv[]; { int i,j; char *name; Display *display; Window root, my, my2, my3; XDeviceInfoPtr list_input_devices (); XDeviceInfoPtr list, slist; XInputClassInfo *ip; XEvent event; name = argv[0]; display = XOpenDisplay (""); if (display == NULL) { printf ("No connection to server - aborting test.\n"); exit(1); } root = RootWindow (display,0); init_error_handler (display); create_window (display, root, &my); XSelectInput (display, my, PointerMotionMask | EnterWindowMask); XSync (display,0); XWarpPointer (display, None, my, 0, 0, 200, 200, 10, 10); XSync (display,0); process_events (display, NOPRINT); slist = list_input_devices (display, &ndevices); list = slist; open_all_devices (display, list, ndevices, my); for (i=0; iuse != IsXPointer && list->use != IsXKeyboard) select_all_input (display, my, list->name, sdev[i]); list = slist; for (i=0; iuse != IsXPointer && list->use != IsXKeyboard) { send_any_event (display, list->name, sdev[i], savlist[i], my,root); } while (XPending (display) > 0) { XSync (display,0); XNextEvent (display,&event); process_device_events (&event, PRINT); } close_input_devices (display, sdev, ndevices); if (gstatus == 0) printf ("Test of XSendExtensionEvent completed successfully.\n"); else printf ("Test of XSendExtensionEvent failed.\n"); } /****************************************************************** * * This function closes all open input devices. * */ close_input_devices (display, devices, count) Display *display; XDevice *devices[]; int count; { int i; for (i=2; iid); printf ("type is %d\n",list->type); printf ("name is %s\n",list->name); printf ("num_classes is %d\n\n",list->num_classes); } if (list->num_classes > 0) { any = (XAnyClassPtr) (list->inputclassinfo); for (j=0; jnum_classes; j++) { if (Dflag) { printf ("input class is %d\n", any->class); printf ("length is %d\n", any->length); } switch (any->class) { case KeyClass: { K = (XKeyInfoPtr) any; if (Dflag) { printf ("num_keys is %d\n",K->num_keys); printf ("min_keycode is %d\n",K->min_keycode); printf ("max_keycode is %d\n\n",K->max_keycode); } } break; case ButtonClass: { b = (XButtonInfoPtr) any; if (Dflag) printf ("num_buttons is %d\n\n",b->num_buttons); } break; case ValuatorClass: v = (XValuatorInfoPtr) any; a = (XAxisInfoPtr) ((char *) v + sizeof (XValuatorInfo)); if (Dflag) printf ("num_axes is %d\n\n",v->num_axes); for (k=0; knum_axes; k++,a++) { if (Dflag) { printf ("min_value is %d\n",a->min_value); printf ("max_value is %d\n",a->max_value); printf ("resolution is %d\n\n",a->resolution); } } break; default: printf ("unknown class\n"); } any = (XAnyClassPtr) ((char *) any + any->length); } } } return (slist); } /****************************************************************** * * This function finds input class information of a given class. * */ XAnyClassPtr FindInputClass (list, class) XDeviceInfoPtr list; int class; { int i; XAnyClassPtr any; any = (XAnyClassPtr) (list->inputclassinfo); for (i=0; inum_classes; i++) { if (any->class == class) return (any); any = (XAnyClassPtr) ((char *) any + any->length); } } /****************************************************************** * * This function opens all extension input devices. * */ open_all_devices (display, list, ndevices, win) Display *display; XDeviceInfoPtr list; int ndevices; Window win; { int valid; int i,j; XDevice *dev; XDevice *XOpenDevice(); XInputClassInfo *ip; for (i=0; iuse != IsXPointer && list->use != IsXKeyboard) { dev = XOpenDevice (display, list->id); sdev[i] = dev; if (Dflag) printf ("\nOpened device %s id is %d\n", list->name, dev->device_id); for (ip= dev->classes, j=0; jnum_classes; j++, ip++) { if (Dflag) { printf ("class is %d\n",ip->input_class); printf ("event type base is %x\n\n",ip->event_type_base); } if (ip->input_class == KeyClass) { XDeviceKeyEvent *kev = (XDeviceKeyEvent *) &(savev[i]); valid = class[dev->device_id].valid++; DeviceKeyPress (dev, devicekeypress, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; DeviceKeyRelease (dev, devicekeyrelease, class[dev->device_id].class[valid]); kev->type = devicekeypress; kev->state = 0; kev->keycode = 0xd; kev->axes_count = 0; kev->window = win; kev->x_root = 160; kev->y_root = 160; kev->deviceid = list->id; kev->time = currenttime; if (Dflag) { printf ("DeviceKeyPress reports: type=%x class=%x\n", devicekeypress, class[dev->device_id].class[valid]); printf ("DeviceKeyRelease reports: type=%x class=%x\n", devicekeyrelease, class[dev->device_id].class[valid]); printf("\n"); } } else if (ip->input_class == ButtonClass) { XDeviceButtonEvent *bev =(XDeviceButtonEvent *) &(savev[i]); valid = class[dev->device_id].valid++; DeviceButtonPress (dev, devicebuttonpress, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; DeviceButtonRelease (dev, devicebuttonrelease, class[dev->device_id].class[valid]); bev->type = devicebuttonpress; bev->state = 0; bev->button = 1; bev->axes_count = 0; bev->window = win; bev->x_root = 160; bev->y_root = 160; bev->deviceid = list->id; bev->time = currenttime; if (Dflag) { printf ("DeviceButtonPress reports: type=%x class=%x\n", devicebuttonpress, class[dev->device_id].class[valid-1]); printf ("DeviceButtonRelease: type=%x class=%x\n", devicebuttonrelease, class[dev->device_id].class[valid]); printf("\n"); } } else if (ip->input_class == ValuatorClass) { valid = class[dev->device_id].valid++; DeviceMotionNotify (dev, devicemotionnotify, class[dev->device_id].class[valid]); if (Dflag) printf ("DeviceMotionNotify: type=%x class=%x\n", devicemotionnotify, class[dev->device_id].class[valid]); } else if (ip->input_class == FocusClass) { valid = class[dev->device_id].valid++; DeviceFocusIn (dev, devicefocusin, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; DeviceFocusOut (dev, devicefocusout, class[dev->device_id].class[valid]); if (Dflag) { printf ("DeviceFocusIn: type=%x class=%x\n", devicefocusin, class[dev->device_id].class[valid-1]); printf ("DeviceFocusOut: type=%x class=%x\n", devicefocusout, class[dev->device_id].class[valid]); } } else if (ip->input_class == ProximityClass) { valid = class[dev->device_id].valid++; ProximityIn (dev, proximityin, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; ProximityOut (dev, proximityout, class[dev->device_id].class[valid]); if (Dflag) { printf ("ProximityIn: type=%x class=%x\n", proximityin, class[dev->device_id].class[valid-1]); printf ("ProximityOut: type=%x class=%x\n", proximityout, class[dev->device_id].class[valid]); } } else if (ip->input_class == OtherClass) { valid = class[dev->device_id].valid++; DeviceMappingNotify (dev, devicemappingnotify, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; DeviceStateNotify (dev, devicestatenotify, class[dev->device_id].class[valid]); valid = class[dev->device_id].valid++; ChangeDeviceNotify (dev, changedevicenotify, class[dev->device_id].class[valid]); if (Dflag) { printf ("DeviceMappingNotify: type=%x class=%x\n", devicemappingnotify, class[dev->device_id].class[valid-2]); printf ("DeviceStateNotify: type=%x class=%x\n", devicestatenotify, class[dev->device_id].class[valid-1]); printf ("ChangeDeviceNotify: type=%x class=%x\n", changedevicenotify, class[dev->device_id].class[valid]); } } } } } /****************************************************************** * * This function selects all available input from an extension * device. * */ select_all_input (display, win, name, dev) Display *display; Window win; char *name; XDevice *dev; { int i, j; int status = 0; int this_client_count; int all_clients_count; XEventClass *this_client; XEventClass *all_clients; if (Dflag) printf ("Selecting input from %s.\n", name); XSelectExtensionEvent (display, win, &(class[dev->device_id].class[0]), class[dev->device_id].valid); XGetSelectedExtensionEvents (display, win, &this_client_count, &this_client, &all_clients_count, &all_clients); for (i=0; i<2; i++) { for (j=0; jdevice_id].class[i]) break; if (j==this_client_count) status = -1; } if (Dflag) { printf ("This_client_count is %d, all_clients_count is %d\n", this_client_count, all_clients_count); for (i=0; itype = devicekeypress; kev->serial = 1; kev->send_event = 0; kev->display = display; kev->root = root; kev->x = 10; kev->y = 10; kev->same_screen = 1; kev->subwindow = win; kev->deviceid = dev->device_id; kev->state = 0; kev->keycode = 0xd; kev->axes_count = 0; kev->window = win; kev->x_root = 160; kev->y_root = 160; kev->time = currenttime; kev->device_state = 1; kev->axes_count = 6; kev->first_axis = 0; for (i=0; i<6; i++) kev->axis_data[i] = i; for (i=0,p1=(char *) bev; itype = devicebuttonpress; bev->deviceid = dev->device_id; bev->state = 0; bev->serial = 1; bev->send_event = 0; bev->display = display; bev->root = root; bev->x = 10; bev->y = 10; bev->same_screen = 1; bev->subwindow = win; bev->button = 1; bev->axes_count = 0; bev->window = win; bev->x_root = 160; bev->y_root = 160; bev->time = currenttime; bev->device_state = 1; bev->axes_count = 6; bev->first_axis = 0; for (i=0; i<6; i++) bev->axis_data[i] = i; for (i=0,p1=(char *) mev; itype = devicemotionnotify; mev->deviceid = dev->device_id; mev->state = 0; mev->serial = 1; mev->send_event = 0; mev->display = display; mev->root = root; mev->x = 10; mev->y = 10; mev->same_screen = 1; mev->subwindow = win; mev->is_hint = 1; mev->axes_count = 0; mev->window = win; mev->x_root = 160; mev->y_root = 160; mev->time = currenttime; mev->device_state = 1; mev->axes_count = 6; mev->first_axis = 0; for (i=0; i<6; i++) mev->axis_data[i] = i; for (i=0,p1=(char *) pev; itype = proximityin; pev->deviceid = dev->device_id; pev->state = 0; pev->serial = 1; pev->send_event = 0; pev->display = display; pev->root = root; pev->x = 10; pev->y = 10; pev->same_screen = 1; pev->subwindow = win; pev->axes_count = 0; pev->window = win; pev->x_root = 160; pev->y_root = 160; pev->time = currenttime; pev->device_state = 1; pev->axes_count = 6; pev->first_axis = 0; for (i=0; i<6; i++) pev->axis_data[i] = i; for (i=0,p1=(char *) fev; itype = devicefocusin; fev->deviceid = dev->device_id; fev->serial = 1; fev->send_event = 0; fev->display = display; fev->window = win; fev->time = currenttime; fev->mode = NotifyGrab; fev->detail = NotifyPointerRoot; for (i=0,p1=(char *) Mev; itype = devicemappingnotify; Mev->deviceid = dev->device_id; Mev->serial = 1; Mev->send_event = 0; Mev->display = display; Mev->time = currenttime; Mev->first_keycode = 10; Mev->request = MappingKeyboard; Mev->count = 100; for (i=0,p1=(char *) cev; itype = changedevicenotify; cev->deviceid = dev->device_id; cev->serial = 1; cev->send_event = 0; cev->display = display; cev->time = currenttime; cev->request = NewKeyboard; for (i=0,p1=(char *) sev; itype = devicestatenotify; sev->deviceid = dev->device_id; sev->display = display; sev->time = currenttime; sev->num_classes = 2; xk = (XKeyStatus *) sev->data; xk-> class = KeyClass; xk-> length = sizeof (XKeyStatus); xk-> num_keys = 256; for (i=0; i<32; i++) xk->keys[i] = i; xv = (XValuatorStatus *) ++xk; xv-> class = ValuatorClass; xv-> length = sizeof (XValuatorStatus); xv-> num_valuators = 6; for (i=0; i<6; i++) xv->valuators[i] = i; any = (XAnyClassPtr) (info->inputclassinfo); for (i=0; inum_classes; i++) { switch (any->class) { case KeyClass: status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)kev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, kev, sizeof(XDeviceKeyEvent)); status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)sev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, sev, sizeof(XDeviceStateNotifyEvent)); break; case ValuatorClass: status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)mev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, mev, sizeof(XDeviceMotionEvent)); if (proximityin) { status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)pev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, pev, sizeof (XProximityNotifyEvent)); } break; case ButtonClass: status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)bev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, bev, sizeof (XDeviceButtonEvent)); break; } any = (XAnyClassPtr) ((char *) any + any->length); } status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)fev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, fev, sizeof (XDeviceFocusChangeEvent)); status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)Mev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, Mev, sizeof (XDeviceMappingEvent)); status = XSendExtensionEvent (display, dev, win, True, class[dev->device_id].valid, &class[dev->device_id].class[0], (XEvent *)cev); XSync (display, 0); if (status == 0) printf ("Event Conversion failed.\n"); else compare_events (display, cev, sizeof (XChangeDeviceNotifyEvent)); } compare_events (display, sendp, expect) Display *display; XEvent *sendp; int expect; { XEvent receive; int i, status; char *p1, *p2; while (XPending (display) > 0) { XNextEvent (display, &receive); p1 = (char *) sendp; p2 = (char *) &receive; for (i=0; i11)) break; if (i == expect) status = 0; else status = -1; } if (status != 0) { printf ("Sent and received events did not compare correctly.\n"); gstatus = status; } } /****************************************************************** * * This function displays the contents of extension events. * */ process_device_events (event, mode) XEvent *event; int mode; { int i, j; char *buf; XKeyStatus *kdata; XButtonStatus *bdata; XValuatorStatus *vdata; XDeviceKeyEvent *k; XDeviceButtonEvent *b; XDeviceMappingEvent *m; XDeviceMotionEvent *M; XDeviceFocusChangeEvent *f; XProximityNotifyEvent *p; XChangeDeviceNotifyEvent *c; XDeviceStateNotifyEvent *s; XInputClass *anyclass; if (event->type == MotionNotify) { XMotionEvent *mo; mo = (XMotionEvent * ) event; currenttime = mo->time; } else if (event->type == EnterNotify) { XEnterWindowEvent *en; en = (XEnterWindowEvent * ) event; currenttime = en->time; } else if (event->type == devicekeypress) { k = (XDeviceKeyEvent * ) event; if (mode > NOPRINT) printf ("Device key press event device=%d\n", k->deviceid); if (mode == PRINT) { printf (" type = %d\n", k->type); printf (" serial = %ld\n", k->serial); printf (" send_event = %ld\n", k->send_event); printf (" display = %x\n", k->display); printf (" window = %x\n", k->window); printf (" root = %x\n", k->root); printf (" subwindow = %x\n", k->subwindow); printf (" time = %x\n", k->time); printf (" x = %d\n", k->x); printf (" y = %d\n", k->y); printf (" x_root = %d\n", k->x_root); printf (" y_root = %d\n", k->y_root); printf (" state = %d\n", k->state); printf (" keycode = %x\n", k->keycode); printf (" same_screen = %d\n", k->same_screen); printf (" first_axis = %d\n", k->first_axis); printf (" axes_count = %d\n", k->axes_count); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, k->axis_data[i]); } if (k->keycode == 0xd) return (-1); } else if (event->type == devicekeyrelease) { k = (XDeviceKeyEvent * ) event; if (mode > NOPRINT) printf ("Device key release event device=%d\n", k->deviceid); if (mode == PRINT) { printf (" type = %d\n", k->type); printf (" serial = %ld\n", k->serial); printf (" send_event = %ld\n", k->send_event); printf (" display = %x\n", k->display); printf (" window = %x\n", k->window); printf (" root = %x\n", k->root); printf (" subwindow = %x\n", k->subwindow); printf (" time = %x\n", k->time); printf (" x = %d\n", k->x); printf (" y = %d\n", k->y); printf (" x_root = %d\n", k->x_root); printf (" y_root = %d\n", k->y_root); printf (" state = %d\n", k->state); printf (" keycode = %x\n", k->keycode); printf (" same_screen = %d\n", k->same_screen); printf (" first_axis = %d\n", k->first_axis); printf (" axes_count = %d\n", k->axes_count); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, k->axis_data[i]); } if (k->keycode == 0xd) return (-1); } else if (event->type == devicebuttonpress) { b = (XDeviceButtonEvent * ) event; if (mode > NOPRINT) printf ("Device button press event device=%d\n", b->deviceid); if (mode == PRINT) { printf (" type = %d\n", b->type); printf (" serial = %ld\n", b->serial); printf (" send_event = %ld\n", b->send_event); printf (" display = %x\n", b->display); printf (" window = %x\n", b->window); printf (" root = %x\n", b->root); printf (" subwindow = %x\n", b->subwindow); printf (" time = %x\n", b->time); printf (" x = %d\n", b->x); printf (" y = %d\n", b->y); printf (" x_root = %d\n", b->x_root); printf (" y_root = %d\n", b->y_root); printf (" state = %d\n", b->state); printf (" button = %x\n", b->button); printf (" same_screen = %d\n", b->same_screen); printf (" first_axis = %d\n", b->first_axis); printf (" axes_count = %d\n", b->axes_count); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, b->axis_data[i]); } } else if (event->type == devicebuttonrelease) { b = (XDeviceButtonEvent * ) event; if (mode > NOPRINT) printf ("Device button release event device=%d\n", b->deviceid); if (mode == PRINT) { printf (" type = %d\n", b->type); printf (" serial = %ld\n", b->serial); printf (" send_event = %ld\n", b->send_event); printf (" display = %x\n", b->display); printf (" window = %x\n", b->window); printf (" root = %x\n", b->root); printf (" subwindow = %x\n", b->subwindow); printf (" time = %x\n", b->time); printf (" x = %d\n", b->x); printf (" y = %d\n", b->y); printf (" x_root = %d\n", b->x_root); printf (" y_root = %d\n", b->y_root); printf (" state = %d\n", b->state); printf (" button = %x\n", b->button); printf (" same_screen = %d\n", b->same_screen); printf (" first_axis = %d\n", b->first_axis); printf (" axes_count = %d\n", b->axes_count); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, b->axis_data[i]); } } else if (event->type == devicemotionnotify) { M = (XDeviceMotionEvent * ) event; if (mode > NOPRINT) printf ("Device motion event device=%d\n", M->deviceid); if (mode == PRINT) { printf (" type = %d\n", M->type); printf (" serial = %ld\n", M->serial); printf (" send_event = %ld\n", M->send_event); printf (" display = %x\n", M->display); printf (" window = %x\n", M->window); printf (" root = %x\n", M->root); printf (" subwindow = %x\n", M->subwindow); printf (" time = %x\n", M->time); printf (" x = %d\n", M->x); printf (" y = %d\n", M->y); printf (" x_root = %d\n", M->x_root); printf (" y_root = %d\n", M->y_root); printf (" state = %d\n", M->state); printf (" is_hint = %x\n", M->is_hint); printf (" same_screen = %d\n", M->same_screen); printf (" axes_count = %d\n", M->axes_count); printf (" first_axis = %d\n", M->first_axis); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, M->axis_data[i]); } } else if (event->type == devicefocusin || event->type == devicefocusout) { f = (XDeviceFocusChangeEvent * ) event; if (mode > NOPRINT) printf ("Device focus event device=%d\n", f->deviceid); if (mode == PRINT) { printf (" type = %d\n", f->type); printf (" serial = %ld\n", f->serial); printf (" send_event = %ld\n", f->send_event); printf (" display = %x\n", f->display); printf (" window = %x\n", f->window); printf (" time = %x\n", f->time); printf (" mode = %x\n", f->mode); printf (" detail = %x\n", f->detail); } } else if (event->type == proximityin || event->type == proximityout) { p = (XProximityNotifyEvent * ) event; if (mode > NOPRINT) printf ("Device proximity event device=%d\n", p->deviceid); if (mode == PRINT) { printf (" type = %d\n", p->type); printf (" serial = %ld\n", p->serial); printf (" send_event = %ld\n", p->send_event); printf (" display = %x\n", p->display); printf (" window = %x\n", p->window); printf (" root = %x\n", p->root); printf (" subwindow = %x\n", p->subwindow); printf (" time = %x\n", p->time); printf (" x = %d\n", p->x); printf (" y = %d\n", p->y); printf (" x_root = %d\n", p->x_root); printf (" y_root = %d\n", p->y_root); printf (" state = %d\n", p->state); printf (" same_screen = %d\n", p->same_screen); printf (" axes_count = %d\n", p->axes_count); printf (" first_axis = %d\n", p->first_axis); for (i=0; iaxes_count; i++) printf (" axis_data[%d]= %d\n", i, p->axis_data[i]); } } else if (event->type == devicemappingnotify) { m = (XDeviceMappingEvent * ) event; if (mode > NOPRINT) printf ("Device mapping event device=%d\n", m->deviceid); if (mode == PRINT) { printf (" type = %d\n", m->type); printf (" serial = %ld\n", m->serial); printf (" send_event = %ld\n", m->send_event); printf (" display = %x\n", m->display); printf (" window = %x\n", m->window); printf (" time = %x\n", m->time); printf (" request = %x\n", m->request); printf (" first_keycode = %x\n", m->first_keycode); printf (" count = %x\n", m->count); } } else if (event->type == devicestatenotify) { s = (XDeviceStateNotifyEvent * ) event; if (mode > NOPRINT) printf ("Device state notify event device=%d\n", s->deviceid); if (mode == PRINT) { printf (" type = %d\n", s->type); printf (" serial = %ld\n", s->serial); printf (" send_event = %ld\n", s->send_event); printf (" display = %x\n", s->display); printf (" window = %x\n", s->window); printf (" time = %x\n", s->time); printf (" num_classes = %x\n", s->num_classes); printf (" data = %x\n", s->data); anyclass = (XInputClass *) s->data; for (i=0; inum_classes; i++) { switch (anyclass->class) { case KeyClass: kdata = (XKeyStatus *) anyclass; printf ("num_keys is %d\n",kdata->num_keys); for (j=0; jnum_keys/8; j++) printf ("%x ", *(kdata->keys+j)); printf ("\n"); anyclass = (XInputClass *) (++kdata); break; case ButtonClass: bdata = (XButtonStatus *) anyclass; printf ("num_buttons is %d\n",bdata->num_buttons); for (j=0; jnum_buttons/8; j++) printf ("%x ", *(bdata->buttons+j)); printf ("\n"); anyclass = (XInputClass *) (++bdata); break; case ValuatorClass: vdata = (XValuatorStatus *) anyclass; printf ("num_valuators is %d\n",vdata->num_valuators); for (j=0; jnum_valuators; j++) printf ("valuator %d has value %x\n", j, *(vdata->valuators+j)); anyclass = (XInputClass *) (++vdata); break; } } } } else if (event->type == changedevicenotify) { c = (XChangeDeviceNotifyEvent * ) event; if (mode > NOPRINT) printf ("Device change event device=%d\n", c->deviceid); if (mode == PRINT) { printf (" type = %d\n", c->type); printf (" serial = %ld\n", c->serial); printf (" send_event = %ld\n", c->send_event); printf (" display = %x\n", c->display); printf (" window = %x\n", c->window); printf (" time = %x\n", c->time); printf (" request = %x\n", c->request); } } else if (event->type == Expose) { if (mode > NOPRINT) printf ("Expose event\n"); return (-1); } else { buf = (char *) event; printf ("unknown event!\n"); for (i=0; i<32; i++) printf ("%x ",buf[i]); return (1); } return (0); } /*********************************************************************** * * This function initializes an X error handler. * */ init_error_handler (disp) Display *disp; { int event; int handle_x_errors(); XQueryExtension (disp, "XInputExtension", &major_code, &event, &first_err); XSetErrorHandler (handle_x_errors); } /*********************************************************************** * * This function handles X errors. * */ handle_x_errors (disp, error) Display *disp; XErrorEvent *error; { char buf[256]; if (error->request_code == major_code && error->minor_code == error_code && error->error_code == expect) if (error->error_code >= first_err && error->error_code <= first_err+4) { if (Dflag) printf ("%s returned %s correctly.\n", extfuncs[error->minor_code], ext_errors[error->error_code-first_err]); return; } else { if (Dflag) printf ("%s returned %s correctly.\n", extfuncs[error->minor_code], std_errors[error->error_code]); return; } if (error->request_code == major_code) printf (" Minor code=%s.\n",extfuncs[error->minor_code]); else printf (" Minor code=%d.\n",error->minor_code); if (error->error_code >= Success && error->error_code <= BadImplementation) printf (" Error code=%s.\n",std_errors[error->error_code]); else if (error->error_code >= first_err && error->error_code <= first_err+4) printf (" Error code=%s.\n",ext_errors[error->error_code-first_err]); else printf (" Error code=%d.\n",error->error_code); printf (" Resource id=%d.\n",error->resourceid); return (0); } process_events (display, mode) Display *display; int mode; { int ret; int count = 0; XEvent event; XSync (display,0); while (XPending (display) > 0) { XNextEvent (display,&event); process_device_events (&event, mode); count++; } }