diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 22:09:03 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-09-06 15:33:07 -0700 |
commit | c73891f8d4c2ef57eff977d186532c008815356a (patch) | |
tree | 62a6410b5b64803e34ad11402dc27b7dd06083cf | |
parent | 15a7e62a9848f2089180c49b02887565d29bb896 (diff) |
Add redirect window for input device feature
-rw-r--r-- | Xi/exevents.c | 13 | ||||
-rw-r--r-- | dix/events.c | 11 | ||||
-rw-r--r-- | include/exevents.h | 4 | ||||
-rw-r--r-- | include/inputstr.h | 2 |
4 files changed, 29 insertions, 1 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index fd4b80c48..f510a9e7c 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -2025,6 +2025,19 @@ DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti, } } +void +SetDeviceRedirectWindow(DeviceIntPtr dev, WindowPtr window) +{ + SpritePtr pSprite = dev->spriteInfo->sprite; + DeviceIntPtr mouse; + + mouse = IsMaster(dev) ? dev : GetMaster(dev, MASTER_POINTER); + + pSprite->redirectWindow = window; + + CheckMotion(NULL, mouse); +} + int InitProximityClassDeviceStruct(DeviceIntPtr dev) { diff --git a/dix/events.c b/dix/events.c index 086601a69..702f98b44 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2832,7 +2832,16 @@ XYToWindow(SpritePtr pSprite, int x, int y) BoxRec box; pSprite->spriteTraceGood = 1; /* root window still there */ - pWin = RootWindow(pSprite)->firstChild; + if (pSprite->redirectWindow == PointerRootWin) { + return RootWindow(pSprite); + } + else if (pSprite->redirectWindow) { + pWin = pSprite->redirectWindow; + pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin; + pWin = pWin->firstChild; + } + else + pWin = RootWindow(pSprite)->firstChild; while (pWin) { if ((pWin->mapped) && (x >= pWin->drawable.x - wBorderWidth(pWin)) && diff --git a/include/exevents.h b/include/exevents.h index 321fc422d..ba93be39d 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -162,6 +162,10 @@ extern void ProcessOtherEvent(InternalEvent * /* ev */ , DeviceIntPtr /* other */ ); +extern _X_EXPORT void + SetDeviceRedirectWindow(DeviceIntPtr /* dev */ , + WindowPtr /* window */ ); + extern int CheckGrabValues(ClientPtr /* client */ , GrabParameters * /* param */ ); diff --git a/include/inputstr.h b/include/inputstr.h index dc36c5d8d..09471cf13 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -246,6 +246,8 @@ typedef struct _SpriteRec { ScreenPtr pEnqueueScreen; ScreenPtr pDequeueScreen; + WindowPtr redirectWindow; + } SpriteRec; typedef struct _KeyClassRec { |