xserver: Branch 'master'

Peter Hutterer whot at kemper.freedesktop.org
Mon May 16 06:29:58 UTC 2016


 dix/enterleave.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

New commits:
commit 2fbf5c2f91d33efbda573c4be036248b1d8ed7f1
Author: Andrew Comminos <andrew at comminos.com>
Date:   Tue Dec 29 23:41:27 2015 -0800

    Input: Send XI2 FocusOut NotifyPointer events to the pointer window.
    
    This changes XInput 2's propagation of NotifyPointer focus out events to
    include the pointer window as well, similar to core events. This fixes
    a potential permanent focus in GDK when the focus moves to PointerRoot.
    
    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=93539
    
    Signed-off-by: Andrew Comminos <andrew at comminos.com>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/enterleave.c b/dix/enterleave.c
index 0fba8bd..0c6c616 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -1447,19 +1447,25 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode)
 
     if ((to == NullWindow) || (to == PointerRootWin)) {
         if ((from == NullWindow) || (from == PointerRootWin)) {
-            if (from == PointerRootWin)
+            if (from == PointerRootWin) {
+                DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer,
+                                 sprite->win);
                 DeviceFocusOutEvents(dev, sprite->win,
                                      GetCurrentRootWindow(dev), mode,
                                      NotifyPointer);
+            }
             /* Notify all the roots */
             for (i = 0; i < nscreens; i++)
                 DeviceFocusEvent(dev, XI_FocusOut, mode, out,
                                  screenInfo.screens[i]->root);
         }
         else {
-            if (IsParent(from, sprite->win))
+            if (IsParent(from, sprite->win)) {
+                DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer,
+                                 sprite->win);
                 DeviceFocusOutEvents(dev, sprite->win, from, mode,
                                      NotifyPointer);
+            }
             DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from);
             /* next call catches the root too, if the screen changed */
             DeviceFocusOutEvents(dev, from, NullWindow, mode,
@@ -1477,10 +1483,13 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode)
     }
     else {
         if ((from == NullWindow) || (from == PointerRootWin)) {
-            if (from == PointerRootWin)
+            if (from == PointerRootWin) {
+                DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer,
+                                 sprite->win);
                 DeviceFocusOutEvents(dev, sprite->win,
                                      GetCurrentRootWindow(dev), mode,
                                      NotifyPointer);
+            }
             for (i = 0; i < nscreens; i++)
                 DeviceFocusEvent(dev, XI_FocusOut, mode, out,
                                  screenInfo.screens[i]->root);
@@ -1507,9 +1516,12 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode)
                 if ((IsParent(from, sprite->win)) &&
                     (sprite->win != from) &&
                     (!IsParent(to, sprite->win)) &&
-                    (!IsParent(sprite->win, to)))
+                    (!IsParent(sprite->win, to))) {
+                    DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer,
+                                     sprite->win);
                     DeviceFocusOutEvents(dev, sprite->win, from, mode,
                                          NotifyPointer);
+                }
                 DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyInferior, from);
                 DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual);
                 DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyAncestor, to);


More information about the xorg-commit mailing list