[mutter] compositor/x11: Move stage input region setting to MetaX11Display
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] compositor/x11: Move stage input region setting to MetaX11Display
- Date: Mon, 19 Aug 2019 09:01:49 +0000 (UTC)
commit 8ee00cee60216e70ea4640a93f0f388aaa462187
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Fri Aug 16 16:23:08 2019 +0200
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 <X11/Xlib.h>
-#include <X11/extensions/Xfixes.h>
-
#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);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]