[mutter/benzea/xwayland-non-systemd-startup] xwayland: Start Xwayland for private connections




commit ddeb6f3740b5bd77103712433d8dba5fb6f663df
Author: Benjamin Berg <bberg redhat com>
Date:   Thu Mar 11 11:23:55 2021 +0100

    xwayland: Start Xwayland for private connections
    
    This case happens in the non-systemd startup case. Here, gnome-session
    may unconditionally start gsd-xsettings at login time. If this happens,
    we need to bring up Xwayland immediately as login will fail otherwise.
    
    Also, the private bus comming up before the public one indicates that we
    cannot start the X11 services when needed. As such, we must not try to
    shutdown Xwayland again later.
    
    In the end, we get three common cases:
     * Fully working Xwayland on demand on systemd
     * gsd-xsettings starting Xwayland immediately at login time
       (this is currently the case for the gnome-initial-setup session)
     * Xwayland remaining dormand as nothing ever requires it
       (this is the case for the GDM greeter)

 src/wayland/meta-wayland-private.h |  6 +++---
 src/wayland/meta-wayland.c         |  1 +
 src/wayland/meta-xwayland.c        | 32 +++++++++++++++++++++++++++-----
 3 files changed, 31 insertions(+), 8 deletions(-)
---
diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h
index 3306c192c9..53613785d4 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -50,6 +50,8 @@ typedef struct
   int abstract_fd;
   int unix_fd;
   char *name;
+  int abstract_watch_id;
+  int unix_watch_id;
 } MetaXWaylandConnection;
 
 typedef struct
@@ -57,9 +59,6 @@ typedef struct
   MetaXWaylandConnection private_connection;
   MetaXWaylandConnection public_connection;
 
-  guint abstract_fd_watch_id;
-  guint unix_fd_watch_id;
-
   guint xserver_grace_period_id;
   struct wl_display *wayland_display;
   struct wl_client *client;
@@ -73,6 +72,7 @@ typedef struct
 
   MetaXWaylandDnd *dnd;
 
+  gboolean private_started_xwayland;
   gboolean has_xrandr;
   int rr_event_base;
   int rr_error_base;
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index b032a8bfce..6e93f79d4f 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -470,6 +470,7 @@ meta_wayland_compositor_setup (MetaWaylandCompositor *compositor)
 {
   ClutterActor *stage = meta_backend_get_stage (compositor->backend);
   GSource *wayland_event_source;
+  MetaDisplayPolicy policy;
 
   wayland_event_source = wayland_event_source_new (compositor->wayland_display);
 
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 48fabbfb33..221fdaaa71 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -577,6 +577,11 @@ shutdown_xwayland_cb (gpointer data)
   MetaXWaylandManager *manager = data;
   MetaDisplay *display = meta_get_display ();
   MetaBackend *backend = meta_get_backend ();
+  g_autofree char* unit = NULL;
+
+  /* Never shutdown if the private connection started Xwayland */
+  if (manager->private_started_xwayland)
+    return G_SOURCE_REMOVE;
 
   if (!meta_settings_is_experimental_feature_enabled (meta_backend_get_settings (backend),
                                                       META_EXPERIMENTAL_FEATURE_AUTOCLOSE_XWAYLAND))
@@ -1005,12 +1010,22 @@ xdisplay_connection_activity_cb (gint         fd,
   MetaXWaylandManager *manager = user_data;
   MetaDisplay *display = meta_get_display ();
 
+  if (fd == manager->private_connection.abstract_fd ||
+      fd == manager->private_connection.unix_fd)
+    {
+      g_message ("Xwayland startup was triggered by a private connection");
+
+      manager->private_started_xwayland = TRUE;
+    }
+
   meta_display_init_x11 (display, NULL,
                          (GAsyncReadyCallback) on_init_x11_cb, NULL);
 
-  /* Stop watching both file descriptors */
-  g_clear_handle_id (&manager->abstract_fd_watch_id, g_source_remove);
-  g_clear_handle_id (&manager->unix_fd_watch_id, g_source_remove);
+  /* Stop watching all file descriptors */
+  g_clear_handle_id (&manager->public_connection.abstract_watch_id, g_source_remove);
+  g_clear_handle_id (&manager->public_connection.unix_watch_id, g_source_remove);
+  g_clear_handle_id (&manager->private_connection.abstract_watch_id, g_source_remove);
+  g_clear_handle_id (&manager->private_connection.unix_watch_id, g_source_remove);
 
   return G_SOURCE_REMOVE;
 }
@@ -1121,12 +1136,19 @@ meta_xwayland_init (MetaXWaylandManager  *manager,
 
   if (policy == META_DISPLAY_POLICY_ON_DEMAND)
     {
-      manager->abstract_fd_watch_id =
+      manager->public_connection.abstract_watch_id =
         g_unix_fd_add (manager->public_connection.abstract_fd, G_IO_IN,
                        xdisplay_connection_activity_cb, manager);
-      manager->unix_fd_watch_id =
+      manager->public_connection.unix_watch_id =
         g_unix_fd_add (manager->public_connection.unix_fd, G_IO_IN,
                        xdisplay_connection_activity_cb, manager);
+
+      manager->private_connection.abstract_watch_id =
+        g_unix_fd_add (manager->private_connection.abstract_fd, G_IO_IN,
+                       xdisplay_connection_activity_cb, manager);
+      manager->private_connection.unix_watch_id =
+        g_unix_fd_add (manager->private_connection.unix_fd, G_IO_IN,
+                       xdisplay_connection_activity_cb, manager);
     }
 
   return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]