From 820a7ad813a38b30dc038e7ad234cbaf69443d09 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Sun, 30 Jun 2024 15:08:55 +0200 Subject: [PATCH] build: Allow building xwayland without x11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jonas Ã…dahl Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/3553 Part-of: --- cogl/meson.build | 2 +- meson.build | 4 +-- mtk/meson.build | 2 +- mtk/mtk/meson.build | 2 +- src/compositor/meta-window-actor-x11.c | 8 +++++ src/compositor/meta-window-actor-x11.h | 4 +++ src/compositor/meta-window-actor.c | 4 +-- src/core/display.c | 10 ++---- src/core/events.c | 6 ++-- src/core/stack-tracker.h | 4 +++ src/meson.build | 12 +++---- src/x11/events.c | 20 +++++++---- src/x11/meta-x11-display.c | 46 +++++++++++++++----------- src/x11/meta-x11-keybindings.c | 6 ++++ src/x11/window-x11.c | 4 +++ 15 files changed, 84 insertions(+), 50 deletions(-) diff --git a/cogl/meson.build b/cogl/meson.build index a759d1998..d6996301f 100644 --- a/cogl/meson.build +++ b/cogl/meson.build @@ -34,7 +34,7 @@ if have_egl ] endif -if have_x11_client +if have_x11 cogl_pkg_deps += [ x11_dep, ] diff --git a/meson.build b/meson.build index a247cf1f9..4cb2ac722 100644 --- a/meson.build +++ b/meson.build @@ -192,14 +192,14 @@ if have_egl egl_dep = dependency('egl') endif -have_glx = get_option('glx') and have_x11_client +have_glx = get_option('glx') and have_x11 if have_glx if not have_gl error('GLX support requires OpenGL to be enabled') endif endif -have_egl_xlib = have_egl and have_x11_client +have_egl_xlib = have_egl and have_x11 have_gles2 = get_option('gles2') if have_gles2 diff --git a/mtk/meson.build b/mtk/meson.build index 894ae51c4..71301ad9c 100644 --- a/mtk/meson.build +++ b/mtk/meson.build @@ -33,7 +33,7 @@ mtk_pkg_deps = [ pixman_dep, ] -if have_x11 +if have_x11_client mtk_pkg_deps += x11_dep endif diff --git a/mtk/mtk/meson.build b/mtk/mtk/meson.build index d63d7c196..7e921c6f3 100644 --- a/mtk/mtk/meson.build +++ b/mtk/mtk/meson.build @@ -12,7 +12,7 @@ mtk_sources = [ 'mtk-region.c', ] -if have_x11 +if have_x11_client mtk_sources += 'mtk-x11-errors.c' mtk_headers += [ 'mtk-x11-errors.h', diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c index 0529fc7f2..2781df09c 100644 --- a/src/compositor/meta-window-actor-x11.c +++ b/src/compositor/meta-window-actor-x11.c @@ -437,6 +437,7 @@ has_shadow (MetaWindowActorX11 *actor_x11) return TRUE; } +#ifdef HAVE_X11 gboolean meta_window_actor_x11_should_unredirect (MetaWindowActorX11 *actor_x11) { @@ -478,6 +479,7 @@ meta_window_actor_x11_set_unredirected (MetaWindowActorX11 *actor_x11, surface_x11 = META_SURFACE_ACTOR_X11 (surface); meta_surface_actor_x11_set_unredirected (surface_x11, unredirected); } +#endif /* HAVE_X11 */ static const char * get_shadow_class (MetaWindowActorX11 *actor_x11) @@ -1013,9 +1015,11 @@ is_actor_maybe_transparent (MetaWindowActorX11 *actor_x11) if (!surface) return TRUE; +#ifdef HAVE_X11 if (META_IS_SURFACE_ACTOR_X11 (surface) && meta_surface_actor_x11_is_unredirected (META_SURFACE_ACTOR_X11 (surface))) return FALSE; +#endif stex = meta_surface_actor_get_texture (surface); if (!meta_shaped_texture_has_alpha (stex)) @@ -1148,9 +1152,11 @@ handle_updates (MetaWindowActorX11 *actor_x11) meta_window_actor_get_surface (META_WINDOW_ACTOR (actor_x11)); MetaWindow *window; +#ifdef HAVE_X11 if (META_IS_SURFACE_ACTOR_X11 (surface) && meta_surface_actor_x11_is_unredirected (META_SURFACE_ACTOR_X11 (surface))) return; +#endif window = meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11)); if (meta_window_actor_is_frozen (META_WINDOW_ACTOR (actor_x11))) @@ -1168,6 +1174,7 @@ handle_updates (MetaWindowActorX11 *actor_x11) return; } +#ifdef HAVE_X11 if (META_IS_SURFACE_ACTOR_X11 (surface)) { MetaSurfaceActorX11 *surface_x11 = META_SURFACE_ACTOR_X11 (surface); @@ -1178,6 +1185,7 @@ handle_updates (MetaWindowActorX11 *actor_x11) if (META_IS_SURFACE_ACTOR_X11 (surface) && !meta_surface_actor_x11_is_visible (META_SURFACE_ACTOR_X11 (surface))) return; +#endif /* HAVE_X11 */ update_frame_bounds (actor_x11); check_needs_reshape (actor_x11); diff --git a/src/compositor/meta-window-actor-x11.h b/src/compositor/meta-window-actor-x11.h index 7b00f4126..ec57e564d 100644 --- a/src/compositor/meta-window-actor-x11.h +++ b/src/compositor/meta-window-actor-x11.h @@ -20,6 +20,8 @@ #pragma once +#include + #include "compositor/meta-window-actor-private.h" #define META_TYPE_WINDOW_ACTOR_X11 (meta_window_actor_x11_get_type()) @@ -31,10 +33,12 @@ G_DECLARE_FINAL_TYPE (MetaWindowActorX11, void meta_window_actor_x11_process_x11_damage (MetaWindowActorX11 *actor_x11, XDamageNotifyEvent *event); +#ifdef HAVE_X11 gboolean meta_window_actor_x11_should_unredirect (MetaWindowActorX11 *actor_x11); void meta_window_actor_x11_set_unredirected (MetaWindowActorX11 *actor_x11, gboolean unredirected); +#endif void meta_window_actor_x11_update_shape (MetaWindowActorX11 *actor_x11); diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index 924bc6da1..e0826251c 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -495,7 +495,7 @@ init_surface_actor (MetaWindowActor *self) MetaWindow *window = priv->window; MetaSurfaceActor *surface_actor = NULL; -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 if (!meta_is_wayland_compositor ()) { surface_actor = meta_surface_actor_x11_new (window); @@ -953,7 +953,7 @@ meta_window_actor_sync_actor_geometry (MetaWindowActor *self, /* When running as a Wayland compositor we catch size changes when new * buffers are attached */ -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 if (META_IS_SURFACE_ACTOR_X11 (priv->surface)) meta_surface_actor_x11_set_size (META_SURFACE_ACTOR_X11 (priv->surface), actor_rect.width, actor_rect.height); diff --git a/src/core/display.c b/src/core/display.c index bf9849086..bd09082ed 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -664,7 +664,7 @@ create_compositor (MetaDisplay *display) if (META_IS_BACKEND_NATIVE (backend)) return META_COMPOSITOR (meta_compositor_native_new (display, backend)); #endif -#ifdef HAVE_XWAYLAND +#if defined(HAVE_XWAYLAND) && defined(HAVE_X11) if (META_IS_BACKEND_X11_NESTED (backend)) return META_COMPOSITOR (meta_compositor_server_new (display, backend)); #endif @@ -801,7 +801,7 @@ disable_input_capture (MetaInputCapture *input_capture, priv->enable_input_capture = FALSE; } -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 static gboolean meta_display_init_x11_display (MetaDisplay *display, GError **error) @@ -860,7 +860,6 @@ meta_display_init_x11_finish (MetaDisplay *display, return TRUE; } -#ifdef HAVE_XWAYLAND static void on_xserver_started (MetaXWaylandManager *manager, GAsyncResult *result, @@ -889,7 +888,6 @@ on_xserver_started (MetaXWaylandManager *manager, g_task_return_boolean (task, TRUE); } } -#endif /* HAVE_XWAYLAND */ void meta_display_init_x11 (MetaDisplay *display, @@ -898,21 +896,17 @@ meta_display_init_x11 (MetaDisplay *display, gpointer user_data) { g_autoptr (GTask) task = NULL; -#ifdef HAVE_XWAYLAND MetaWaylandCompositor *compositor; -#endif task = g_task_new (display, cancellable, callback, user_data); g_task_set_source_tag (task, meta_display_init_x11); -#ifdef HAVE_XWAYLAND compositor = wayland_compositor_from_display (display); meta_xwayland_start_xserver (&compositor->xwayland_manager, cancellable, (GAsyncReadyCallback) on_xserver_started, g_steal_pointer (&task)); -#endif } static void diff --git a/src/core/events.c b/src/core/events.c index 761a9d262..87270aed8 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -178,7 +178,7 @@ sequence_is_pointer_emulated (MetaDisplay *display, return FALSE; } -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 static void maybe_unfreeze_pointer_events (MetaBackend *backend, const ClutterEvent *event, @@ -424,7 +424,7 @@ meta_display_handle_event (MetaDisplay *display, if (meta_window_handle_ungrabbed_event (window, event)) return CLUTTER_EVENT_STOP; -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 /* Now replay the button press event to release our own sync grab. */ maybe_unfreeze_pointer_events (backend, event, EVENTS_UNFREEZE_REPLAY); #endif @@ -441,7 +441,7 @@ 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. */ -#ifdef HAVE_X11_CLIENT +#ifdef HAVE_X11 maybe_unfreeze_pointer_events (backend, event, EVENTS_UNFREEZE_SYNC); #endif } diff --git a/src/core/stack-tracker.h b/src/core/stack-tracker.h index 89dfbf518..667d5d7e6 100644 --- a/src/core/stack-tracker.h +++ b/src/core/stack-tracker.h @@ -33,6 +33,10 @@ #pragma once +#ifdef HAVE_X11_CLIENT +#include +#endif + #include "core/util-private.h" #include "meta/display.h" #include "meta/window.h" diff --git a/src/meson.build b/src/meson.build index 94a3feb38..851b96c23 100644 --- a/src/meson.build +++ b/src/meson.build @@ -97,7 +97,7 @@ if have_introspection ] endif -if have_x11 +if have_x11_client mutter_pkg_deps += [ xfixes_dep, xi_dep, @@ -451,17 +451,17 @@ if have_x11 'backends/x11/nested/meta-stage-x11-nested.h', 'backends/x11/nested/meta-renderer-x11-nested.c', 'backends/x11/nested/meta-renderer-x11-nested.h', - ] -endif - -if have_x11_client - mutter_sources += [ 'compositor/meta-compositor-x11.c', 'compositor/meta-compositor-x11.h', 'compositor/meta-surface-actor-x11.c', 'compositor/meta-surface-actor-x11.h', 'compositor/meta-sync-ring.c', 'compositor/meta-sync-ring.h', + ] +endif + +if have_x11_client + mutter_sources += [ 'compositor/meta-window-actor-x11.c', 'compositor/meta-window-actor-x11.h', 'x11/atomnames.h', diff --git a/src/x11/events.c b/src/x11/events.c index c81e32300..05d04a8c1 100644 --- a/src/x11/events.c +++ b/src/x11/events.c @@ -1850,11 +1850,12 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, { MetaDisplay *display = x11_display->display; MetaContext *context = meta_display_get_context (display); - MetaBackend *backend = meta_context_get_backend (context); - Window modified; - gboolean bypass_compositor = FALSE; - XIEvent *input_event; +#ifdef HAVE_X11 MetaCursorTracker *cursor_tracker; + MetaBackend *backend = meta_context_get_backend (context); +#endif + gboolean bypass_compositor G_GNUC_UNUSED = FALSE; + XIEvent *input_event; #ifdef HAVE_XWAYLAND MetaWaylandCompositor *wayland_compositor; #endif @@ -1897,8 +1898,10 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, display->current_time = event_get_time (x11_display, event); +#ifdef HAVE_X11 if (META_IS_BACKEND_X11 (backend)) meta_backend_x11_reset_cached_logical_monitor (META_BACKEND_X11 (backend)); +#endif if (x11_display->focused_by_us && event->xany.serial > x11_display->focus_serial && @@ -1915,6 +1918,7 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, x11_display->is_server_focus = FALSE; } +#ifdef HAVE_X11 if (event->xany.window == x11_display->xroot) { cursor_tracker = meta_backend_get_cursor_tracker (backend); @@ -1930,8 +1934,7 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, } } } - - modified = event_get_modified_window (x11_display, event); +#endif input_event = get_input_event (x11_display, event); @@ -1950,11 +1953,15 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, } out: +#ifdef HAVE_X11 if (!bypass_compositor && META_IS_COMPOSITOR_X11 (display->compositor)) { MetaCompositorX11 *compositor_x11 = META_COMPOSITOR_X11 (display->compositor); MetaWindow *window; + Window modified; + + modified = event_get_modified_window (x11_display, event); if (modified != None) window = meta_x11_display_lookup_x_window (x11_display, modified); @@ -1963,6 +1970,7 @@ meta_x11_display_handle_xevent (MetaX11Display *x11_display, meta_compositor_x11_process_xevent (compositor_x11, event, window); } +#endif /* HAVE_X11 */ display->current_time = META_CURRENT_TIME; diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index f21753325..6b8d7faf5 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -1242,7 +1242,9 @@ meta_x11_display_new (MetaDisplay *display, if (!xdisplay) return NULL; +#ifdef HAVE_X11 XSynchronize (xdisplay, meta_context_is_x11_sync (context)); +#endif #ifdef HAVE_XWAYLAND if (meta_is_wayland_compositor ()) @@ -1340,9 +1342,8 @@ meta_x11_display_new (MetaDisplay *display, x11_display, G_CONNECT_SWAPPED); -#ifdef HAVE_XWAYLAND +#ifdef HAVE_X11 if (!meta_is_wayland_compositor ()) -#endif { ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); @@ -1353,6 +1354,7 @@ meta_x11_display_new (MetaDisplay *display, x11_display, G_CONNECT_SWAPPED); } +#endif x11_display->xids = g_hash_table_new (meta_unsigned_long_hash, meta_unsigned_long_equal); @@ -1754,6 +1756,7 @@ update_cursor_theme (MetaX11Display *x11_display) set_cursor_theme (x11_display->xdisplay, backend); schedule_reload_x11_cursor (x11_display); +#ifdef HAVE_X11 if (META_IS_BACKEND_X11 (backend)) { MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend); @@ -1762,6 +1765,7 @@ update_cursor_theme (MetaX11Display *x11_display) set_cursor_theme (xdisplay, backend); meta_backend_x11_reload_cursor (backend_x11); } +#endif } MetaWindow * @@ -1883,27 +1887,27 @@ create_guard_window (MetaX11Display *x11_display) /* https://bugzilla.gnome.org/show_bug.cgi?id=710346 */ XStoreName (x11_display->xdisplay, guard_window, "mutter guard window"); - { - if (!meta_is_wayland_compositor ()) - { - MetaBackendX11 *backend = - META_BACKEND_X11 (backend_from_x11_display (x11_display)); - Display *backend_xdisplay = meta_backend_x11_get_xdisplay (backend); - unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; - XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; +#ifdef HAVE_X11 + if (!meta_is_wayland_compositor ()) + { + MetaBackendX11 *backend = + META_BACKEND_X11 (backend_from_x11_display (x11_display)); + Display *backend_xdisplay = meta_backend_x11_get_xdisplay (backend); + unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; + XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; - XISetMask (mask.mask, XI_ButtonPress); - XISetMask (mask.mask, XI_ButtonRelease); - XISetMask (mask.mask, XI_Motion); + XISetMask (mask.mask, XI_ButtonPress); + XISetMask (mask.mask, XI_ButtonRelease); + XISetMask (mask.mask, XI_Motion); - /* Sync on the connection we created the window on to - * make sure it's created before we select on it on the - * backend connection. */ - XSync (x11_display->xdisplay, False); + /* Sync on the connection we created the window on to + * make sure it's created before we select on it on the + * backend connection. */ + XSync (x11_display->xdisplay, False); - XISelectEvents (backend_xdisplay, guard_window, &mask, 1); - } - } + XISelectEvents (backend_xdisplay, guard_window, &mask, 1); + } +#endif meta_stack_tracker_record_add (x11_display->display->stack_tracker, guard_window, @@ -2429,6 +2433,7 @@ meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, XRectangle *rects, int n_rects) { +#ifdef HAVE_X11 Display *xdisplay = x11_display->xdisplay; MetaBackend *backend = backend_from_x11_display (x11_display); ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); @@ -2447,6 +2452,7 @@ meta_x11_display_set_stage_input_region (MetaX11Display *x11_display, XFixesSetWindowShapeRegion (xdisplay, x11_display->composite_overlay_window, ShapeInput, 0, 0, x11_display->stage_input_region); +#endif } /** diff --git a/src/x11/meta-x11-keybindings.c b/src/x11/meta-x11-keybindings.c index fce90eb05..3e71f19d5 100644 --- a/src/x11/meta-x11-keybindings.c +++ b/src/x11/meta-x11-keybindings.c @@ -21,6 +21,7 @@ #include "meta-x11-keybindings-private.h" +#ifdef HAVE_X11 static GArray * calc_grab_modifiers (MetaKeyBindingManager *keys, unsigned int modmask) @@ -55,6 +56,7 @@ calc_grab_modifiers (MetaKeyBindingManager *keys, return mods_array; } +#endif static void meta_change_button_grab (MetaKeyBindingManager *keys, @@ -64,6 +66,7 @@ meta_change_button_grab (MetaKeyBindingManager *keys, int button, int modmask) { +#ifdef HAVE_X11 MetaBackendX11 *backend; Display *xdisplay; unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; @@ -111,6 +114,7 @@ meta_change_button_grab (MetaKeyBindingManager *keys, mtk_x11_error_trap_pop (xdisplay); g_array_free (mods, TRUE); +#endif } static void @@ -133,6 +137,7 @@ meta_x11_keybindings_change_keygrab (MetaKeyBindingManager *keys, gboolean grab, MetaResolvedKeyCombo *resolved_combo) { +#ifdef HAVE_X11 MetaBackendX11 *backend_x11; Display *xdisplay; GArray *mods; @@ -185,6 +190,7 @@ meta_x11_keybindings_change_keygrab (MetaKeyBindingManager *keys, mtk_x11_error_trap_pop (xdisplay); g_array_free (mods, TRUE); +#endif } typedef struct diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index 64928b478..adf5075a9 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -3840,9 +3840,11 @@ is_our_xwindow (MetaX11Display *x11_display, Window xwindow, XWindowAttributes *attrs) { +#ifdef HAVE_X11 MetaDisplay *display; MetaContext *context; MetaBackend *backend; +#endif if (xwindow == x11_display->no_focus_window) return TRUE; @@ -3859,6 +3861,7 @@ is_our_xwindow (MetaX11Display *x11_display, if (xwindow == x11_display->composite_overlay_window) return TRUE; +#ifdef HAVE_X11 display = meta_x11_display_get_display (x11_display); context = meta_display_get_context (display); backend = meta_context_get_backend (context); @@ -3866,6 +3869,7 @@ is_our_xwindow (MetaX11Display *x11_display, if (META_IS_BACKEND_X11 (backend) && xwindow == meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend))) return TRUE; +#endif /* Any windows created via meta_create_offscreen_window */ if (attrs->override_redirect &&