Request keyboard grab ability under Xwayland

We're usually white listed, but let's be a good citizen and formally
request the keyboard grab ability from the compositor.
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 150c39b..c52a915 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -290,6 +290,28 @@
 }
 
 
+void DesktopWindow::show()
+{
+  Fl_Window::show();
+
+#if !defined(WIN32) && !defined(__APPLE__)
+  XEvent e;
+
+  // Request ability to grab keyboard under Xwayland
+  e.xany.type = ClientMessage;
+  e.xany.window = fl_xid(this);
+  e.xclient.message_type = XInternAtom (fl_display, "_XWAYLAND_MAY_GRAB_KEYBOARD", 0);
+  e.xclient.format = 32;
+  e.xclient.data.l[0] = 1;
+  e.xclient.data.l[1] = 0;
+  e.xclient.data.l[2] = 0;
+  e.xclient.data.l[3] = 0;
+  e.xclient.data.l[4] = 0;
+  XSendEvent(fl_display, RootWindow(fl_display, fl_screen), 0, SubstructureNotifyMask | SubstructureRedirectMask, &e);
+#endif
+}
+
+
 void DesktopWindow::draw()
 {
   bool redraw;
diff --git a/vncviewer/DesktopWindow.h b/vncviewer/DesktopWindow.h
index 6ec8e1b..c408cb7 100644
--- a/vncviewer/DesktopWindow.h
+++ b/vncviewer/DesktopWindow.h
@@ -73,6 +73,7 @@
   void setLEDState(unsigned int state);
 
   // Fl_Window callback methods
+  virtual void show();
   void draw();
   void resize(int x, int y, int w, int h);