diff --git a/src/core/display.c b/src/core/display.c index 655e1cf58..2b07b8d71 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -35,6 +35,7 @@ #include "events.h" #include "util-private.h" #include +#include "main-private.h" #include "window-private.h" #include "boxes-private.h" #include "frame.h" @@ -813,12 +814,19 @@ meta_display_open (void) display->bell = meta_bell_new (display); - x11_display = meta_x11_display_new (display, &error); - g_assert (x11_display != NULL); /* Required, for now */ - display->x11_display = x11_display; - g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); + if (meta_should_autostart_x11_display ()) + { + x11_display = meta_x11_display_new (display, &error); + g_assert (x11_display != NULL); /* Required, for now */ + display->x11_display = x11_display; + g_signal_emit (display, display_signals[X11_DISPLAY_OPENED], 0); - timestamp = display->x11_display->timestamp; + timestamp = display->x11_display->timestamp; + } + else + { + timestamp = meta_display_get_current_time_roundtrip (display); + } display->last_focus_time = timestamp; display->last_user_time = timestamp; diff --git a/src/core/main-private.h b/src/core/main-private.h index 36f4b313a..e59b76608 100644 --- a/src/core/main-private.h +++ b/src/core/main-private.h @@ -31,4 +31,6 @@ typedef enum _MetaCompositorType void meta_override_compositor_configuration (MetaCompositorType compositor_type, GType backend_gtype); +gboolean meta_should_autostart_x11_display (void); + #endif /* META_MAIN_PRIVATE_H */ diff --git a/src/core/main.c b/src/core/main.c index f294b7511..948c389f7 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -177,6 +177,7 @@ static gboolean opt_sync; #ifdef HAVE_WAYLAND static gboolean opt_wayland; static gboolean opt_nested; +static gboolean opt_no_x11; #endif #ifdef HAVE_NATIVE_BACKEND static gboolean opt_display_server; @@ -232,6 +233,12 @@ static GOptionEntry meta_options[] = { N_("Run as a nested compositor"), NULL }, + { + "no-x11", 0, 0, G_OPTION_ARG_NONE, + &opt_no_x11, + N_("Run wayland compositor without starting Xwayland"), + NULL + }, #endif #ifdef HAVE_NATIVE_BACKEND { @@ -453,6 +460,12 @@ calculate_compositor_configuration (MetaCompositorType *compositor_type, run_as_wayland_compositor = check_for_wayland_session_type (); #endif /* HAVE_NATIVE_BACKEND */ + if (!run_as_wayland_compositor && opt_no_x11) + { + meta_warning ("Can't disable X11 support on X11 compositor\n"); + meta_exit (META_EXIT_ERROR); + } + if (run_as_wayland_compositor) *compositor_type = META_COMPOSITOR_TYPE_WAYLAND; else @@ -709,3 +722,16 @@ prefs_changed_callback (MetaPreference pref, break; } } + +gboolean +meta_should_autostart_x11_display (void) +{ + MetaBackend *backend = meta_get_backend (); + gboolean wants_x11 = TRUE; + +#ifdef HAVE_WAYLAND + wants_x11 = !opt_no_x11; +#endif + + return META_IS_BACKEND_X11_CM (backend) || wants_x11; +} diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index 86ee748ea..31aa968cf 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -49,6 +49,8 @@ #include "meta-xwayland.h" #include "meta-wayland-egl-stream.h" +#include "main-private.h" + static MetaWaylandCompositor _meta_wayland_compositor; static char *_display_name_override; @@ -400,8 +402,11 @@ meta_wayland_init (void) meta_wayland_eglstream_controller_init (compositor); - if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) - g_error ("Failed to start X Wayland"); + if (meta_should_autostart_x11_display ()) + { + if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) + g_error ("Failed to start X Wayland"); + } if (_display_name_override) { @@ -422,7 +427,9 @@ meta_wayland_init (void) compositor->display_name = g_strdup (display_name); } - set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor)); + if (meta_should_autostart_x11_display ()) + set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor)); + set_gnome_env ("WAYLAND_DISPLAY", meta_wayland_get_wayland_display_name (compositor)); }