Properly discard xfc->appWindow on focus loss
authorArmin Novak <armin.novak@thincast.com>
Wed, 9 Dec 2020 15:07:49 +0000 (16:07 +0100)
committerakallabeth <akallabeth@users.noreply.github.com>
Thu, 25 Feb 2021 08:51:41 +0000 (09:51 +0100)
(cherry picked from commit 34e5504bcc1734fd767572a262dec94e551e4c30)

client/X11/xf_event.c
client/X11/xf_window.c

index 3f7d872..3127f2f 100644 (file)
@@ -600,15 +600,10 @@ static BOOL xf_event_EnterNotify(xfContext* xfc, const XEnterWindowEvent* event,
        }
        else
        {
-               xfAppWindow* appWindow;
-               appWindow = xf_AppWindowFromX11Window(xfc, event->window);
+               xfAppWindow* appWindow = xf_AppWindowFromX11Window(xfc, event->window);
 
                /* keep track of which window has focus so that we can apply pointer updates */
-
-               if (appWindow)
-               {
-                       xfc->appWindow = appWindow;
-               }
+               xfc->appWindow = appWindow;
        }
 
        return TRUE;
@@ -616,14 +611,19 @@ static BOOL xf_event_EnterNotify(xfContext* xfc, const XEnterWindowEvent* event,
 
 static BOOL xf_event_LeaveNotify(xfContext* xfc, const XLeaveWindowEvent* event, BOOL app)
 {
-       WINPR_UNUSED(event);
-
        if (!app)
        {
                xfc->mouse_active = FALSE;
                XUngrabKeyboard(xfc->display, CurrentTime);
        }
+       else
+       {
+               xfAppWindow* appWindow = xf_AppWindowFromX11Window(xfc, event->window);
 
+               /* keep track of which window has focus so that we can apply pointer updates */
+               if (xfc->appWindow == appWindow)
+                       xfc->appWindow = NULL;
+       }
        return TRUE;
 }
 
index d14655d..55ea712 100644 (file)
@@ -1079,6 +1079,9 @@ void xf_DestroyWindow(xfContext* xfc, xfAppWindow* appWindow)
        if (!appWindow)
                return;
 
+       if (xfc->appWindow == appWindow)
+               xfc->appWindow = NULL;
+
        if (appWindow->gc)
                XFreeGC(xfc->display, appWindow->gc);