[mutter/wayland] xwayland: Split out the XWayland stuff into its own private struct



commit 856656645127f8b698a50dc17495d10c9fef26d6
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Feb 3 19:37:23 2014 -0500

    xwayland: Split out the XWayland stuff into its own private struct

 src/wayland/meta-wayland-keyboard.c |    2 +-
 src/wayland/meta-wayland-private.h  |   22 +++++++----
 src/wayland/meta-wayland.c          |    6 +--
 src/wayland/meta-xwayland-private.h |    6 ++-
 src/wayland/meta-xwayland.c         |   68 +++++++++++++++++------------------
 5 files changed, 54 insertions(+), 50 deletions(-)
---
diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
index af16424..3829222 100644
--- a/src/wayland/meta-wayland-keyboard.c
+++ b/src/wayland/meta-wayland-keyboard.c
@@ -115,7 +115,7 @@ inform_clients_of_new_keymap (MetaWaylandKeyboard *keyboard,
   struct wl_resource *keyboard_resource;
 
   compositor = meta_wayland_compositor_get_default ();
-  xclient = compositor->xwayland_client;
+  xclient = compositor->xwayland_manager.client;
 
   wl_resource_for_each (keyboard_resource, &keyboard->resource_list)
     {
diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h
index 7c860e1..f12fff6 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -59,25 +59,31 @@ typedef struct
   struct wl_resource *resource;
 } MetaWaylandFrameCallback;
 
+typedef struct
+{
+  int display_index;
+  char *lockfile;
+  int abstract_fd;
+  int unix_fd;
+  pid_t pid;
+  struct wl_client *client;
+  struct wl_resource *xserver_resource;
+
+  GMainLoop *init_loop;
+} MetaXWaylandManager;
+
 struct _MetaWaylandCompositor
 {
   struct wl_display *wayland_display;
   char *display_name;
   struct wl_event_loop *wayland_loop;
-  GMainLoop *init_loop;
   ClutterActor *stage;
   GHashTable *outputs;
   GSource *wayland_event_source;
   GList *surfaces;
   struct wl_list frame_callbacks;
 
-  int xwayland_display_index;
-  char *xwayland_lockfile;
-  int xwayland_abstract_fd;
-  int xwayland_unix_fd;
-  pid_t xwayland_pid;
-  struct wl_client *xwayland_client;
-  struct wl_resource *xserver_resource;
+  MetaXWaylandManager xwayland_manager;
 
   MetaLauncher *launcher;
   gboolean native;
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index ac49ad9..22de965 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -720,12 +720,10 @@ meta_wayland_init (void)
    * and so EGL must be initialized by this point.
    */
 
-  if (!meta_xwayland_start (compositor))
+  if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display, &display_name))
     g_error ("Failed to start X Wayland");
 
-  display_name = g_strdup_printf (":%d", compositor->xwayland_display_index);
   set_gnome_env ("DISPLAY", display_name);
-  g_free (display_name);
 
   set_gnome_env ("WAYLAND_DISPLAY", compositor->display_name);
 }
@@ -737,7 +735,7 @@ meta_wayland_finalize (void)
 
   compositor = meta_wayland_compositor_get_default ();
 
-  meta_xwayland_stop (compositor);
+  meta_xwayland_stop (&compositor->xwayland_manager);
 
   if (compositor->launcher)
     meta_launcher_free (compositor->launcher);
diff --git a/src/wayland/meta-xwayland-private.h b/src/wayland/meta-xwayland-private.h
index d115510..721debf 100644
--- a/src/wayland/meta-xwayland-private.h
+++ b/src/wayland/meta-xwayland-private.h
@@ -25,12 +25,14 @@
 #include <glib.h>
 
 gboolean
-meta_xwayland_start (MetaWaylandCompositor *compositor);
+meta_xwayland_start (MetaXWaylandManager  *manager,
+                     struct wl_display    *display,
+                     char                **display_name_out);
 
 void
 meta_xwayland_complete_init (void);
 
 void
-meta_xwayland_stop (MetaWaylandCompositor *compositor);
+meta_xwayland_stop (MetaXWaylandManager *manager);
 
 #endif /* META_XWAYLAND_PRIVATE_H */
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index e15e308..89025af 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -63,20 +63,20 @@ bind_xserver (struct wl_client *client,
               guint32 version,
               guint32 id)
 {
-  MetaWaylandCompositor *compositor = data;
+  MetaXWaylandManager *manager = data;
 
   /* If it's a different client than the xserver we launched,
-   * don't start the wm. */
-  if (client != compositor->xwayland_client)
+   * just freeze up... */
+  if (client != manager->client)
     return;
 
-  compositor->xserver_resource = wl_resource_create (client, &xserver_interface,
-                                                    MIN (META_XSERVER_VERSION, version), id);
-  wl_resource_set_implementation (compositor->xserver_resource,
-                                 &xserver_implementation, compositor, NULL);
+  manager->xserver_resource = wl_resource_create (client, &xserver_interface,
+                                                  MIN (META_XSERVER_VERSION, version), id);
+  wl_resource_set_implementation (manager->xserver_resource,
+                                 &xserver_implementation, manager, NULL);
 
-  xserver_send_listen_socket (compositor->xserver_resource, compositor->xwayland_abstract_fd);
-  xserver_send_listen_socket (compositor->xserver_resource, compositor->xwayland_unix_fd);
+  xserver_send_listen_socket (manager->xserver_resource, manager->abstract_fd);
+  xserver_send_listen_socket (manager->xserver_resource, manager->unix_fd);
 
   /* Make sure xwayland will recieve the above sockets in a finite
    * time before unblocking the initialization mainloop since we are
@@ -88,8 +88,8 @@ bind_xserver (struct wl_client *client,
    * connections so we can quit the transient initialization mainloop
    * and unblock meta_wayland_init() to continue initializing mutter.
    * */
-  g_main_loop_quit (compositor->init_loop);
-  g_clear_pointer (&compositor->init_loop, g_main_loop_unref);
+  g_main_loop_quit (manager->init_loop);
+  g_clear_pointer (&manager->init_loop, g_main_loop_unref);
 }
 
 static char *
@@ -285,7 +285,9 @@ x_io_error (Display *display)
 }
 
 gboolean
-meta_xwayland_start (MetaWaylandCompositor *compositor)
+meta_xwayland_start (MetaXWaylandManager  *manager,
+                     struct wl_display    *wl_display,
+                     char                **display_name_out)
 {
   int display = 0;
   char *lockfile = NULL;
@@ -298,10 +300,9 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
   char *args[11];
   GError *error;
 
-  wl_global_create (compositor->wayland_display,
-                   &xserver_interface,
+  wl_global_create (wl_display, &xserver_interface,
                    META_XSERVER_VERSION,
-                   compositor, bind_xserver);
+                   manager, bind_xserver);
 
   do
     {
@@ -312,8 +313,8 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
           return FALSE;
         }
 
-      compositor->xwayland_abstract_fd = bind_to_abstract_socket (display);
-      if (compositor->xwayland_abstract_fd < 0)
+      manager->abstract_fd = bind_to_abstract_socket (display);
+      if (manager->abstract_fd < 0)
         {
           unlink (lockfile);
 
@@ -326,11 +327,11 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
             return FALSE;
         }
 
-      compositor->xwayland_unix_fd = bind_to_unix_socket (display);
-      if (compositor->xwayland_abstract_fd < 0)
+      manager->unix_fd = bind_to_unix_socket (display);
+      if (manager->abstract_fd < 0)
         {
           unlink (lockfile);
-          close (compositor->xwayland_abstract_fd);
+          close (manager->abstract_fd);
           return FALSE;
         }
 
@@ -338,8 +339,8 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
     }
   while (1);
 
-  compositor->xwayland_display_index = display;
-  compositor->xwayland_lockfile = lockfile;
+  manager->display_index = display;
+  manager->lockfile = lockfile;
 
   /* We want xwayland to be a wayland client so we make a socketpair to setup a
    * wayland protocol connection. */
@@ -355,8 +356,7 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
   env = g_environ_setenv (env, "WAYLAND_SOCKET", fd_string, TRUE);
   g_free (fd_string);
 
-  display_name = g_strdup_printf (":%d",
-                                  compositor->xwayland_display_index);
+  display_name = g_strdup_printf (":%d", manager->display_index);
   log_path = g_build_filename (g_get_user_cache_dir (), "xwayland.log", NULL);
 
   args[0] = XWAYLAND_PATH;
@@ -387,10 +387,9 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
       g_message ("forked X server, pid %d\n", pid);
 
       close (sp[1]);
-      compositor->xwayland_client =
-        wl_client_create (compositor->wayland_display, sp[0]);
+      manager->client = wl_client_create (wl_display, sp[0]);
 
-      compositor->xwayland_pid = pid;
+      manager->pid = pid;
       g_child_watch_add (pid, xserver_died, NULL);
     }
   else
@@ -405,9 +404,10 @@ meta_xwayland_start (MetaWaylandCompositor *compositor)
   /* We need to run a mainloop until we know xwayland has a binding
    * for our xserver interface at which point we can assume it's
    * ready to start accepting connections. */
-  compositor->init_loop = g_main_loop_new (NULL, FALSE);
+  manager->init_loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (manager->init_loop);
 
-  g_main_loop_run (compositor->init_loop);
+  *display_name_out = display_name;
 
   return TRUE;
 }
@@ -425,16 +425,14 @@ meta_xwayland_complete_init (void)
 }
 
 void
-meta_xwayland_stop (MetaWaylandCompositor *compositor)
+meta_xwayland_stop (MetaXWaylandManager *manager)
 {
   char path[256];
 
-  snprintf (path, sizeof path, "/tmp/.X%d-lock",
-            compositor->xwayland_display_index);
+  snprintf (path, sizeof path, "/tmp/.X%d-lock", manager->display_index);
   unlink (path);
-  snprintf (path, sizeof path, "/tmp/.X11-unix/X%d",
-            compositor->xwayland_display_index);
+  snprintf (path, sizeof path, "/tmp/.X11-unix/X%d", manager->display_index);
   unlink (path);
 
-  unlink (compositor->xwayland_lockfile);
+  unlink (manager->lockfile);
 }


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