diff --git a/Xext/xtest.c b/Xext/xtest.c index dde5c4cf9..5cb9e1e73 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -148,6 +148,35 @@ ProcXTestCompareCursor(ClientPtr client) return Success; } +static void +XTestDeviceSendEvents(DeviceIntPtr dev, + int type, + int detail, + int flags, + const ValuatorMask *mask) +{ + int nevents = 0; + int i; + + switch (type) { + case MotionNotify: + nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, mask); + break; + case ButtonPress: + case ButtonRelease: + nevents = GetPointerEvents(xtest_evlist, dev, type, detail, flags, mask); + break; + case KeyPress: + case KeyRelease: + nevents = + GetKeyboardEvents(xtest_evlist, dev, type, detail); + break; + } + + for (i = 0; i < nevents; i++) + mieqProcessDeviceEvent(dev, &xtest_evlist[i], miPointerGetScreen(inputInfo.pointer)); +} + static int ProcXTestFakeInput(ClientPtr client) { @@ -161,8 +190,6 @@ ProcXTestFakeInput(ClientPtr client) int valuators[MAX_VALUATORS] = { 0 }; int numValuators = 0; int firstValuator = 0; - int nevents = 0; - int i; int base = 0; int flags = 0; int need_ptr_update = 1; @@ -408,26 +435,9 @@ ProcXTestFakeInput(ClientPtr client) if (screenIsSaved == SCREEN_SAVER_ON) dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset); - switch (type) { - case MotionNotify: - valuator_mask_set_range(&mask, firstValuator, numValuators, valuators); - nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, &mask); - break; - case ButtonPress: - case ButtonRelease: - valuator_mask_set_range(&mask, firstValuator, numValuators, valuators); - nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail, - flags, &mask); - break; - case KeyPress: - case KeyRelease: - nevents = - GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail); - break; - } + valuator_mask_set_range(&mask, firstValuator, numValuators, valuators); - for (i = 0; i < nevents; i++) - mieqProcessDeviceEvent(dev, &xtest_evlist[i], miPointerGetScreen(inputInfo.pointer)); + (*dev->sendEventsProc) (dev, type, ev->u.u.detail, flags, &mask); if (need_ptr_update) miPointerUpdateSprite(dev); @@ -634,6 +644,9 @@ AllocXTestDevice(ClientPtr client, const char *name, XIGetKnownProperty(XI_PROP_XTEST_DEVICE), FALSE); XIRegisterPropertyHandler(*keybd, DeviceSetXTestProperty, NULL, NULL); + + (*ptr)->sendEventsProc = XTestDeviceSendEvents; + (*keybd)->sendEventsProc = XTestDeviceSendEvents; } free(xtestname); diff --git a/include/input.h b/include/input.h index cdb5d5a90..f50c9524b 100644 --- a/include/input.h +++ b/include/input.h @@ -191,6 +191,12 @@ typedef Bool (*PointerAccelSchemeInitProc) (DeviceIntPtr /*dev */ , struct _ValuatorAccelerationRec * /*protoScheme */ ); +typedef void (*DeviceSendEventsProc) (DeviceIntPtr /*dev */ , + int /* event type */ , + int /* detail, buttons or keycode */ , + int /* flags */ , + const ValuatorMask * /* valuators */ ); + typedef struct _DeviceRec { void *devicePrivate; ProcessInputProc processInputProc; /* current */ diff --git a/include/inputstr.h b/include/inputstr.h index ec11b39bb..24dd48841 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -628,6 +628,7 @@ typedef struct _DeviceIntRec { /* XTest related master device id */ int xtest_master_id; + DeviceSendEventsProc sendEventsProc; struct _SyncCounter *idle_counter; } DeviceIntRec;