Blame SOURCES/0009-Add-redirect-window-for-input-device-feature.patch

70130e
From 9702f1ac244758172c3f8edbfc26e99fe1d52fbe Mon Sep 17 00:00:00 2001
70130e
From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@redhat.com>
70130e
Date: Fri, 18 Sep 2009 22:09:03 -0400
70130e
Subject: [PATCH 09/39] Add redirect window for input device feature
70130e
70130e
---
70130e
 Xi/exevents.c      | 13 +++++++++++++
70130e
 dix/events.c       | 11 ++++++++++-
70130e
 include/exevents.h |  4 ++++
70130e
 include/inputstr.h |  2 ++
70130e
 4 files changed, 29 insertions(+), 1 deletion(-)
70130e
70130e
diff --git a/Xi/exevents.c b/Xi/exevents.c
70130e
index 5dc9020..69b4038 100644
70130e
--- a/Xi/exevents.c
70130e
+++ b/Xi/exevents.c
70130e
@@ -2025,6 +2025,19 @@ DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti,
70130e
     }
70130e
 }
70130e
 
70130e
+void
70130e
+SetDeviceRedirectWindow(DeviceIntPtr dev, WindowPtr window)
70130e
+{
70130e
+    SpritePtr pSprite = dev->spriteInfo->sprite;
70130e
+    DeviceIntPtr mouse;
70130e
+
70130e
+    mouse = IsMaster(dev) ? dev : GetMaster(dev, MASTER_POINTER);
70130e
+
70130e
+    pSprite->redirectWindow = window;
70130e
+
70130e
+    CheckMotion(NULL, mouse);
70130e
+}
70130e
+
70130e
 int
70130e
 InitProximityClassDeviceStruct(DeviceIntPtr dev)
70130e
 {
70130e
diff --git a/dix/events.c b/dix/events.c
70130e
index 4632bb7..9caa8b0 100644
70130e
--- a/dix/events.c
70130e
+++ b/dix/events.c
70130e
@@ -2877,7 +2877,16 @@ XYToWindow(SpritePtr pSprite, int x, int y)
70130e
     BoxRec box;
70130e
 
70130e
     pSprite->spriteTraceGood = 1;       /* root window still there */
70130e
-    pWin = RootWindow(pSprite)->firstChild;
70130e
+    if (pSprite->redirectWindow == PointerRootWin) {
70130e
+        return RootWindow(pSprite);
70130e
+    }
70130e
+    else if (pSprite->redirectWindow) {
70130e
+        pWin = pSprite->redirectWindow;
70130e
+        pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
70130e
+        pWin = pWin->firstChild;
70130e
+    }
70130e
+    else
70130e
+        pWin = RootWindow(pSprite)->firstChild;
70130e
     while (pWin) {
70130e
         if ((pWin->mapped) &&
70130e
             (x >= pWin->drawable.x - wBorderWidth(pWin)) &&
70130e
diff --git a/include/exevents.h b/include/exevents.h
70130e
index 321fc42..ba93be3 100644
70130e
--- a/include/exevents.h
70130e
+++ b/include/exevents.h
70130e
@@ -162,6 +162,10 @@ extern void
70130e
  ProcessOtherEvent(InternalEvent * /* ev */ ,
70130e
                    DeviceIntPtr /* other */ );
70130e
 
70130e
+extern _X_EXPORT void
70130e
+  SetDeviceRedirectWindow(DeviceIntPtr /* dev */ ,
70130e
+                        WindowPtr /* window */ );
70130e
+
70130e
 extern int
70130e
  CheckGrabValues(ClientPtr /* client */ ,
70130e
                  GrabParameters * /* param */ );
70130e
diff --git a/include/inputstr.h b/include/inputstr.h
70130e
index dc36c5d..09471cf 100644
70130e
--- a/include/inputstr.h
70130e
+++ b/include/inputstr.h
70130e
@@ -246,6 +246,8 @@ typedef struct _SpriteRec {
70130e
     ScreenPtr pEnqueueScreen;
70130e
     ScreenPtr pDequeueScreen;
70130e
 
70130e
+    WindowPtr redirectWindow;
70130e
+
70130e
 } SpriteRec;
70130e
 
70130e
 typedef struct _KeyClassRec {
70130e
-- 
70130e
1.8.3.1
70130e