summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorAndrew Comminos <andrew@comminos.com>2015-12-29 23:41:27 -0800
committerPeter Hutterer <peter.hutterer@who-t.net>2016-05-16 15:19:54 +1000
commit2fbf5c2f91d33efbda573c4be036248b1d8ed7f1 (patch)
tree900d93c74dc9911a297b8329815d80b8094a0fad /dix
parent984be789d5935bc7f695dc61234ef0251ed33679 (diff)
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@comminos.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'dix')
-rw-r--r--dix/enterleave.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 0fba8bdee..0c6c6166a 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);