From aaa3f34cc059fefd43148508c610ecc0703e082b Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Tue, 31 May 2022 11:42:47 +0200 Subject: [PATCH 1/8] compositor: Guard X11 types This also moves meta_compositor_x11_redirect_windows to DisplayX11 where it makes more sense as meta_display_x11_redirection_windows Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/2272 Part-of: --- src/compositor/compositor-private.h | 2 - src/compositor/compositor.c | 94 ++++++++-------------------- src/compositor/meta-compositor-x11.c | 2 +- src/core/display.c | 24 ++++--- src/meta/meta-x11-display.h | 3 + src/x11/meta-x11-display.c | 44 +++++++++++++ 6 files changed, 90 insertions(+), 79 deletions(-) diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index 55834440301..0e6dee00e30 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -67,8 +67,6 @@ MetaInhibitShortcutsDialog * meta_compositor_create_inhibit_shortcuts_dialog (Me void meta_compositor_locate_pointer (MetaCompositor *compositor); -void meta_compositor_redirect_x11_windows (MetaCompositor *compositor); - gboolean meta_compositor_is_unredirect_inhibited (MetaCompositor *compositor); MetaDisplay * meta_compositor_get_display (MetaCompositor *compositor); diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 90c9e817e1f..fd1a75a8892 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -54,15 +54,9 @@ #include "compositor/compositor-private.h" -#include - -#include "backends/x11/meta-backend-x11.h" -#include "backends/x11/meta-event-x11.h" -#include "backends/x11/meta-stage-x11.h" #include "clutter/clutter-mutter.h" #include "cogl/cogl.h" #include "compositor/meta-later-private.h" -#include "compositor/meta-window-actor-x11.h" #include "compositor/meta-window-actor-private.h" #include "compositor/meta-window-group-private.h" #include "core/frame.h" @@ -75,16 +69,27 @@ #include "meta/meta-background-group.h" #include "meta/meta-context.h" #include "meta/meta-shadow-factory.h" -#include "meta/meta-x11-errors.h" #include "meta/prefs.h" #include "meta/window.h" -#include "x11/meta-x11-display-private.h" #ifdef HAVE_WAYLAND #include "compositor/meta-window-actor-wayland.h" #include "wayland/meta-wayland-private.h" #endif +#ifdef HAVE_X11_CLIENT +#include + +#include "backends/x11/meta-backend-x11.h" +#include "backends/x11/meta-event-x11.h" +#include "backends/x11/meta-stage-x11.h" + +#include "compositor/meta-window-actor-x11.h" + +#include "meta/meta-x11-errors.h" +#include "x11/meta-x11-display-private.h" +#endif + enum { PROP_0, @@ -327,6 +332,7 @@ void meta_focus_stage_window (MetaDisplay *display, guint32 timestamp) { +#ifdef HAVE_X11_CLIENT ClutterStage *stage; Window window; @@ -342,18 +348,19 @@ meta_focus_stage_window (MetaDisplay *display, meta_x11_display_set_input_focus_xwindow (display->x11_display, window, timestamp); +#endif } gboolean meta_stage_is_focused (MetaDisplay *display) { - ClutterStage *stage; - Window window; - if (meta_is_wayland_compositor ()) return TRUE; - stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); +#ifdef HAVE_X11_CLIENT + ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); + Window window; + if (!stage) return FALSE; @@ -363,6 +370,9 @@ meta_stage_is_focused (MetaDisplay *display) return FALSE; return (display->x11_display->focus_xwindow == window); +#else + return FALSE; +#endif } void @@ -377,62 +387,6 @@ meta_compositor_grab_end (MetaCompositor *compositor) META_COMPOSITOR_GET_CLASS (compositor)->grab_end (compositor); } -static void -redirect_windows (MetaCompositor *compositor, - MetaX11Display *x11_display) -{ - MetaDisplay *display = meta_compositor_get_display (compositor); - MetaContext *context = meta_display_get_context (display); - Display *xdisplay = meta_x11_display_get_xdisplay (x11_display); - Window xroot = meta_x11_display_get_xroot (x11_display); - int screen_number = meta_x11_display_get_screen_number (x11_display); - guint n_retries; - guint max_retries; - - if (meta_context_is_replacing (context)) - max_retries = 5; - else - max_retries = 1; - - n_retries = 0; - - /* Some compositors (like old versions of Mutter) might not properly unredirect - * subwindows before destroying the WM selection window; so we wait a while - * for such a compositor to exit before giving up. - */ - while (TRUE) - { - meta_x11_error_trap_push (x11_display); - XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual); - XSync (xdisplay, FALSE); - - if (!meta_x11_error_trap_pop_with_return (x11_display)) - break; - - if (n_retries == max_retries) - { - /* This probably means that a non-WM compositor like xcompmgr is running; - * we have no way to get it to exit */ - meta_fatal (_("Another compositing manager is already running on screen %i on display ā€œ%sā€."), - screen_number, x11_display->name); - } - - n_retries++; - g_usleep (G_USEC_PER_SEC); - } -} - -void -meta_compositor_redirect_x11_windows (MetaCompositor *compositor) -{ - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); - MetaDisplay *display = priv->display; - - if (display->x11_display) - redirect_windows (compositor, display->x11_display); -} - static MetaCompositorView * meta_compositor_create_view (MetaCompositor *compositor, ClutterStageView *stage_view) @@ -514,9 +468,11 @@ meta_compositor_add_window (MetaCompositor *compositor, switch (window->client_type) { +#ifdef HAVE_X11_CLIENT case META_WINDOW_CLIENT_TYPE_X11: window_actor_type = META_TYPE_WINDOW_ACTOR_X11; break; +#endif #ifdef HAVE_WAYLAND case META_WINDOW_CLIENT_TYPE_WAYLAND: @@ -602,7 +558,9 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor, if (!window_actor) return; +#ifdef HAVE_X11_CLIENT meta_window_actor_x11_update_shape (META_WINDOW_ACTOR_X11 (window_actor)); +#endif } void diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index bb425c31a8e..0c513998f93 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -198,7 +198,7 @@ meta_compositor_x11_manage (MetaCompositor *compositor, compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay); - meta_compositor_redirect_x11_windows (META_COMPOSITOR (compositor)); + meta_x11_display_redirect_windows (x11_display, display); return TRUE; } diff --git a/src/core/display.c b/src/core/display.c index eca1c0fcc49..2f9605734c3 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -638,7 +638,7 @@ create_compositor (MetaDisplay *display) } static void -meta_display_init (MetaDisplay *disp) +meta_display_init (MetaDisplay *display) { /* Some stuff could go in here that's currently in _open, * but it doesn't really matter. */ @@ -704,6 +704,7 @@ on_monitor_privacy_screen_changed (MetaDisplay *display, : _("Privacy Screen Disabled")); } +#ifdef HAVE_X11_CLIENT static gboolean meta_display_init_x11_display (MetaDisplay *display, GError **error) @@ -723,13 +724,12 @@ meta_display_init_x11_display (MetaDisplay *display, { g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); meta_display_manage_all_xwindows (display); - meta_compositor_redirect_x11_windows (display->compositor); + meta_x11_display_redirect_windows (x11_display, display); } return TRUE; } -#ifdef HAVE_WAYLAND gboolean meta_display_init_x11_finish (MetaDisplay *display, GAsyncResult *result, @@ -763,7 +763,7 @@ meta_display_init_x11_finish (MetaDisplay *display, { g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); meta_display_manage_all_xwindows (display); - meta_compositor_redirect_x11_windows (display->compositor); + meta_x11_display_redirect_windows (x11_display, display); } return TRUE; @@ -834,7 +834,7 @@ on_x11_initialized (MetaDisplay *display, if (!meta_display_init_x11_finish (display, result, &error)) g_critical ("Failed to init X11 display: %s", error->message); } -#endif +#endif /* HAVE_X11_CLIENT */ void meta_display_shutdown_x11 (MetaDisplay *display) @@ -931,10 +931,12 @@ meta_display_new (MetaContext *context, { MetaWaylandCompositor *wayland_compositor = wayland_compositor_from_display (display); - MetaX11DisplayPolicy x11_display_policy; meta_wayland_compositor_init_display (wayland_compositor, display); +#ifdef HAVE_XWAYLAND + MetaX11DisplayPolicy x11_display_policy; + x11_display_policy = meta_context_get_x11_display_policy (context); if (x11_display_policy == META_X11_DISPLAY_POLICY_MANDATORY) { @@ -942,11 +944,12 @@ meta_display_new (MetaContext *context, (GAsyncReadyCallback) on_x11_initialized, NULL); } - +#endif /* HAVE_XWAYLAND */ timestamp = meta_display_get_current_time_roundtrip (display); } else -#endif +#endif /* HAVE_WAYLAND */ +#ifdef HAVE_X11 { if (!meta_display_init_x11_display (display, error)) { @@ -956,6 +959,11 @@ meta_display_new (MetaContext *context, timestamp = display->x11_display->timestamp; } +#else + { + g_assert_not_reached (); + } +#endif display->last_focus_time = timestamp; display->last_user_time = timestamp; diff --git a/src/meta/meta-x11-display.h b/src/meta/meta-x11-display.h index b4a53f9330f..68d157b7937 100644 --- a/src/meta/meta-x11-display.h +++ b/src/meta/meta-x11-display.h @@ -56,4 +56,7 @@ META_EXPORT void meta_x11_display_remove_event_func (MetaX11Display *x11_display, unsigned int id); +META_EXPORT +void meta_x11_display_redirect_windows (MetaX11Display *x11_display, + MetaDisplay *display); #endif /* META_X11_DISPLAY_H */ diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 403d92f4d7b..1395f22a5e7 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -2497,3 +2497,47 @@ meta_x11_display_run_event_funcs (MetaX11Display *x11_display, l = next; } } + +void +meta_x11_display_redirect_windows (MetaX11Display *x11_display, + MetaDisplay *display) +{ + MetaContext *context = meta_display_get_context (display); + Display *xdisplay = meta_x11_display_get_xdisplay (x11_display); + Window xroot = meta_x11_display_get_xroot (x11_display); + int screen_number = meta_x11_display_get_screen_number (x11_display); + guint n_retries; + guint max_retries; + + if (meta_context_is_replacing (context)) + max_retries = 5; + else + max_retries = 1; + + n_retries = 0; + + /* Some compositors (like old versions of Mutter) might not properly unredirect + * subwindows before destroying the WM selection window; so we wait a while + * for such a compositor to exit before giving up. + */ + while (TRUE) + { + meta_x11_error_trap_push (x11_display); + XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual); + XSync (xdisplay, FALSE); + + if (!meta_x11_error_trap_pop_with_return (x11_display)) + break; + + if (n_retries == max_retries) + { + /* This probably means that a non-WM compositor like xcompmgr is running; + * we have no way to get it to exit */ + meta_fatal (_("Another compositing manager is already running on screen %i on display ā€œ%sā€."), + screen_number, x11_display->name); + } + + n_retries++; + g_usleep (G_USEC_PER_SEC); + } +} -- GitLab From 761a254e6f8b8643ce6530e85daf041f25edc683 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Tue, 31 May 2022 11:57:37 +0200 Subject: [PATCH 2/8] core/display: Guard X11 types This also moves a couple of function calls to MetaDisplay::x11-display-opened a signal handler Related https://gitlab.gnome.org/GNOME/mutter/-/issues/2272 Part-of: --- src/core/display-private.h | 3 ++ src/core/display.c | 69 ++++++++++++++++++++++++++------------ src/x11/meta-x11-display.c | 13 +++++++ 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/core/display-private.h b/src/core/display-private.h index 4eff0b7cbd5..5c73a47778d 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -190,7 +190,10 @@ struct _MetaDisplayClass MetaDisplay * meta_display_new (MetaContext *context, GError **error); +#ifdef HAVE_X11_CLIENT void meta_display_manage_all_xwindows (MetaDisplay *display); +#endif + void meta_display_unmanage_windows (MetaDisplay *display, guint32 timestamp); diff --git a/src/core/display.c b/src/core/display.c index 2f9605734c3..b062daa1181 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -40,13 +40,7 @@ #include "backends/meta-input-device-private.h" #include "backends/meta-input-mapper-private.h" #include "backends/meta-stage-private.h" -#include "backends/x11/meta-backend-x11.h" -#include "backends/x11/meta-clutter-backend-x11.h" -#include "backends/x11/meta-event-x11.h" -#include "backends/x11/cm/meta-backend-x11-cm.h" -#include "backends/x11/nested/meta-backend-x11-nested.h" #include "compositor/compositor-private.h" -#include "compositor/meta-compositor-x11.h" #include "cogl/cogl.h" #include "core/bell.h" #include "core/boxes-private.h" @@ -65,12 +59,21 @@ #include "meta/meta-backend.h" #include "meta/meta-enum-types.h" #include "meta/meta-sound-player.h" -#include "meta/meta-x11-errors.h" #include "meta/prefs.h" + +#ifdef HAVE_X11_CLIENT +#include "backends/x11/meta-backend-x11.h" +#include "backends/x11/meta-clutter-backend-x11.h" +#include "backends/x11/meta-event-x11.h" +#include "backends/x11/cm/meta-backend-x11-cm.h" +#include "backends/x11/nested/meta-backend-x11-nested.h" +#include "compositor/meta-compositor-x11.h" +#include "meta/meta-x11-errors.h" #include "x11/meta-startup-notification-x11.h" #include "x11/meta-x11-display-private.h" #include "x11/window-x11.h" #include "x11/xprops.h" +#endif #ifdef HAVE_WAYLAND #include "compositor/meta-compositor-native.h" @@ -631,10 +634,16 @@ create_compositor (MetaDisplay *display) if (META_IS_BACKEND_NATIVE (backend)) return META_COMPOSITOR (meta_compositor_native_new (display, backend)); #endif +#ifdef HAVE_XWAYLAND if (META_IS_BACKEND_X11_NESTED (backend)) return META_COMPOSITOR (meta_compositor_server_new (display, backend)); #endif +#endif/* HAVE_WAYLAND */ +#ifdef HAVE_X11 return META_COMPOSITOR (meta_compositor_x11_new (display, backend)); +#else + g_assert_not_reached (); +#endif } static void @@ -721,15 +730,13 @@ meta_display_init_x11_display (MetaDisplay *display, meta_x11_display_create_guard_window (x11_display); if (!display->display_opening) - { - g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); - meta_display_manage_all_xwindows (display); - meta_x11_display_redirect_windows (x11_display, display); - } + g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); return TRUE; } +#endif +#ifdef HAVE_XWAYLAND gboolean meta_display_init_x11_finish (MetaDisplay *display, GAsyncResult *result, @@ -760,11 +767,7 @@ meta_display_init_x11_finish (MetaDisplay *display, meta_x11_display_create_guard_window (x11_display); if (!display->display_opening) - { - g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); - meta_display_manage_all_xwindows (display); - meta_x11_display_redirect_windows (x11_display, display); - } + g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); return TRUE; } @@ -834,7 +837,7 @@ on_x11_initialized (MetaDisplay *display, if (!meta_display_init_x11_finish (display, result, &error)) g_critical ("Failed to init X11 display: %s", error->message); } -#endif /* HAVE_X11_CLIENT */ +#endif /* HAVE_XWAYLAND */ void meta_display_shutdown_x11 (MetaDisplay *display) @@ -857,7 +860,9 @@ meta_display_new (MetaContext *context, MetaDisplay *display; MetaDisplayPrivate *priv; guint32 timestamp; +#ifdef HAVE_X11_CLIENT Window old_active_xwindow = None; +#endif MetaMonitorManager *monitor_manager; MetaSettings *settings; @@ -968,11 +973,13 @@ meta_display_new (MetaContext *context, display->last_focus_time = timestamp; display->last_user_time = timestamp; +#ifdef HAVE_X11 if (!meta_is_wayland_compositor ()) meta_prop_get_window (display->x11_display, display->x11_display->xroot, display->x11_display->atom__NET_ACTIVE_WINDOW, &old_active_xwindow); +#endif if (!meta_compositor_do_manage (display->compositor, error)) { @@ -980,12 +987,14 @@ meta_display_new (MetaContext *context, return NULL; } +#ifdef HAVE_X11_CLIENT if (display->x11_display) { g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); meta_x11_display_restore_active_workspace (display->x11_display); meta_x11_display_create_guard_window (display->x11_display); } +#endif /* Set up touch support */ display->gesture_tracker = meta_gesture_tracker_new (); @@ -995,6 +1004,7 @@ meta_display_new (MetaContext *context, /* We know that if mutter is running as a Wayland compositor, * we start out with no windows. */ +#ifdef HAVE_X11_CLIENT if (!meta_is_wayland_compositor ()) meta_display_manage_all_xwindows (display); @@ -1012,6 +1022,10 @@ meta_display_new (MetaContext *context, { meta_display_unset_input_focus (display, timestamp); } +#else + meta_display_unset_input_focus (display, timestamp); +#endif + display->sound_player = g_object_new (META_TYPE_SOUND_PLAYER, NULL); @@ -1055,6 +1069,7 @@ meta_display_list_windows (MetaDisplay *display, winlist = NULL; +#ifdef HAVE_X11_CLIENT if (display->x11_display) { g_hash_table_iter_init (&iter, display->x11_display->xids); @@ -1070,6 +1085,7 @@ meta_display_list_windows (MetaDisplay *display, winlist = g_slist_prepend (winlist, window); } } +#endif g_hash_table_iter_init (&iter, display->wayland_windows); while (g_hash_table_iter_next (&iter, &key, &value)) @@ -1285,7 +1301,11 @@ meta_display_get_current_time_roundtrip (MetaDisplay *display) /* Xwayland uses monotonic clock, so lets use it here as well */ return (guint32) (g_get_monotonic_time () / 1000); else +#ifdef HAVE_X11_CLIENT return meta_x11_display_get_current_time_roundtrip (display->x11_display); +#else + g_assert_not_reached (); +#endif } static gboolean @@ -1344,9 +1364,11 @@ meta_display_sync_wayland_input_focus (MetaDisplay *display) MetaStage *stage = META_STAGE (meta_backend_get_stage (backend)); gboolean is_no_focus_xwindow = FALSE; +#ifdef HAVE_X11_CLIENT if (display->x11_display) is_no_focus_xwindow = meta_x11_display_xwindow_is_a_no_focus_window (display->x11_display, display->x11_display->focus_xwindow); +#endif if (!meta_display_windows_are_interactable (display)) focus_window = NULL; @@ -1478,11 +1500,13 @@ meta_display_set_input_focus (MetaDisplay *display, if (meta_display_timestamp_too_old (display, ×tamp)) return; +#ifdef HAVE_X11_CLIENT if (display->x11_display) { meta_x11_display_set_input_focus (display->x11_display, window, focus_frame, timestamp); } +#endif meta_display_update_focus_window (display, window); @@ -1543,6 +1567,7 @@ MetaWindow* meta_display_lookup_stack_id (MetaDisplay *display, guint64 stack_id) { +#ifdef HAVE_X11_CLIENT if (META_STACK_ID_IS_X11 (stack_id)) { if (!display->x11_display) @@ -1550,10 +1575,8 @@ meta_display_lookup_stack_id (MetaDisplay *display, return meta_x11_display_lookup_x_window (display->x11_display, (Window)stack_id); } - else - { - return meta_display_lookup_stamp (display, stack_id); - } +#endif + return meta_display_lookup_stamp (display, stack_id); } /* We return a pointer into a ring of static buffers. This is to make @@ -2209,6 +2232,7 @@ meta_resize_gravity_from_grab_op (MetaGrabOp op) return gravity; } +#ifdef HAVE_X11_CLIENT void meta_display_manage_all_xwindows (MetaDisplay *display) { @@ -2233,6 +2257,7 @@ meta_display_manage_all_xwindows (MetaDisplay *display) g_free (children); meta_stack_thaw (display->stack); } +#endif void meta_display_unmanage_windows (MetaDisplay *display, diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 1395f22a5e7..ac0ab81569b 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -289,6 +289,14 @@ meta_x11_display_dispose (GObject *object) G_OBJECT_CLASS (meta_x11_display_parent_class)->dispose (object); } +static void +on_x11_display_opened (MetaX11Display *x11_display, + MetaDisplay *display) +{ + meta_display_manage_all_xwindows (display); + meta_x11_display_redirect_windows (x11_display, display); +} + static void meta_x11_display_class_init (MetaX11DisplayClass *klass) { @@ -1274,6 +1282,11 @@ meta_x11_display_new (MetaDisplay *display, G_CALLBACK (on_window_visibility_updated), x11_display, 0); + g_signal_connect_object (display, + "x11-display-opened", + G_CALLBACK (on_x11_display_opened), + x11_display, + G_CONNECT_SWAPPED); update_cursor_theme (x11_display); x11_display->xids = g_hash_table_new (meta_unsigned_long_hash, -- GitLab From 3e95609073b3a455693e19e58b365688b7f877ba Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Wed, 1 Jun 2022 09:39:01 +0200 Subject: [PATCH 3/8] compositor/dnd: Guard X11 types Part-of: --- src/backends/meta-dnd-private.h | 7 ++++++- src/compositor/meta-dnd.c | 4 ++++ src/x11/meta-x11-display.c | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backends/meta-dnd-private.h b/src/backends/meta-dnd-private.h index a4cb372207d..856b88942e8 100644 --- a/src/backends/meta-dnd-private.h +++ b/src/backends/meta-dnd-private.h @@ -21,17 +21,22 @@ #define META_DND_PRIVATE__H #include + +#ifdef HAVE_X11 #include +#include "compositor/meta-compositor-x11.h" +#endif #include "backends/meta-backend-private.h" -#include "compositor/meta-compositor-x11.h" +#ifdef HAVE_X11 gboolean meta_dnd_handle_xdnd_event (MetaBackend *backend, MetaCompositorX11 *compositor_x11, Display *xdisplay, XEvent *xev); void meta_dnd_init_xdnd (MetaX11Display *x11_display); +#endif #ifdef HAVE_WAYLAND void meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor); diff --git a/src/compositor/meta-dnd.c b/src/compositor/meta-dnd.c index 33bd6ad906a..a8dcd0c7b42 100644 --- a/src/compositor/meta-dnd.c +++ b/src/compositor/meta-dnd.c @@ -125,6 +125,7 @@ meta_dnd_get_backend (MetaDnd *dnd) return priv->backend; } +#ifdef HAVE_X11 void meta_dnd_init_xdnd (MetaX11Display *x11_display) { @@ -155,6 +156,7 @@ meta_dnd_init_xdnd (MetaX11Display *x11_display) XInternAtom (xdisplay, "XdndProxy", False), XA_WINDOW, 32, PropModeReplace, (const unsigned char *) &xwindow, 1); } +#endif static void meta_dnd_notify_dnd_enter (MetaDnd *dnd) @@ -184,6 +186,7 @@ meta_dnd_notify_dnd_leave (MetaDnd *dnd) * * http://www.freedesktop.org/wiki/Specifications/XDND */ +#ifdef HAVE_X11 gboolean meta_dnd_handle_xdnd_event (MetaBackend *backend, MetaCompositorX11 *compositor_x11, @@ -243,6 +246,7 @@ meta_dnd_handle_xdnd_event (MetaBackend *backend, return FALSE; } +#endif #ifdef HAVE_WAYLAND static MetaWaylandDataDevice * diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index ac0ab81569b..b25da53fafc 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -1429,8 +1429,10 @@ meta_x11_display_new (MetaDisplay *display, meta_x11_startup_notification_init (x11_display); meta_x11_selection_init (x11_display); +#ifdef HAVE_X11 if (!meta_is_wayland_compositor ()) meta_dnd_init_xdnd (x11_display); +#endif sprintf (buf, "WM_S%d", number); -- GitLab From 0f88f0931c11431354556b1ffaae082048e98777 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Wed, 1 Jun 2022 10:06:55 +0200 Subject: [PATCH 4/8] core/events: Guard X11 types Part-of: --- src/core/events.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/core/events.c b/src/core/events.c index 1767dded390..182de33bb58 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -27,14 +27,17 @@ #include "backends/meta-cursor-tracker-private.h" #include "backends/meta-dnd-private.h" #include "backends/meta-idle-manager.h" -#include "backends/x11/meta-backend-x11.h" -#include "backends/x11/meta-input-device-x11.h" #include "compositor/compositor-private.h" #include "compositor/meta-window-actor-private.h" #include "core/display-private.h" #include "core/window-private.h" #include "meta/meta-backend.h" +#ifdef HAVE_X11_CLIENT +#include "backends/x11/meta-backend-x11.h" +#include "backends/x11/meta-input-device-x11.h" +#endif + #ifdef HAVE_NATIVE_BACKEND #include "backends/native/meta-backend-native.h" #endif @@ -165,6 +168,7 @@ sequence_is_pointer_emulated (MetaDisplay *display, return FALSE; } +#ifdef HAVE_X11_CLIENT static void maybe_unfreeze_pointer_events (MetaBackend *backend, const ClutterEvent *event, @@ -203,6 +207,7 @@ maybe_unfreeze_pointer_events (MetaBackend *backend, xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); XIAllowEvents (xdisplay, device_id, event_mode, event->button.time); } +#endif static gboolean meta_display_handle_event (MetaDisplay *display, @@ -465,8 +470,9 @@ meta_display_handle_event (MetaDisplay *display, { /* Only replay button press events, since that's where we * have the synchronous grab. */ +#ifdef HAVE_X11_CLIENT maybe_unfreeze_pointer_events (backend, event, EVENTS_UNFREEZE_REPLAY); - +#endif /* If the focus window has an active close dialog let clutter * events go through, so fancy clutter dialogs can get to handle * all events. @@ -486,7 +492,9 @@ meta_display_handle_event (MetaDisplay *display, /* We could not match the event with a window, make sure we sync * the pointer to discard the sequence and don't keep events frozen. */ - maybe_unfreeze_pointer_events (backend, event, EVENTS_UNFREEZE_SYNC); +#ifdef HAVE_X11_CLIENT + maybe_unfreeze_pointer_events (backend, event, EVENTS_UNFREEZE_SYNC); +#endif } out: -- GitLab From a27b9d9707b0c5ccfd6aec3e5f335937c1796429 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Wed, 1 Jun 2022 10:35:29 +0200 Subject: [PATCH 5/8] wayland: Guard XWayland types Part-of: --- src/core/display.c | 2 +- src/tests/meta-test-utils.c | 7 ++++++- src/wayland/meta-wayland-pointer-constraints.c | 2 ++ src/wayland/meta-wayland-private.h | 2 ++ src/wayland/meta-wayland.c | 4 ++++ src/wayland/meta-wayland.h | 4 ++++ 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index b062daa1181..4b7467bed86 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -934,12 +934,12 @@ meta_display_new (MetaContext *context, #ifdef HAVE_WAYLAND if (meta_is_wayland_compositor ()) { +#ifdef HAVE_XWAYLAND MetaWaylandCompositor *wayland_compositor = wayland_compositor_from_display (display); meta_wayland_compositor_init_display (wayland_compositor, display); -#ifdef HAVE_XWAYLAND MetaX11DisplayPolicy x11_display_policy; x11_display_policy = meta_context_get_x11_display_policy (context); diff --git a/src/tests/meta-test-utils.c b/src/tests/meta-test-utils.c index 416dc0b648e..2b9a791bd7c 100644 --- a/src/tests/meta-test-utils.c +++ b/src/tests/meta-test-utils.c @@ -613,7 +613,9 @@ meta_test_client_new (MetaContext *context, ClientProcessHandler *process_handler; MetaWaylandCompositor *compositor; const char *wayland_display_name; +#ifdef HAVE_XWAYLAND const char *x11_display_name; +#endif launcher = g_subprocess_launcher_new ((G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE)); @@ -621,8 +623,9 @@ meta_test_client_new (MetaContext *context, g_assert (meta_is_wayland_compositor ()); compositor = meta_context_get_wayland_compositor (context); wayland_display_name = meta_wayland_get_wayland_display_name (compositor); +#ifdef HAVE_XWAYLAND x11_display_name = meta_wayland_get_public_xwayland_display_name (compositor); - +#endif if (wayland_display_name) { g_subprocess_launcher_setenv (launcher, @@ -630,12 +633,14 @@ meta_test_client_new (MetaContext *context, TRUE); } +#ifdef HAVE_XWAYLAND if (x11_display_name) { g_subprocess_launcher_setenv (launcher, "DISPLAY", x11_display_name, TRUE); } +#endif subprocess = g_subprocess_launcher_spawn (launcher, error, diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c index 40dd2095e96..9389dd6f8ed 100644 --- a/src/wayland/meta-wayland-pointer-constraints.c +++ b/src/wayland/meta-wayland-pointer-constraints.c @@ -474,8 +474,10 @@ should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint) * associate the X11 Window with the wl_surface. * For subsurfaces the window of the ancestor might be gone already. */ +#ifdef HAVE_XWAYLAND g_warn_if_fail (meta_xwayland_is_xwayland_surface (constraint->surface) || META_IS_WAYLAND_SUBSURFACE (constraint->surface->role)); +#endif return FALSE; } #endif diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h index a6bf9cc0ab7..2a28ccd611d 100644 --- a/src/wayland/meta-wayland-private.h +++ b/src/wayland/meta-wayland-private.h @@ -92,7 +92,9 @@ struct _MetaWaylandCompositor GHashTable *outputs; GList *frame_callback_surfaces; +#ifdef HAVE_XWAYLAND MetaXWaylandManager xwayland_manager; +#endif MetaWaylandSeat *seat; MetaWaylandTabletManager *tablet_manager; diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index 83f86bfa915..c83504137ae 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -894,6 +894,7 @@ meta_wayland_get_wayland_display_name (MetaWaylandCompositor *compositor) return compositor->display_name; } +#ifdef HAVE_XWAYLAND const char * meta_wayland_get_public_xwayland_display_name (MetaWaylandCompositor *compositor) { @@ -905,6 +906,7 @@ meta_wayland_get_private_xwayland_display_name (MetaWaylandCompositor *composito { return compositor->xwayland_manager.private_connection.name; } +#endif /* HAVE_XWAYLAND */ void meta_wayland_compositor_restore_shortcuts (MetaWaylandCompositor *compositor, @@ -1004,7 +1006,9 @@ meta_wayland_compositor_notify_surface_id (MetaWaylandCompositor *compositor, GINT_TO_POINTER (id)); if (window) { +#ifdef HAVE_XWAYLAND meta_xwayland_associate_window_with_surface (window, surface); +#endif meta_wayland_compositor_remove_surface_association (compositor, id); } } diff --git a/src/wayland/meta-wayland.h b/src/wayland/meta-wayland.h index e0e5c9251f8..f842d6f18c4 100644 --- a/src/wayland/meta-wayland.h +++ b/src/wayland/meta-wayland.h @@ -72,10 +72,12 @@ GQueue *meta_wayland_compositor_get_committed_transactions (Meta META_EXPORT_TEST const char *meta_wayland_get_wayland_display_name (MetaWaylandCompositor *compositor); +#ifdef HAVE_XWAYLAND META_EXPORT_TEST const char *meta_wayland_get_public_xwayland_display_name (MetaWaylandCompositor *compositor); const char *meta_wayland_get_private_xwayland_display_name (MetaWaylandCompositor *compositor); +#endif void meta_wayland_compositor_restore_shortcuts (MetaWaylandCompositor *compositor, ClutterInputDevice *source); @@ -94,8 +96,10 @@ void meta_wayland_compositor_notify_surface_id (MetaWaylandCo int id, MetaWaylandSurface *surface); +#ifdef HAVE_XWAYLAND META_EXPORT_TEST MetaXWaylandManager * meta_wayland_compositor_get_xwayland_manager (MetaWaylandCompositor *compositor); +#endif #endif -- GitLab From 02a436d607481492a37ad15fcc401abf6385eeff Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Wed, 1 Jun 2022 10:45:20 +0200 Subject: [PATCH 6/8] wayland: Move surface check to MetaWaylandSurface Allows dropping various HAVE_XWAYLAND ifdef as the function would always return false if Mutter is built without XWayland Part-of: --- src/wayland/meta-wayland-cursor-surface.c | 4 +--- src/wayland/meta-wayland-pointer-constraints.c | 12 ++++-------- src/wayland/meta-wayland-surface.c | 14 ++++++++++++++ src/wayland/meta-wayland-surface.h | 1 + src/wayland/meta-xwayland-dnd.c | 2 +- src/wayland/meta-xwayland.c | 10 ---------- src/wayland/meta-xwayland.h | 3 --- 7 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/wayland/meta-wayland-cursor-surface.c b/src/wayland/meta-wayland-cursor-surface.c index c75fe0ee3fc..10f632eb36c 100644 --- a/src/wayland/meta-wayland-cursor-surface.c +++ b/src/wayland/meta-wayland-cursor-surface.c @@ -92,8 +92,7 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite, MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface); MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role); -#ifdef HAVE_XWAYLAND - if (!meta_xwayland_is_xwayland_surface (surface)) + if (!meta_wayland_surface_is_xwayland (surface)) { MetaWaylandSurfaceRole *surface_role = META_WAYLAND_SURFACE_ROLE (cursor_surface); @@ -123,7 +122,6 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite, surface->buffer_transform); } } -#endif meta_wayland_surface_update_outputs (surface); } diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c index 9389dd6f8ed..01e9d855c0d 100644 --- a/src/wayland/meta-wayland-pointer-constraints.c +++ b/src/wayland/meta-wayland-pointer-constraints.c @@ -193,7 +193,7 @@ surface_constraint_data_new (MetaWaylandSurface *surface) connect_window (data, window); } #ifdef HAVE_XWAYLAND - else if (meta_xwayland_is_xwayland_surface (surface)) + else if (meta_wayland_surface_is_xwayland (surface)) { data->window_associated_handler_id = g_signal_connect (surface->role, "window-associated", @@ -475,7 +475,7 @@ should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint) * For subsurfaces the window of the ancestor might be gone already. */ #ifdef HAVE_XWAYLAND - g_warn_if_fail (meta_xwayland_is_xwayland_surface (constraint->surface) || + g_warn_if_fail (meta_wayland_surface_is_xwayland (constraint->surface) || META_IS_WAYLAND_SUBSURFACE (constraint->surface->role)); #endif return FALSE; @@ -488,8 +488,7 @@ should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint) if (constraint->seat->pointer->focus_surface != constraint->surface) return FALSE; -#ifdef HAVE_XWAYLAND - if (meta_xwayland_is_xwayland_surface (constraint->surface)) + if (meta_wayland_surface_is_xwayland (constraint->surface)) { MetaDisplay *display = meta_window_get_display (window); @@ -511,7 +510,6 @@ should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint) display->focus_window->client_type != META_WINDOW_CLIENT_TYPE_X11) return FALSE; } -#endif if (!meta_window_appears_focused (window)) return FALSE; @@ -632,9 +630,7 @@ meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerCo MetaFrame *frame = window->frame; int actual_width, actual_height; -#ifdef HAVE_XWAYLAND - g_assert (meta_xwayland_is_xwayland_surface (constraint->surface)); -#endif + g_assert (meta_wayland_surface_is_xwayland (constraint->surface)); actual_width = window->buffer_rect.width - (frame->child_x + frame->right_width); diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index abd5dae1550..7e8a78d2131 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -2396,3 +2396,17 @@ meta_wayland_surface_get_compositor (MetaWaylandSurface *surface) { return surface->compositor; } + +gboolean +meta_wayland_surface_is_xwayland (MetaWaylandSurface *surface) +{ +#ifdef HAVE_XWAYLAND + MetaWaylandCompositor *compositor = surface->compositor; + MetaXWaylandManager *manager = &compositor->xwayland_manager; + + return surface->resource != NULL && + wl_resource_get_client (surface->resource) == manager->client; +#else + return FALSE; +#endif +} diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h index 91cc64c0b92..63f160894c2 100644 --- a/src/wayland/meta-wayland-surface.h +++ b/src/wayland/meta-wayland-surface.h @@ -419,6 +419,7 @@ meta_wayland_surface_state_new (void) { return g_object_new (META_TYPE_WAYLAND_SURFACE_STATE, NULL); } +gboolean meta_wayland_surface_is_xwayland (MetaWaylandSurface *surface); static inline GNode * meta_get_next_subsurface_sibling (GNode *n) diff --git a/src/wayland/meta-xwayland-dnd.c b/src/wayland/meta-xwayland-dnd.c index 314880cdb5b..b4a67916228 100644 --- a/src/wayland/meta-xwayland-dnd.c +++ b/src/wayland/meta-xwayland-dnd.c @@ -1033,7 +1033,7 @@ meta_xwayland_dnd_handle_xfixes_selection_notify (MetaWaylandCompositor *composi focus = compositor->seat->pointer->focus_surface; if (event->owner != None && event->owner != x11_display->selection.xwindow && - focus && meta_xwayland_is_xwayland_surface (focus)) + focus && meta_wayland_surface_is_xwayland (focus)) { dnd->source = meta_wayland_data_source_xwayland_new (dnd, compositor); meta_wayland_data_device_set_dnd_source (&compositor->seat->data_device, diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c index 8a50b93f364..12d2b170276 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -146,16 +146,6 @@ meta_xwayland_handle_wl_surface_id (MetaWindow *window, } } -gboolean -meta_xwayland_is_xwayland_surface (MetaWaylandSurface *surface) -{ - MetaWaylandCompositor *compositor = surface->compositor; - MetaXWaylandManager *manager = &compositor->xwayland_manager; - - return surface->resource != NULL && - wl_resource_get_client (surface->resource) == manager->client; -} - static gboolean try_display (int display, char **filename_out, diff --git a/src/wayland/meta-xwayland.h b/src/wayland/meta-xwayland.h index cbe27b1837e..06f68ea2dc9 100644 --- a/src/wayland/meta-xwayland.h +++ b/src/wayland/meta-xwayland.h @@ -39,9 +39,6 @@ void meta_xwayland_handle_wl_surface_id (MetaWindow *window, guint32 surface_id); -gboolean -meta_xwayland_is_xwayland_surface (MetaWaylandSurface *surface); - void meta_xwayland_handle_xwayland_grab (MetaWindow *window, gboolean allow); -- GitLab From 15b25568b29ec0e082f6a18fef550078102aaca1 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Tue, 28 Mar 2023 11:28:28 +0200 Subject: [PATCH 7/8] compositor/x11: Drop duplicated methods calls Those are called in the handler of MetaDisplay::x11-display-opened Part-of: --- src/compositor/meta-compositor-x11.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index 0c513998f93..633c12daaf5 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -198,8 +198,6 @@ meta_compositor_x11_manage (MetaCompositor *compositor, compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay); - meta_x11_display_redirect_windows (x11_display, display); - return TRUE; } -- GitLab From b9a6891910c2c07226d66738aca488160585e726 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Mon, 15 May 2023 20:33:11 +0200 Subject: [PATCH 8/8] display: Drop the indirection when initializating Xwayland The init function didn't do much other then calling into the xwayland one Part-of: --- src/core/display.c | 6 +++--- src/wayland/meta-wayland.c | 9 --------- src/wayland/meta-wayland.h | 3 --- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index 4b7467bed86..e74cacef07f 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -937,11 +937,11 @@ meta_display_new (MetaContext *context, #ifdef HAVE_XWAYLAND MetaWaylandCompositor *wayland_compositor = wayland_compositor_from_display (display); - - meta_wayland_compositor_init_display (wayland_compositor, display); - MetaX11DisplayPolicy x11_display_policy; + meta_xwayland_init_display (&wayland_compositor->xwayland_manager, + display); + x11_display_policy = meta_context_get_x11_display_policy (context); if (x11_display_policy == META_X11_DISPLAY_POLICY_MANDATORY) { diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index c83504137ae..c27bb5449ae 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -588,15 +588,6 @@ set_gnome_env (const char *name, } } -void -meta_wayland_compositor_init_display (MetaWaylandCompositor *compositor, - MetaDisplay *display) -{ -#ifdef HAVE_XWAYLAND - meta_xwayland_init_display (&compositor->xwayland_manager, display); -#endif -} - static void meta_wayland_log_func (const char *, va_list) G_GNUC_PRINTF (1, 0); static void diff --git a/src/wayland/meta-wayland.h b/src/wayland/meta-wayland.h index f842d6f18c4..78487bb4ca8 100644 --- a/src/wayland/meta-wayland.h +++ b/src/wayland/meta-wayland.h @@ -36,9 +36,6 @@ MetaWaylandCompositor * meta_wayland_compositor_new (MetaContext *co void meta_wayland_compositor_prepare_shutdown (MetaWaylandCompositor *compositor); -void meta_wayland_compositor_init_display (MetaWaylandCompositor *compositor, - MetaDisplay *display); - void meta_wayland_compositor_update (MetaWaylandCompositor *compositor, const ClutterEvent *event); -- GitLab