summaryrefslogtreecommitdiff
path: root/src/x11/meta-x11-display.c
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2019-08-16 16:23:08 +0200
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-08-19 08:44:58 +0000
commit8ee00cee60216e70ea4640a93f0f388aaa462187 (patch)
tree05ffc7e1b8cbdb9a59b93309702cacba5b1d039f /src/x11/meta-x11-display.c
parent984aad4b8624a65bcb2dba7aa794d5d31de0b267 (diff)
downloadmutter-8ee00cee60216e70ea4640a93f0f388aaa462187.tar.gz
compositor/x11: Move stage input region setting to MetaX11Display
It doesn't use anything specific to MetaCompositor, and MetaCompositorX11 isn't exposed, so move it to MetaX11Display. https://gitlab.gnome.org/GNOME/mutter/merge_requests/727
Diffstat (limited to 'src/x11/meta-x11-display.c')
-rw-r--r--src/x11/meta-x11-display.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index 6729cb9b6..397c9610e 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -131,6 +131,13 @@ meta_x11_display_dispose (GObject *object)
x11_display->closing = TRUE;
+ if (x11_display->empty_region != None)
+ {
+ XFixesDestroyRegion (x11_display->xdisplay,
+ x11_display->empty_region);
+ x11_display->empty_region = None;
+ }
+
meta_x11_startup_notification_release (x11_display);
meta_prefs_remove_listener (prefs_changed_callback, x11_display);
@@ -2207,3 +2214,44 @@ meta_x11_display_focus_sentinel_clear (MetaX11Display *x11_display)
{
return (x11_display->sentinel_counter == 0);
}
+
+void
+meta_x11_display_set_stage_input_region (MetaX11Display *x11_display,
+ XserverRegion region)
+{
+ Display *xdisplay = x11_display->xdisplay;
+ MetaBackend *backend = meta_get_backend ();
+ ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
+ Window stage_xwindow;
+
+ g_return_if_fail (!meta_is_wayland_compositor ());
+
+ stage_xwindow = clutter_x11_get_stage_window (stage);
+ XFixesSetWindowShapeRegion (xdisplay, stage_xwindow,
+ ShapeInput, 0, 0, region);
+
+ /*
+ * It's generally a good heuristic that when a crossing event is generated
+ * because we reshape the overlay, we don't want it to affect
+ * focus-follows-mouse focus - it's not the user doing something, it's the
+ * environment changing under the user.
+ */
+ meta_display_add_ignored_crossing_serial (x11_display->display,
+ XNextRequest (xdisplay));
+ XFixesSetWindowShapeRegion (xdisplay,
+ x11_display->composite_overlay_window,
+ ShapeInput, 0, 0, region);
+}
+
+void
+meta_x11_display_clear_stage_input_region (MetaX11Display *x11_display)
+{
+ if (x11_display->empty_region == None)
+ {
+ x11_display->empty_region = XFixesCreateRegion (x11_display->xdisplay,
+ NULL, 0);
+ }
+
+ meta_x11_display_set_stage_input_region (x11_display,
+ x11_display->empty_region);
+}