From 8ee00cee60216e70ea4640a93f0f388aaa462187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 16 Aug 2019 16:23:08 +0200 Subject: [PATCH] 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 --- src/compositor/meta-compositor-x11.c | 57 +--------------------------- src/meta/compositor-mutter.h | 10 ----- src/meta/meta-x11-display.h | 7 ++++ src/x11/meta-x11-display-private.h | 2 + src/x11/meta-x11-display.c | 48 +++++++++++++++++++++++ 5 files changed, 58 insertions(+), 66 deletions(-) diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index de10628d1..15534ccd3 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -97,61 +97,6 @@ meta_compositor_x11_process_xevent (MetaCompositorX11 *compositor_x11, clutter_x11_handle_event (xevent); } -void -meta_set_stage_input_region (MetaDisplay *display, - XserverRegion region) -{ - MetaCompositor *compositor = display->compositor; - MetaCompositorX11 *compositor_x11 = META_COMPOSITOR_X11 (display->compositor); - Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); - ClutterStage *stage = meta_compositor_get_stage (compositor); - Window xstage; - - /* - * As a wayland compositor we can simply ignore all this trickery - * for setting an input region on the stage for capturing events in - * clutter since all input comes to us first and we get to choose - * who else sees them. - */ - if (meta_is_wayland_compositor ()) - return; - - xstage = clutter_x11_get_stage_window (stage); - XFixesSetWindowShapeRegion (xdisplay, xstage, 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 (display, XNextRequest (xdisplay)); - XFixesSetWindowShapeRegion (xdisplay, compositor_x11->output, - ShapeInput, 0, 0, region); -} - -void -meta_empty_stage_input_region (MetaDisplay *display) -{ - /* - * Using a static region here is a bit hacky, but when running as X11 - * compositing manager we only ever open a single XDisplay. - */ - static XserverRegion region = None; - - if (meta_is_wayland_compositor ()) - return; - - if (region == None) - { - Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); - - region = XFixesCreateRegion (xdisplay, NULL, 0); - } - - meta_set_stage_input_region (display, region); -} - static void meta_compositor_x11_manage (MetaCompositor *compositor) { @@ -167,7 +112,7 @@ meta_compositor_x11_manage (MetaCompositor *compositor) XReparentWindow (xdisplay, xwindow, compositor_x11->output, 0, 0); - meta_empty_stage_input_region (display); + meta_x11_display_clear_stage_input_region (display->x11_display); /* * Make sure there isn't any left-over output shape on the overlay window by diff --git a/src/meta/compositor-mutter.h b/src/meta/compositor-mutter.h index f21ae65a0..0c420882f 100644 --- a/src/meta/compositor-mutter.h +++ b/src/meta/compositor-mutter.h @@ -23,9 +23,6 @@ #ifndef MUTTER_H_ #define MUTTER_H_ -#include -#include - #include "clutter/clutter.h" #include "meta/compositor.h" #include "meta/meta-window-actor.h" @@ -53,13 +50,6 @@ void meta_disable_unredirect_for_display (MetaDisplay *display); META_EXPORT void meta_enable_unredirect_for_display (MetaDisplay *display); -META_EXPORT -void meta_set_stage_input_region (MetaDisplay *display, - XserverRegion region); - -META_EXPORT -void meta_empty_stage_input_region (MetaDisplay *display); - META_EXPORT void meta_focus_stage_window (MetaDisplay *display, guint32 timestamp); diff --git a/src/meta/meta-x11-display.h b/src/meta/meta-x11-display.h index 9c9adf9b7..eb84c2b20 100644 --- a/src/meta/meta-x11-display.h +++ b/src/meta/meta-x11-display.h @@ -63,4 +63,11 @@ META_EXPORT gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display, Window xwindow); +META_EXPORT +void meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, + XserverRegion region); + +META_EXPORT +void meta_x11_display_clear_stage_input_region (MetaX11Display *x11_display); + #endif /* META_X11_DISPLAY_H */ diff --git a/src/x11/meta-x11-display-private.h b/src/x11/meta-x11-display-private.h index 8b19b5c4c..92951844e 100644 --- a/src/x11/meta-x11-display-private.h +++ b/src/x11/meta-x11-display-private.h @@ -179,6 +179,8 @@ struct _MetaX11Display MetaX11StartupNotification *startup_notification; MetaX11Stack *x11_stack; + + XserverRegion empty_region; }; MetaX11Display *meta_x11_display_new (MetaDisplay *display, GError **error); 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); +}