diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 22:09:03 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 22:09:03 -0400 |
commit | 103e1fd234c170850b3300ed69238d05c1cdd1b4 (patch) | |
tree | c66e4fb37bb59e8cffa035243209ebe29a6f61ee | |
parent | 9ffcb438f9208c1be3044cdac551a3d6bd04f08a (diff) |
Add redirect window for input device feature
-rw-r--r-- | Xi/exevents.c | 7 | ||||
-rw-r--r-- | dix/devices.c | 1 | ||||
-rw-r--r-- | dix/events.c | 9 | ||||
-rw-r--r-- | include/dix.h | 2 | ||||
-rw-r--r-- | include/exevents.h | 4 | ||||
-rw-r--r-- | include/inputstr.h | 2 |
6 files changed, 23 insertions, 2 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index 984bc0718..49653a2e5 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1136,6 +1136,13 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device) event->detail.key = key; } +void +SetDeviceRedirectWindow(DeviceIntPtr dev, WindowPtr window) +{ + dev->u.master->redirectWindow = window; + CheckMotion(NULL, dev->u.master); +} + int InitProximityClassDeviceStruct(DeviceIntPtr dev) { diff --git a/dix/devices.c b/dix/devices.c index 4d006b1f2..4116d2919 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -231,6 +231,7 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart) dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab; dev->coreEvents = TRUE; + dev->redirectWindow = NULL; /* sprite defaults */ dev->spriteInfo = (SpriteInfoPtr)&dev[1]; diff --git a/dix/events.c b/dix/events.c index f50229a91..4a89441bc 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2523,7 +2523,14 @@ XYToWindow(DeviceIntPtr pDev, int x, int y) pSprite = pDev->spriteInfo->sprite; pSprite->spriteTraceGood = 1; /* root window still there */ - pWin = RootWindow(pDev)->firstChild; + if (pDev->redirectWindow == PointerRootWin) { + return RootWindow(pDev); + } else if (pDev->redirectWindow) { + pWin = pDev->redirectWindow; + pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin; + pWin = pWin->firstChild; + } else + pWin = RootWindow(pDev)->firstChild; while (pWin) { if ((pWin->mapped) && diff --git a/include/dix.h b/include/dix.h index c6e52e71d..038d62f1c 100644 --- a/include/dix.h +++ b/include/dix.h @@ -422,7 +422,7 @@ extern void DoFocusEvents( WindowPtr /* toWin */, int /* mode */); -extern int SetInputFocus( +extern _X_EXPORT int SetInputFocus( ClientPtr /* client */, DeviceIntPtr /* dev */, Window /* focusID */, diff --git a/include/exevents.h b/include/exevents.h index 861d0ddb1..66c3993a4 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -67,6 +67,10 @@ extern _X_EXPORT void ProcessOtherEvent ( InternalEvent* /* ev */, DeviceIntPtr /* other */); +extern _X_EXPORT void SetDeviceRedirectWindow ( + DeviceIntPtr /* dev */, + WindowPtr /* window */); + extern _X_EXPORT int InitProximityClassDeviceStruct( DeviceIntPtr /* dev */); diff --git a/include/inputstr.h b/include/inputstr.h index 29ad5a814..715e19a99 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -533,6 +533,8 @@ typedef struct _DeviceIntRec { XIPropertyPtr properties; XIPropertyHandlerPtr handlers; /* NULL-terminated */ } properties; + + WindowPtr redirectWindow; } DeviceIntRec; typedef struct { |