From c80bf1591e5cea26bd29e1b4b4680d4ef3693833 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Sun, 6 May 2018 20:23:10 +0200 Subject: Allow xwayland to start lazily Makes the xwayland startup process two phased. The first phase just initialises the X11 sockets. The second phase starts the Xwayland server itself. When starting xwayland lazily the second phase will be postponed until a client has connected to the X11 socket. Changes in behaviour: The DISPLAY environment is now set immediately after the X11 sockets are created. When the Xwayland server is killed or crashes, the sockets will not be recreated, but reused. Fixes #849: Start up Xwayland lazily --- include/wlr/xwayland.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'include/wlr') diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index b2c23667..a802d32d 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -15,10 +15,12 @@ struct wlr_xwayland { pid_t pid; int display; int x_fd[2], wl_fd[2], wm_fd[2]; + struct wl_event_source *x_fd_read_event[2]; struct wl_client *client; struct wl_display *wl_display; struct wlr_compositor *compositor; time_t server_start; + bool lazy; struct wl_event_source *sigusr1_source; struct wl_listener client_destroy; @@ -168,7 +170,7 @@ struct wlr_xwayland_resize_event { }; struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display, - struct wlr_compositor *compositor); + struct wlr_compositor *compositor, bool lazy); void wlr_xwayland_destroy(struct wlr_xwayland *wlr_xwayland); -- cgit v1.2.3 From 119a6cf35c4163091a699d5987f8d3bab384c95e Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 8 May 2018 22:22:35 +0200 Subject: Make xwayland_finish* clean up wlr_xwayland --- include/wlr/xwayland.h | 22 +++++++++++++--------- xwayland/xwayland.c | 12 ++++++++---- 2 files changed, 21 insertions(+), 13 deletions(-) (limited to 'include/wlr') diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index a802d32d..d0f37834 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -13,22 +13,26 @@ struct wlr_xwayland_cursor; struct wlr_xwayland { pid_t pid; - int display; - int x_fd[2], wl_fd[2], wm_fd[2]; - struct wl_event_source *x_fd_read_event[2]; struct wl_client *client; - struct wl_display *wl_display; - struct wlr_compositor *compositor; - time_t server_start; - bool lazy; - struct wl_event_source *sigusr1_source; struct wl_listener client_destroy; struct wl_listener display_destroy; struct wlr_xwm *xwm; struct wlr_xwayland_cursor *cursor; + int wm_fd[2], wl_fd[2]; + + time_t server_start; - /* Anything above seat is reset on Xwayland restart, rest is conserved */ + /* Anything above display is reset on Xwayland restart, rest is conserved */ + + int display; + int x_fd[2]; + struct wl_event_source *x_fd_read_event[2]; + + bool lazy; + + struct wl_display *wl_display; + struct wlr_compositor *compositor; struct wlr_seat *seat; struct wl_listener seat_destroy; diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c index 511eb6fc..22d5cdeb 100644 --- a/xwayland/xwayland.c +++ b/xwayland/xwayland.c @@ -151,6 +151,10 @@ static void xwayland_finish_server(struct wlr_xwayland *wlr_xwayland) { safe_close(wlr_xwayland->wl_fd[1]); safe_close(wlr_xwayland->wm_fd[0]); safe_close(wlr_xwayland->wm_fd[1]); + memset(wlr_xwayland, 0, offsetof(struct wlr_xwayland, display)); + wlr_xwayland->wl_fd[0] = wlr_xwayland->wl_fd[1] = -1; + wlr_xwayland->wm_fd[0] = wlr_xwayland->wm_fd[1] = -1; + /* We do not kill the Xwayland process, it dies to broken pipe * after we close our side of the wm/wl fds. This is more reliable * than trying to kill something that might no longer be Xwayland. @@ -160,6 +164,7 @@ static void xwayland_finish_server(struct wlr_xwayland *wlr_xwayland) { static void xwayland_finish_display(struct wlr_xwayland *wlr_xwayland) { safe_close(wlr_xwayland->x_fd[0]); safe_close(wlr_xwayland->x_fd[1]); + wlr_xwayland->x_fd[0] = wlr_xwayland->x_fd[1] = -1; wl_list_remove(&wlr_xwayland->display_destroy.link); @@ -274,7 +279,6 @@ static int xwayland_socket_connected(int fd, uint32_t mask, void* data){ static bool xwayland_start_display(struct wlr_xwayland *wlr_xwayland, struct wl_display *wl_display, struct wlr_compositor *compositor) { - wlr_xwayland->x_fd[0] = wlr_xwayland->x_fd[1] = -1; wlr_xwayland->display_destroy.notify = handle_display_destroy; wl_display_add_destroy_listener(wl_display, &wlr_xwayland->display_destroy); @@ -293,8 +297,6 @@ static bool xwayland_start_display(struct wlr_xwayland *wlr_xwayland, } static bool xwayland_start_server(struct wlr_xwayland *wlr_xwayland) { - wlr_xwayland->wl_fd[0] = wlr_xwayland->wl_fd[1] = -1; - wlr_xwayland->wm_fd[0] = wlr_xwayland->wm_fd[1] = -1; if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, wlr_xwayland->wl_fd) != 0 || socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, wlr_xwayland->wm_fd) != 0) { @@ -386,7 +388,9 @@ void wlr_xwayland_destroy(struct wlr_xwayland *wlr_xwayland) { struct wlr_xwayland *wlr_xwayland_create(struct wl_display *wl_display, struct wlr_compositor *compositor, bool lazy) { struct wlr_xwayland *wlr_xwayland = calloc(1, sizeof(struct wlr_xwayland)); - memset(wlr_xwayland, 0, offsetof(struct wlr_xwayland, seat)); + if (!wlr_xwayland) { + return NULL; + } wlr_xwayland->wl_display = wl_display; wlr_xwayland->compositor = compositor; -- cgit v1.2.3