Added support for xwayland keyboard grab
authorakallabeth <akallabeth@posteo.net>
Tue, 27 Oct 2020 13:17:37 +0000 (14:17 +0100)
committerakallabeth <akallabeth@posteo.net>
Wed, 2 Dec 2020 08:00:52 +0000 (09:00 +0100)
(cherry picked from commit 896b7bc711f9e47620078507074960a68309576b)

client/X11/xf_client.c
client/X11/xf_window.c
client/X11/xfreerdp.h

index 6e9f85a..8db3555 100644 (file)
@@ -940,6 +940,7 @@ static int _xf_error_handler(Display* d, XErrorEvent* ev)
         * another window. This make xf_error_handler() a potential
         * debugger breakpoint.
         */
+
        XUngrabKeyboard(d, CurrentTime);
        return xf_error_handler(d, ev);
 }
@@ -1905,6 +1906,8 @@ static BOOL xfreerdp_client_new(freerdp* instance, rdpContext* context)
                        XFree(data);
        }
 
+       xfc->_XWAYLAND_MAY_GRAB_KEYBOARD =
+           XInternAtom(xfc->display, "_XWAYLAND_MAY_GRAB_KEYBOARD", False);
        xfc->_NET_WM_ICON = XInternAtom(xfc->display, "_NET_WM_ICON", False);
        xfc->_MOTIF_WM_HINTS = XInternAtom(xfc->display, "_MOTIF_WM_HINTS", False);
        xfc->_NET_CURRENT_DESKTOP = XInternAtom(xfc->display, "_NET_CURRENT_DESKTOP", False);
index 819193e..d14655d 100644 (file)
@@ -123,11 +123,11 @@ static void xf_SetWindowTitleText(xfContext* xfc, Window window, const char* nam
  */
 void xf_SendClientEvent(xfContext* xfc, Window window, Atom atom, unsigned int numArgs, ...)
 {
-       XEvent xevent;
+       XEvent xevent = { 0 };
        unsigned int i;
        va_list argp;
        va_start(argp, numArgs);
-       ZeroMemory(&xevent, sizeof(XEvent));
+
        xevent.xclient.type = ClientMessage;
        xevent.xclient.serial = 0;
        xevent.xclient.send_event = False;
@@ -574,6 +574,10 @@ xfWindow* xf_CreateDesktopWindow(xfContext* xfc, char* name, int width, int heig
        }
 
        window->floatbar = xf_floatbar_new(xfc, window->handle, name, settings->Floatbar);
+
+       if (xfc->_XWAYLAND_MAY_GRAB_KEYBOARD)
+               xf_SendClientEvent(xfc, window->handle, xfc->_XWAYLAND_MAY_GRAB_KEYBOARD, 1, 1);
+
        return window;
 }
 
@@ -819,6 +823,9 @@ int xf_AppWindowCreate(xfContext* xfc, xfAppWindow* appWindow)
                     FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask;
        XSelectInput(xfc->display, appWindow->handle, input_mask);
 
+       if (xfc->_XWAYLAND_MAY_GRAB_KEYBOARD)
+               xf_SendClientEvent(xfc, appWindow->handle, xfc->_XWAYLAND_MAY_GRAB_KEYBOARD, 1, 1);
+
        return 1;
 }
 
index 8599d56..0ac91d6 100644 (file)
@@ -190,6 +190,8 @@ struct xf_context
 
        Atom UTF8_STRING;
 
+       Atom _XWAYLAND_MAY_GRAB_KEYBOARD;
+
        Atom _NET_WM_ICON;
        Atom _MOTIF_WM_HINTS;
        Atom _NET_CURRENT_DESKTOP;