diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index 87ccff5fb..cbc48bcef 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -167,7 +167,7 @@ meta_compositor_x11_manage (MetaCompositor *compositor, XReparentWindow (xdisplay, xwindow, compositor_x11->output, 0, 0); - meta_x11_display_clear_stage_input_region (display->x11_display); + meta_x11_display_set_stage_input_region (display->x11_display, NULL, 0); /* * Make sure there isn't any left-over output shape on the overlay window by diff --git a/src/meta/meta-x11-display.h b/src/meta/meta-x11-display.h index 68d0fbfe1..5d1237e02 100644 --- a/src/meta/meta-x11-display.h +++ b/src/meta/meta-x11-display.h @@ -46,8 +46,9 @@ META_EXPORT Window meta_x11_display_get_xroot (MetaX11Display *x11_display); META_EXPORT -void meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, - XserverRegion region); +void meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, + XRectangle *rects, + int n_rects); META_EXPORT unsigned int meta_x11_display_add_event_func (MetaX11Display *x11_display, diff --git a/src/x11/meta-x11-display-private.h b/src/x11/meta-x11-display-private.h index 1f47849b7..e0fb1a2a9 100644 --- a/src/x11/meta-x11-display-private.h +++ b/src/x11/meta-x11-display-private.h @@ -185,7 +185,7 @@ struct _MetaX11Display MetaX11StartupNotification *startup_notification; MetaX11Stack *x11_stack; - XserverRegion empty_region; + XserverRegion stage_input_region; unsigned int reload_x11_cursor_later; }; @@ -250,5 +250,3 @@ int meta_x11_display_get_damage_event_base (MetaX11Display *x11_display); gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display, Window xwindow); - -void meta_x11_display_clear_stage_input_region (MetaX11Display *x11_display); diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 29e8f8627..f21753325 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -178,11 +178,11 @@ meta_x11_display_dispose (GObject *object) g_clear_object (&x11_display->frames_client); } - if (x11_display->empty_region != None) + if (x11_display->stage_input_region != None) { XFixesDestroyRegion (x11_display->xdisplay, - x11_display->empty_region); - x11_display->empty_region = None; + x11_display->stage_input_region); + x11_display->stage_input_region = None; } meta_x11_startup_notification_release (x11_display); @@ -2421,9 +2421,13 @@ prefs_changed_callback (MetaPreference pref, } } +/** + * meta_x11_display_set_stage_input_region: (skip) + */ void meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, - XserverRegion region) + XRectangle *rects, + int n_rects) { Display *xdisplay = x11_display->xdisplay; MetaBackend *backend = backend_from_x11_display (x11_display); @@ -2432,25 +2436,17 @@ meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, g_return_if_fail (!meta_is_wayland_compositor ()); + if (x11_display->stage_input_region) + XFixesDestroyRegion (xdisplay, x11_display->stage_input_region); + + x11_display->stage_input_region = XFixesCreateRegion (xdisplay, rects, n_rects); + stage_xwindow = meta_x11_get_stage_window (stage); XFixesSetWindowShapeRegion (xdisplay, stage_xwindow, - ShapeInput, 0, 0, region); + ShapeInput, 0, 0, x11_display->stage_input_region); 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); + ShapeInput, 0, 0, x11_display->stage_input_region); } /**