From 0bf4123fd3bc945d150884e6ea38bd2b81c0994b Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sun, 30 May 2021 13:26:38 +0300 Subject: [PATCH] dix: Implement gesture event fixups before delivery --- dix/events.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/dix/events.c b/dix/events.c index 20a40ecb2..e2455a4bb 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2545,6 +2545,44 @@ FixUpXI2DeviceEventFromWindow(SpritePtr pSprite, int evtype, (pSprite->hot.pScreen == pWin->drawable.pScreen); } +static void +FixUpXI2PinchEventFromWindow(SpritePtr pSprite, xXIGesturePinchEvent *event, + WindowPtr pWin, Window child) +{ + event->root = RootWindow(pSprite)->drawable.id; + event->event = pWin->drawable.id; + + if (pSprite->hot.pScreen == pWin->drawable.pScreen) { + event->event_x = event->root_x - double_to_fp1616(pWin->drawable.x); + event->event_y = event->root_y - double_to_fp1616(pWin->drawable.y); + event->child = child; + } + else { + event->event_x = 0; + event->event_y = 0; + event->child = None; + } +} + +static void +FixUpXI2SwipeEventFromWindow(SpritePtr pSprite, xXIGestureSwipeEvent *event, + WindowPtr pWin, Window child) +{ + event->root = RootWindow(pSprite)->drawable.id; + event->event = pWin->drawable.id; + + if (pSprite->hot.pScreen == pWin->drawable.pScreen) { + event->event_x = event->root_x - double_to_fp1616(pWin->drawable.x); + event->event_y = event->root_y - double_to_fp1616(pWin->drawable.y); + event->child = child; + } + else { + event->event_x = 0; + event->event_y = 0; + event->child = None; + } +} + /** * Adjust event fields to comply with the window properties. * @@ -2578,6 +2616,18 @@ FixUpEventFromWindow(SpritePtr pSprite, case XI_BarrierHit: case XI_BarrierLeave: return; + case XI_GesturePinchBegin: + case XI_GesturePinchUpdate: + case XI_GesturePinchEnd: + FixUpXI2PinchEventFromWindow(pSprite, + (xXIGesturePinchEvent*) xE, pWin, child); + break; + case XI_GestureSwipeBegin: + case XI_GestureSwipeUpdate: + case XI_GestureSwipeEnd: + FixUpXI2SwipeEventFromWindow(pSprite, + (xXIGestureSwipeEvent*) xE, pWin, child); + break; default: FixUpXI2DeviceEventFromWindow(pSprite, evtype, (xXIDeviceEvent*) xE, pWin, child);