sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 3a13455b4e23990bb8cdc96f231ab7a78c2d98df
parent cb4309b7cddaea9471254cb38fdede40db557f3f
Author: emersion <contact@emersion.fr>
Date:   Thu, 19 Jul 2018 13:29:58 +0100

Merge pull request #2309 from RyanDwyer/xwayland-set-hints

Allow xwayland views to become urgent when on a non-visible workspace
Diffstat:
Minclude/sway/tree/view.h | 1+
Msway/desktop/xwayland.c | 21+++++++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h @@ -140,6 +140,7 @@ struct sway_xwayland_view { struct wl_listener set_title; struct wl_listener set_class; struct wl_listener set_window_type; + struct wl_listener set_hints; struct wl_listener map; struct wl_listener unmap; struct wl_listener destroy; diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c @@ -290,10 +290,6 @@ static void handle_commit(struct wl_listener *listener, void *data) { } view_damage_from(view); - - if (view->allow_request_urgent) { - view_set_urgent(view, (bool)xsurface->hints_urgency); - } } static void handle_destroy(struct wl_listener *listener, void *data) { @@ -312,6 +308,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { 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); + wl_list_remove(&xwayland_view->set_hints.link); wl_list_remove(&xwayland_view->map.link); wl_list_remove(&xwayland_view->unmap.link); view_destroy(&xwayland_view->view); @@ -437,6 +434,19 @@ static void handle_set_window_type(struct wl_listener *listener, void *data) { view_execute_criteria(view); } +static void handle_set_hints(struct wl_listener *listener, void *data) { + struct sway_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, set_hints); + struct sway_view *view = &xwayland_view->view; + struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; + if (!xsurface->mapped) { + return; + } + if (view->allow_request_urgent) { + view_set_urgent(view, (bool)xsurface->hints_urgency); + } +} + struct sway_view *view_from_wlr_xwayland_surface( struct wlr_xwayland_surface *xsurface) { return xsurface->data; @@ -489,6 +499,9 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { &xwayland_view->set_window_type); xwayland_view->set_window_type.notify = handle_set_window_type; + wl_signal_add(&xsurface->events.set_hints, &xwayland_view->set_hints); + xwayland_view->set_hints.notify = handle_set_hints; + wl_signal_add(&xsurface->events.unmap, &xwayland_view->unmap); xwayland_view->unmap.notify = handle_unmap;