summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw@src.gnome.org>2019-12-02 23:27:55 +0800
committerTing-Wei Lan <lantw@src.gnome.org>2020-05-05 21:36:53 +0800
commitaf0478ae1e051a0a38ea7cd4e8bee4cb2b4d9872 (patch)
treebc0cb15db28b84443b3dc8a11f6976d48e0e34b8
parentaedf692e0ca10871af334af4180b1a4397415db9 (diff)
downloadmutter-wip/lantw/xwayland-Don't-use-abstract-socket-on-non-Linux-systems.tar.gz
xwayland: Don't use abstract socket on non-Linux systemswip/lantw/xwayland-Don't-use-abstract-socket-on-non-Linux-systems
Abstract socket is a Linux-only feature. On operating systems other than Linux, we can only use the normal UNIX socket. This patch allows mutter to run as a nested Wayland compositor under Xorg on FreeBSD. https://gitlab.gnome.org/GNOME/mutter/merge_requests/954
-rw-r--r--src/wayland/meta-wayland-private.h2
-rw-r--r--src/wayland/meta-xwayland.c44
2 files changed, 39 insertions, 7 deletions
diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h
index e28ca06d6..5c4f6e1f4 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -46,7 +46,9 @@ typedef struct
{
int display_index;
char *lock_file;
+#ifdef __linux__
int abstract_fd;
+#endif
int unix_fd;
char *name;
} MetaXWaylandConnection;
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index ac55599d4..28fbca62e 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -235,6 +235,7 @@ create_lock_file (int display, int *display_out)
return filename;
}
+#ifdef __linux__
static int
bind_to_abstract_socket (int display,
gboolean *fatal)
@@ -274,6 +275,7 @@ bind_to_abstract_socket (int display,
return fd;
}
+#endif
static int
bind_to_unix_socket (int display)
@@ -381,26 +383,37 @@ meta_xwayland_override_display_number (int number)
static gboolean
open_display_sockets (MetaXWaylandManager *manager,
int display_index,
+#ifdef __linux__
int *abstract_fd_out,
+#endif
int *unix_fd_out,
gboolean *fatal)
{
- int abstract_fd, unix_fd;
+#ifdef __linux__
+ int abstract_fd;
+#endif
+ int unix_fd;
+#ifdef __linux__
abstract_fd = bind_to_abstract_socket (display_index,
fatal);
if (abstract_fd < 0)
return FALSE;
+#endif
unix_fd = bind_to_unix_socket (display_index);
if (unix_fd < 0)
{
*fatal = FALSE;
+#ifdef __linux__
close (abstract_fd);
+#endif
return FALSE;
}
+#ifdef __linux__
*abstract_fd_out = abstract_fd;
+#endif
*unix_fd_out = unix_fd;
return TRUE;
@@ -429,7 +442,9 @@ choose_xdisplay (MetaXWaylandManager *manager,
}
if (!open_display_sockets (manager, display,
+#ifdef __linux__
&connection->abstract_fd,
+#endif
&connection->unix_fd,
&fatal))
{
@@ -617,10 +632,14 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
launcher = g_subprocess_launcher_new (flags);
g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3);
- g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 4);
+ g_subprocess_launcher_take_fd (launcher, displayfd[1], 4);
g_subprocess_launcher_take_fd (launcher, manager->public_connection.unix_fd, 5);
- g_subprocess_launcher_take_fd (launcher, displayfd[1], 6);
- g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 7);
+#ifdef __linux__
+ g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 6);
+ g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 7);
+#else
+ g_subprocess_launcher_take_fd (launcher, manager->private_connection.unix_fd, 6);
+#endif
g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE);
@@ -632,12 +651,14 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
"-accessx",
"-core",
"-auth", manager->auth_file,
- "-listen", "4",
+ "-displayfd", "4",
"-listen", "5",
- "-displayfd", "6",
#ifdef HAVE_XWAYLAND_INITFD
- "-initfd", "7",
+ "-initfd", "6",
#else
+ "-listen", "6",
+#endif
+#ifdef __linux__
"-listen", "7",
#endif
NULL);
@@ -756,14 +777,18 @@ meta_xwayland_init (MetaXWaylandManager *manager,
{
if (!open_display_sockets (manager,
manager->public_connection.display_index,
+#ifdef __linux__
&manager->public_connection.abstract_fd,
+#endif
&manager->public_connection.unix_fd,
&fatal))
return FALSE;
if (!open_display_sockets (manager,
manager->private_connection.display_index,
+#ifdef __linux__
&manager->private_connection.abstract_fd,
+#endif
&manager->private_connection.unix_fd,
&fatal))
return FALSE;
@@ -774,8 +799,13 @@ meta_xwayland_init (MetaXWaylandManager *manager,
if (policy == META_DISPLAY_POLICY_ON_DEMAND)
{
+#ifdef __linux__
g_unix_fd_add (manager->public_connection.abstract_fd, G_IO_IN,
xdisplay_connection_activity_cb, manager);
+#else
+ g_unix_fd_add (manager->public_connection.unix_fd, G_IO_IN,
+ xdisplay_connection_activity_cb, manager);
+#endif
}
return TRUE;