From aa4074251fa6135f65687b39cf11e1432208846c Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Thu, 18 Jun 2020 14:34:58 +0200 Subject: [PATCH] input: Add new hook DeviceSendEventsProc for XTEST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For Xwayland, we need to be able to send the events that would normally be processed by the normal Xserver event processing to be forwarded to the Wayland compositor (somehow). Add a new hook “DeviceSendEventsProc” attached to the device so that Xwayland can implement its own routine instead of the “normal” XTEST implementation which generates and processes X input events. Signed-off-by: Olivier Fourdan --- Xext/xtest.c | 55 ++++++++++++++++++++++++++++------------------ include/input.h | 6 +++++ include/inputstr.h | 1 + 3 files changed, 41 insertions(+), 21 deletions(-) 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;