[mutter/wayland] xwayland: Split out the XWayland stuff into its own private struct
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] xwayland: Split out the XWayland stuff into its own private struct
- Date: Fri, 7 Feb 2014 21:21:46 +0000 (UTC)
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]