diff options
author | Jonas Ã…dahl <jadahl@gmail.com> | 2019-08-16 16:23:08 +0200 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2019-08-19 08:44:58 +0000 |
commit | 8ee00cee60216e70ea4640a93f0f388aaa462187 (patch) | |
tree | 05ffc7e1b8cbdb9a59b93309702cacba5b1d039f /src/x11/meta-x11-display.c | |
parent | 984aad4b8624a65bcb2dba7aa794d5d31de0b267 (diff) | |
download | mutter-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.c | 48 |
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); +} |