From 52cb19d99d3d667f4475f404a333e347654808dc Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 28 Jan 2018 12:04:46 +0000 Subject: [PATCH 1/4] rootston: fix compilation without XWayland support In case wlroots is not being compiled with XWayland support, we will not have an xwayland surface in our roots view. While we make sure to pay attention to that in some places, we are not being consistent and try to access the xwayland surface in other places. Obviously, this leads to a compiler error due to the field not being present. Fix the issue by sprinkling in a few additional ifdefs where required. --- include/rootston/view.h | 2 ++ rootston/desktop.c | 2 ++ rootston/output.c | 8 ++++++++ rootston/seat.c | 2 ++ 4 files changed, 14 insertions(+) diff --git a/include/rootston/view.h b/include/rootston/view.h index e837586a..e1172bca 100644 --- a/include/rootston/view.h +++ b/include/rootston/view.h @@ -51,7 +51,9 @@ struct roots_xwayland_surface { enum roots_view_type { ROOTS_WL_SHELL_VIEW, ROOTS_XDG_SHELL_V6_VIEW, +#ifdef WLR_HAS_XWAYLAND ROOTS_XWAYLAND_VIEW, +#endif }; struct roots_view { diff --git a/rootston/desktop.c b/rootston/desktop.c index 70dafec4..59d1e58b 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -490,6 +490,7 @@ struct roots_desktop *desktop_create(struct roots_server *server, desktop->server = server; desktop->config = config; +#ifdef WLR_HAS_XWAYLAND const char *cursor_theme = NULL; const char *cursor_default = ROOTS_XCURSOR_DEFAULT; struct roots_cursor_config *cc = @@ -509,6 +510,7 @@ struct roots_desktop *desktop_create(struct roots_server *server, free(desktop); return NULL; } +#endif desktop->layout = wlr_output_layout_create(); desktop->layout_change.notify = handle_layout_change; diff --git a/rootston/output.c b/rootston/output.c index 689956ad..1fb848b9 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -137,6 +137,7 @@ static void render_wl_shell_surface(struct wlr_wl_shell_surface *surface, } } +#ifdef WLR_HAS_XWAYLAND static void render_xwayland_children(struct wlr_xwayland_surface *surface, struct roots_desktop *desktop, struct wlr_output *wlr_output, struct timespec *when) { @@ -149,6 +150,7 @@ static void render_xwayland_children(struct wlr_xwayland_surface *surface, render_xwayland_children(child, desktop, wlr_output, when); } } +#endif static void render_decorations(struct roots_view *view, struct roots_desktop *desktop, struct wlr_output *output) { @@ -198,10 +200,12 @@ static void render_view(struct roots_view *view, struct roots_desktop *desktop, render_wl_shell_surface(view->wl_shell_surface, desktop, wlr_output, when, view->x, view->y, view->rotation, false); break; +#ifdef WLR_HAS_XWAYLAND case ROOTS_XWAYLAND_VIEW: render_surface(view->wlr_surface, desktop, wlr_output, when, view->x, view->y, view->rotation); break; +#endif } } @@ -215,8 +219,10 @@ static bool has_standalone_surface(struct roots_view *view) { return wl_list_empty(&view->xdg_surface_v6->popups); case ROOTS_WL_SHELL_VIEW: return wl_list_empty(&view->wl_shell_surface->popups); +#ifdef WLR_HAS_XWAYLAND case ROOTS_XWAYLAND_VIEW: return wl_list_empty(&view->xwayland_surface->children); +#endif } return true; } @@ -264,10 +270,12 @@ static void output_frame_notify(struct wl_listener *listener, void *data) { // During normal rendering the xwayland window tree isn't traversed // because all windows are rendered. Here we only want to render // the fullscreen window's children so we have to traverse the tree. +#ifdef WLR_HAS_XWAYLAND if (view->type == ROOTS_XWAYLAND_VIEW) { render_xwayland_children(view->xwayland_surface, desktop, wlr_output, &now); } +#endif } wlr_renderer_end(server->renderer); wlr_output_swap_buffers(wlr_output); diff --git a/rootston/seat.c b/rootston/seat.c index e6e505b5..d7353d1e 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -651,10 +651,12 @@ void roots_seat_set_focus(struct roots_seat *seat, struct roots_view *view) { return; } +#ifdef WLR_HAS_XWAYLAND if (view && view->type == ROOTS_XWAYLAND_VIEW && view->xwayland_surface->override_redirect) { return; } +#endif struct roots_seat_view *seat_view = NULL; if (view != NULL) { seat_view = roots_seat_view_from_view(seat, view); From d05143950b7b81ae3454845a899225003ab41f25 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 28 Jan 2018 12:11:05 +0000 Subject: [PATCH 2/4] rootston: move together XWayland setup code The XWayland code for creating the cursor as well as creating the surface itself are currently split up into two ifdef'ed sections in `desktop_create()`. Move together these two sections in order to avoid having multiple ifdefs as well as making it clearer that they do in fact serve the same purpose of setting up the XWayland environment. --- rootston/desktop.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/rootston/desktop.c b/rootston/desktop.c index 59d1e58b..44bdf365 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -490,6 +490,23 @@ struct roots_desktop *desktop_create(struct roots_server *server, desktop->server = server; desktop->config = config; + desktop->layout = wlr_output_layout_create(); + desktop->layout_change.notify = handle_layout_change; + wl_signal_add(&desktop->layout->events.change, &desktop->layout_change); + + desktop->compositor = wlr_compositor_create(server->wl_display, + server->renderer); + + desktop->xdg_shell_v6 = wlr_xdg_shell_v6_create(server->wl_display); + wl_signal_add(&desktop->xdg_shell_v6->events.new_surface, + &desktop->xdg_shell_v6_surface); + desktop->xdg_shell_v6_surface.notify = handle_xdg_shell_v6_surface; + + desktop->wl_shell = wlr_wl_shell_create(server->wl_display); + wl_signal_add(&desktop->wl_shell->events.new_surface, + &desktop->wl_shell_surface); + desktop->wl_shell_surface.notify = handle_wl_shell_surface; + #ifdef WLR_HAS_XWAYLAND const char *cursor_theme = NULL; const char *cursor_default = ROOTS_XCURSOR_DEFAULT; @@ -510,26 +527,7 @@ struct roots_desktop *desktop_create(struct roots_server *server, free(desktop); return NULL; } -#endif - desktop->layout = wlr_output_layout_create(); - desktop->layout_change.notify = handle_layout_change; - wl_signal_add(&desktop->layout->events.change, &desktop->layout_change); - - desktop->compositor = wlr_compositor_create(server->wl_display, - server->renderer); - - desktop->xdg_shell_v6 = wlr_xdg_shell_v6_create(server->wl_display); - wl_signal_add(&desktop->xdg_shell_v6->events.new_surface, - &desktop->xdg_shell_v6_surface); - desktop->xdg_shell_v6_surface.notify = handle_xdg_shell_v6_surface; - - desktop->wl_shell = wlr_wl_shell_create(server->wl_display); - wl_signal_add(&desktop->wl_shell->events.new_surface, - &desktop->wl_shell_surface); - desktop->wl_shell_surface.notify = handle_wl_shell_surface; - -#ifdef WLR_HAS_XWAYLAND if (config->xwayland) { desktop->xwayland = wlr_xwayland_create(server->wl_display, desktop->compositor); From 91c034d164caccf78f143cec82b25eb5ef0ee96d Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 28 Jan 2018 12:15:59 +0000 Subject: [PATCH 3/4] travis: add job building wlroots without various options Recently, the support for building rootston without XWayland was broken. While the breakage was easily fixable, the more important problem is that actually nobody seems to ever compile wlroots without XWayland, causing silent breakage. This problem can easily be handled by the CI system: in addition to the existing job which enables XWayland, add a second job which compiles wlroots without XWayland. This will catch breakage at a much earlier stage. Catching broken builds without XWayland support obviously only covers one part of a greater issue, as all the other options may cause our builds to break, too. While we cannot test each combination, we can at least make sure to have one build with all options enabled and one with all options disabled. --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f6bbd7f4..0028de93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,12 @@ compiler: - gcc - clang +# Settings to try +env: + matrix: + - OPTIONS="-Denable_libcap=true -Denable_systemd=true -Denable_elogind=false -Denable_xwayland=true" + - OPTIONS="-Denable_libcap=false -Denable_systemd=false -Denable_elogind=false -Denable_xwayland=false" + arch: packages: - meson @@ -19,7 +25,7 @@ arch: - xcb-util-image - libcap script: - - "meson build" + - "meson build $OPTIONS" - "ninja -C build" script: From 41ec686693821d6d436dae193e675a9b2746a369 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 28 Jan 2018 16:10:53 +0000 Subject: [PATCH 4/4] meson: add systemd/elogind backends only if enabled Right now, we are adding systemd and elogind backends to the build system as soon as their libraries are found on the build system. Instead, we should only add them if the libraries have been found _and_ the user has actually requested them to be included. --- backend/meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/meson.build b/backend/meson.build index b8084448..173b65f6 100644 --- a/backend/meson.build +++ b/backend/meson.build @@ -33,11 +33,11 @@ else backend_files += files('session/direct.c') endif -if systemd.found() +if systemd.found() and get_option('enable_systemd') backend_files += files('session/logind.c') endif -if elogind.found() +if elogind.found() and get_option('enable_elogind') backend_files += files('session/logind.c') endif