2021-10-22 11:27:36 +02:00
|
|
|
Index: mutter-41.0/src/core/display.c
|
|
|
|
===================================================================
|
|
|
|
--- mutter-41.0.orig/src/core/display.c
|
|
|
|
+++ mutter-41.0/src/core/display.c
|
|
|
|
@@ -826,6 +826,8 @@ meta_display_new (MetaContext *context,
|
2021-04-23 11:50:01 +02:00
|
|
|
display->check_fullscreen_later = 0;
|
|
|
|
display->work_area_later = 0;
|
2016-08-26 14:00:22 +02:00
|
|
|
|
|
|
|
+ display->server_grab_count = 0;
|
2021-04-23 11:50:01 +02:00
|
|
|
+
|
2016-08-26 14:00:22 +02:00
|
|
|
display->mouse_mode = TRUE; /* Only relevant for mouse or sloppy focus */
|
|
|
|
display->allow_terminal_deactivation = TRUE; /* Only relevant for when a
|
2021-04-23 11:50:01 +02:00
|
|
|
terminal has the focus */
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1141,6 +1143,50 @@ meta_display_close (MetaDisplay *display
|
|
|
|
the_display = NULL;
|
2016-08-26 14:00:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
+/* Grab/ungrab routines taken from fvwm.
|
|
|
|
+ * Calling this function will cause X to ignore all other clients until
|
|
|
|
+ * you ungrab. This may not be quite as bad as it sounds, yet there is
|
|
|
|
+ * agreement that avoiding server grabs except when they are clearly needed
|
|
|
|
+ * is a good thing.
|
|
|
|
+ *
|
|
|
|
+ * If you do use such grabs, please clearly explain the necessity for their
|
|
|
|
+ * usage in a comment. Try to keep their scope extremely limited. In
|
|
|
|
+ * particular, try to avoid emitting any signals or notifications while
|
|
|
|
+ * a grab is active (if the signal receiver tries to block on an X request
|
|
|
|
+ * from another client at this point, you will have a deadlock).
|
|
|
|
+ */
|
|
|
|
+void
|
|
|
|
+meta_display_grab (MetaDisplay *display)
|
|
|
|
+{
|
|
|
|
+ if (display->server_grab_count == 0)
|
|
|
|
+ {
|
2021-04-23 11:50:01 +02:00
|
|
|
+ XGrabServer (display->x11_display->xdisplay);
|
2016-08-26 14:00:22 +02:00
|
|
|
+ }
|
|
|
|
+ display->server_grab_count += 1;
|
|
|
|
+ meta_verbose ("Grabbing display, grab count now %d\n",
|
|
|
|
+ display->server_grab_count);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void
|
|
|
|
+meta_display_ungrab (MetaDisplay *display)
|
|
|
|
+{
|
|
|
|
+ if (display->server_grab_count == 0)
|
|
|
|
+ meta_bug ("Ungrabbed non-grabbed server\n");
|
|
|
|
+
|
|
|
|
+ display->server_grab_count -= 1;
|
|
|
|
+ if (display->server_grab_count == 0)
|
|
|
|
+ {
|
|
|
|
+ /* FIXME we want to purge all pending "queued" stuff
|
|
|
|
+ * at this point, such as window hide/show
|
|
|
|
+ */
|
2021-04-23 11:50:01 +02:00
|
|
|
+ XUngrabServer (display->x11_display->xdisplay);
|
|
|
|
+ XFlush (display->x11_display->xdisplay);
|
2016-08-26 14:00:22 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ meta_verbose ("Ungrabbing display, grab count now %d\n",
|
|
|
|
+ display->server_grab_count);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
/**
|
|
|
|
* meta_display_for_x_display:
|
|
|
|
* @xdisplay: An X display
|
2021-10-22 11:27:36 +02:00
|
|
|
Index: mutter-41.0/src/core/display-private.h
|
|
|
|
===================================================================
|
|
|
|
--- mutter-41.0.orig/src/core/display-private.h
|
|
|
|
+++ mutter-41.0/src/core/display-private.h
|
|
|
|
@@ -140,6 +140,8 @@ struct _MetaDisplay
|
2021-04-23 11:50:01 +02:00
|
|
|
GHashTable *stamps;
|
|
|
|
GHashTable *wayland_windows;
|
2016-08-26 14:00:22 +02:00
|
|
|
|
2021-04-23 11:50:01 +02:00
|
|
|
+ int server_grab_count;
|
|
|
|
+
|
|
|
|
/* serials of leave/unmap events that may
|
|
|
|
* correspond to an enter event we should
|
|
|
|
* ignore
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -258,6 +260,8 @@ struct _MetaDisplayClass
|
2016-08-26 14:00:22 +02:00
|
|
|
|
2021-10-22 11:27:36 +02:00
|
|
|
MetaDisplay * meta_display_new (MetaContext *context,
|
|
|
|
GError **error);
|
2021-04-23 11:50:01 +02:00
|
|
|
+void meta_display_grab (MetaDisplay *display);
|
|
|
|
+void meta_display_ungrab (MetaDisplay *display);
|
2016-08-26 14:00:22 +02:00
|
|
|
|
2021-04-23 11:50:01 +02:00
|
|
|
void meta_display_manage_all_xwindows (MetaDisplay *display);
|
|
|
|
void meta_display_unmanage_windows (MetaDisplay *display,
|
2021-10-22 11:27:36 +02:00
|
|
|
Index: mutter-41.0/src/core/keybindings.c
|
|
|
|
===================================================================
|
|
|
|
--- mutter-41.0.orig/src/core/keybindings.c
|
|
|
|
+++ mutter-41.0/src/core/keybindings.c
|
|
|
|
@@ -1253,6 +1253,9 @@ meta_display_grab_window_buttons (MetaDi
|
2016-08-26 14:00:22 +02:00
|
|
|
{
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
/* Grab Alt + button1 for moving window.
|
|
|
|
* Grab Alt + button2 for resizing window.
|
|
|
|
* Grab Alt + button3 for popping up window menu.
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1289,6 +1292,9 @@ meta_display_ungrab_window_buttons (Meta
|
2016-08-26 14:00:22 +02:00
|
|
|
{
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
if (keys->window_grab_modifiers == 0)
|
|
|
|
return;
|
|
|
|
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1319,6 +1325,9 @@ meta_display_grab_focus_window_button (M
|
2016-08-26 14:00:22 +02:00
|
|
|
{
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
/* Grab button 1 for activating unfocused windows */
|
2021-04-23 11:50:01 +02:00
|
|
|
meta_verbose ("Grabbing unfocused window buttons for %s", window->desc);
|
2016-08-26 14:00:22 +02:00
|
|
|
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1343,6 +1352,9 @@ meta_display_ungrab_focus_window_button
|
2016-08-26 14:00:22 +02:00
|
|
|
{
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
|
|
|
+
|
2021-04-23 11:50:01 +02:00
|
|
|
meta_verbose ("Ungrabbing unfocused window buttons for %s", window->desc);
|
2016-08-26 14:00:22 +02:00
|
|
|
|
|
|
|
if (!window->have_focus_click_grab)
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1588,6 +1600,10 @@ meta_window_grab_keys (MetaWindow *wind
|
2016-08-26 14:00:22 +02:00
|
|
|
|
2021-04-23 11:50:01 +02:00
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
return;
|
|
|
|
+
|
2016-08-26 14:00:22 +02:00
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
2021-04-23 11:50:01 +02:00
|
|
|
+
|
2016-08-26 14:00:22 +02:00
|
|
|
if (window->all_keys_grabbed)
|
|
|
|
return;
|
|
|
|
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1627,6 +1643,9 @@ meta_window_ungrab_keys (MetaWindow *wi
|
2016-08-26 14:00:22 +02:00
|
|
|
MetaDisplay *display = window->display;
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
|
|
|
+ if (display->server_grab_count > 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
if (window->grab_on_frame &&
|
|
|
|
window->frame != NULL)
|
|
|
|
change_window_keygrabs (keys, window->frame->xwindow, FALSE);
|
2021-10-22 11:27:36 +02:00
|
|
|
Index: mutter-41.0/src/x11/meta-x11-display.c
|
|
|
|
===================================================================
|
|
|
|
--- mutter-41.0.orig/src/x11/meta-x11-display.c
|
|
|
|
+++ mutter-41.0/src/x11/meta-x11-display.c
|
|
|
|
@@ -1916,7 +1916,7 @@ meta_x11_display_set_input_focus_interna
|
2021-04-23 11:50:01 +02:00
|
|
|
* we know which is which by making two requests that the server will
|
|
|
|
* process at the same time.
|
|
|
|
*/
|
|
|
|
- XGrabServer (x11_display->xdisplay);
|
|
|
|
+ meta_display_grab(x11_display->display);
|
|
|
|
|
|
|
|
XSetInputFocus (x11_display->xdisplay,
|
|
|
|
xwindow,
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -1928,8 +1928,7 @@ meta_x11_display_set_input_focus_interna
|
2021-04-23 11:50:01 +02:00
|
|
|
x11_display->atom__MUTTER_FOCUS_SET,
|
|
|
|
XA_STRING, 8, PropModeAppend, NULL, 0);
|
|
|
|
|
|
|
|
- XUngrabServer (x11_display->xdisplay);
|
|
|
|
- XFlush (x11_display->xdisplay);
|
|
|
|
+ meta_display_ungrab(x11_display->display);
|
|
|
|
|
|
|
|
meta_x11_error_trap_pop (x11_display);
|
|
|
|
}
|
2021-10-22 11:27:36 +02:00
|
|
|
Index: mutter-41.0/src/x11/window-x11.c
|
|
|
|
===================================================================
|
|
|
|
--- mutter-41.0.orig/src/x11/window-x11.c
|
|
|
|
+++ mutter-41.0/src/x11/window-x11.c
|
|
|
|
@@ -522,6 +522,8 @@ meta_window_x11_manage (MetaWindow *wind
|
2016-08-26 14:00:22 +02:00
|
|
|
|
|
|
|
meta_icon_cache_init (&priv->icon_cache);
|
|
|
|
|
|
|
|
+ meta_display_grab (display);
|
|
|
|
+
|
2021-04-23 11:50:01 +02:00
|
|
|
meta_x11_display_register_x_window (display->x11_display,
|
|
|
|
&window->xwindow,
|
|
|
|
window);
|
2021-10-22 11:27:36 +02:00
|
|
|
@@ -582,6 +584,13 @@ meta_window_x11_manage (MetaWindow *wind
|
2016-08-26 14:00:22 +02:00
|
|
|
|
|
|
|
meta_window_x11_update_shape_region (window);
|
|
|
|
meta_window_x11_update_input_region (window);
|
|
|
|
+
|
|
|
|
+ meta_display_ungrab (display);
|
|
|
|
+
|
|
|
|
+ /* Perform operations prevented by grab */
|
|
|
|
+ if (window->frame)
|
|
|
|
+ meta_display_grab_window_buttons (display, window->frame->xwindow);
|
|
|
|
+ meta_window_grab_keys (window);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|