aboutsummaryrefslogtreecommitdiff
path: root/sway/desktop/xwayland.c
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-07-19 21:08:51 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-07-19 21:08:51 +1000
commit63d6233fcb601abd40f6c611aa4193766aaf9044 (patch)
treeab483bbac370d68b62fdc54ab6e61ff17229b97b /sway/desktop/xwayland.c
parent4931d0ddc5d9de1f823af7efd931702b2fa80260 (diff)
Allow xwayland views to become urgent when on a non-visible workspace
This removes the urgency stuff from the commit handler and puts it in a new set_hints handler instead. This allows the xwayland surface to become urgent without having to commit (which doesn't happen if it's on an non-visible workspace).
Diffstat (limited to 'sway/desktop/xwayland.c')
-rw-r--r--sway/desktop/xwayland.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index 7737a33a..72dc7ca2 100644
--- 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;