From dce549c5378d5d572b8996a7873629df63c45259 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 31 Aug 2018 21:34:16 +1000 Subject: Don't send never-ending transactions when a focused layer surface commits This moves the arrange_windows call into the arrange_layers function, where we know the output actually needs to be arranged. Additionally, we shouldn't set focus to the parent of an unknown container type, because the parent may be an output and this causes a crash because outputs can't have direct focus. Fixes #2543 --- sway/desktop/layer_shell.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'sway/desktop') diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index 1fae5db2..a4f7f928 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -176,7 +176,7 @@ void arrange_layers(struct sway_output *output) { sizeof(struct wlr_box)) != 0) { wlr_log(WLR_DEBUG, "Usable area changed, rearranging output"); memcpy(&output->usable_area, &usable_area, sizeof(struct wlr_box)); - container_set_dirty(output->swayc); + arrange_output(output->swayc); } // Arrange non-exlusive surfaces from top->bottom @@ -247,7 +247,6 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) { layer_surface->surface, false); } - arrange_windows(output->swayc); transaction_commit_dirty(); } -- cgit v1.2.3 From f4ec3083766280a5197cf40680bf991cc9afa41b Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 1 Sep 2018 23:04:49 +1000 Subject: Implement window_type criteria token --- sway/desktop/xwayland.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sway/desktop') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 4e401008..2adc28c5 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -17,6 +17,7 @@ #include "sway/tree/view.h" static const char *atom_map[ATOM_LAST] = { + "_NET_WM_WINDOW_TYPE_NORMAL", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_UTILITY", "_NET_WM_WINDOW_TYPE_TOOLBAR", -- cgit v1.2.3 From 349d1f3be87ad9fd49482f64c71eb2665750261b Mon Sep 17 00:00:00 2001 From: emersion Date: Sat, 1 Sep 2018 18:56:53 +0200 Subject: Do not modeset disabled outputs --- sway/desktop/output.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'sway/desktop') diff --git a/sway/desktop/output.c b/sway/desktop/output.c index c228979d..c30e52a1 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -559,12 +559,6 @@ void handle_new_output(struct wl_listener *listener, void *data) { wl_list_insert(&root_container.sway_root->all_outputs, &output->link); - if (!wl_list_empty(&wlr_output->modes)) { - struct wlr_output_mode *mode = - wl_container_of(wlr_output->modes.prev, mode, link); - wlr_output_set_mode(wlr_output, mode); - } - output_enable(output); } -- cgit v1.2.3 From 69cd1dfacaab9172fecfe0da8dce23e503483622 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 2 Sep 2018 13:27:32 +1000 Subject: Check modal state when determining whether an xwayland view should float Depends on https://github.com/swaywm/wlroots/pull/1222. I don't know of a program that sets the state to modal without setting the window type, but I know the modal property works because logging the property shows it's true for the Firefox Open File dialog. --- sway/desktop/xwayland.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sway/desktop') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 2adc28c5..68d70b64 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -218,7 +218,9 @@ static bool wants_floating(struct sway_view *view) { struct wlr_xwayland_surface *surface = view->wlr_xwayland_surface; struct sway_xwayland *xwayland = &server.xwayland; - // TODO: return true if the NET_WM_STATE is MODAL + if (surface->modal) { + return true; + } for (size_t i = 0; i < surface->window_type_len; ++i) { xcb_atom_t type = surface->window_type[i]; -- cgit v1.2.3 From f057a0195ee79dfcaeddbcab026c06e310998c75 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 2 Sep 2018 15:03:58 +1000 Subject: Implement focus_on_window_activation Depends on https://github.com/swaywm/wlroots/pull/1223 --- sway/desktop/xwayland.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'sway/desktop') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 68d70b64..10faf91d 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -337,6 +337,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&xwayland_view->request_fullscreen.link); wl_list_remove(&xwayland_view->request_move.link); wl_list_remove(&xwayland_view->request_resize.link); + wl_list_remove(&xwayland_view->request_activate.link); wl_list_remove(&xwayland_view->set_title.link); wl_list_remove(&xwayland_view->set_class.link); wl_list_remove(&xwayland_view->set_window_type.link); @@ -463,6 +464,19 @@ static void handle_request_resize(struct wl_listener *listener, void *data) { seat_begin_resize_floating(seat, view->swayc, seat->last_button, e->edges); } +static void handle_request_activate(struct wl_listener *listener, void *data) { + struct sway_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, request_activate); + struct sway_view *view = &xwayland_view->view; + struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; + if (!xsurface->mapped) { + return; + } + view_request_activate(view); + + transaction_commit_dirty(); +} + static void handle_set_title(struct wl_listener *listener, void *data) { struct sway_xwayland_view *xwayland_view = wl_container_of(listener, xwayland_view, set_title); @@ -555,6 +569,10 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { &xwayland_view->request_fullscreen); xwayland_view->request_fullscreen.notify = handle_request_fullscreen; + wl_signal_add(&xsurface->events.request_activate, + &xwayland_view->request_activate); + xwayland_view->request_activate.notify = handle_request_activate; + wl_signal_add(&xsurface->events.request_move, &xwayland_view->request_move); xwayland_view->request_move.notify = handle_request_move; -- cgit v1.2.3