summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2009-09-18 22:09:03 -0400
committerKristian Høgsberg <krh@redhat.com>2009-09-18 22:09:03 -0400
commit103e1fd234c170850b3300ed69238d05c1cdd1b4 (patch)
treec66e4fb37bb59e8cffa035243209ebe29a6f61ee
parent9ffcb438f9208c1be3044cdac551a3d6bd04f08a (diff)
Add redirect window for input device feature
-rw-r--r--Xi/exevents.c7
-rw-r--r--dix/devices.c1
-rw-r--r--dix/events.c9
-rw-r--r--include/dix.h2
-rw-r--r--include/exevents.h4
-rw-r--r--include/inputstr.h2
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 {