[mutter] compositor/x11: Move stage input region setting to MetaX11Display



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]