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
This commit is contained in:
parent
984aad4b86
commit
8ee00cee60
@ -97,61 +97,6 @@ meta_compositor_x11_process_xevent (MetaCompositorX11 *compositor_x11,
|
|||||||
clutter_x11_handle_event (xevent);
|
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
|
static void
|
||||||
meta_compositor_x11_manage (MetaCompositor *compositor)
|
meta_compositor_x11_manage (MetaCompositor *compositor)
|
||||||
{
|
{
|
||||||
@ -167,7 +112,7 @@ meta_compositor_x11_manage (MetaCompositor *compositor)
|
|||||||
|
|
||||||
XReparentWindow (xdisplay, xwindow, compositor_x11->output, 0, 0);
|
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
|
* Make sure there isn't any left-over output shape on the overlay window by
|
||||||
|
@ -23,9 +23,6 @@
|
|||||||
#ifndef MUTTER_H_
|
#ifndef MUTTER_H_
|
||||||
#define MUTTER_H_
|
#define MUTTER_H_
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/Xfixes.h>
|
|
||||||
|
|
||||||
#include "clutter/clutter.h"
|
#include "clutter/clutter.h"
|
||||||
#include "meta/compositor.h"
|
#include "meta/compositor.h"
|
||||||
#include "meta/meta-window-actor.h"
|
#include "meta/meta-window-actor.h"
|
||||||
@ -53,13 +50,6 @@ void meta_disable_unredirect_for_display (MetaDisplay *display);
|
|||||||
META_EXPORT
|
META_EXPORT
|
||||||
void meta_enable_unredirect_for_display (MetaDisplay *display);
|
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
|
META_EXPORT
|
||||||
void meta_focus_stage_window (MetaDisplay *display,
|
void meta_focus_stage_window (MetaDisplay *display,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
@ -63,4 +63,11 @@ META_EXPORT
|
|||||||
gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display,
|
gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display,
|
||||||
Window xwindow);
|
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 */
|
#endif /* META_X11_DISPLAY_H */
|
||||||
|
@ -179,6 +179,8 @@ struct _MetaX11Display
|
|||||||
|
|
||||||
MetaX11StartupNotification *startup_notification;
|
MetaX11StartupNotification *startup_notification;
|
||||||
MetaX11Stack *x11_stack;
|
MetaX11Stack *x11_stack;
|
||||||
|
|
||||||
|
XserverRegion empty_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
MetaX11Display *meta_x11_display_new (MetaDisplay *display, GError **error);
|
MetaX11Display *meta_x11_display_new (MetaDisplay *display, GError **error);
|
||||||
|
@ -131,6 +131,13 @@ meta_x11_display_dispose (GObject *object)
|
|||||||
|
|
||||||
x11_display->closing = TRUE;
|
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_x11_startup_notification_release (x11_display);
|
||||||
|
|
||||||
meta_prefs_remove_listener (prefs_changed_callback, 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);
|
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);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user