From 315d5311b2004b9e148e7b52a7de161b6dfe3878 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 15 Jul 2018 22:43:33 +1000 Subject: Implement urgency base functionality Introduces a command to manually set urgency, as well as rendering of urgent views, sending the IPC event, removing urgency after focused for one second, and matching urgent views via criteria. --- sway/tree/view.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index bf380d98..a2dbe92c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -25,6 +25,7 @@ void view_init(struct sway_view *view, enum sway_view_type type, view->impl = impl; view->executed_criteria = create_list(); view->marks = create_list(); + view->allow_request_urgent = true; wl_signal_init(&view->events.unmap); } @@ -589,6 +590,11 @@ void view_unmap(struct sway_view *view) { wl_list_remove(&view->surface_new_subsurface.link); wl_list_remove(&view->container_reparent.link); + if (view->urgent_timer) { + wl_event_source_remove(view->urgent_timer); + view->urgent_timer = NULL; + } + if (view->is_fullscreen) { struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); ws->sway_workspace->fullscreen = NULL; @@ -1047,3 +1053,27 @@ bool view_is_visible(struct sway_view *view) { } return true; } + +void view_set_urgent(struct sway_view *view, bool enable) { + if (enable) { + struct sway_seat *seat = input_manager_current_seat(input_manager); + if (seat_get_focus(seat) == view->swayc) { + return; + } + clock_gettime(CLOCK_MONOTONIC, &view->urgent); + } else { + view->urgent = (struct timespec){ 0 }; + if (view->urgent_timer) { + wl_event_source_remove(view->urgent_timer); + view->urgent_timer = NULL; + } + } + container_damage_whole(view->swayc); + + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); + ipc_event_workspace(ws, NULL, "urgent"); +} + +bool view_is_urgent(struct sway_view *view) { + return view->urgent.tv_sec || view->urgent.tv_nsec; +} -- cgit v1.2.3 From f86087d78f25575ddadaa4d3496b34e62b545d2e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 08:13:58 +1000 Subject: Fix urgency IPC events --- sway/tree/view.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index a2dbe92c..ae520b07 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1070,8 +1070,10 @@ void view_set_urgent(struct sway_view *view, bool enable) { } container_damage_whole(view->swayc); + ipc_event_window(view->swayc, "urgent"); + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); - ipc_event_workspace(ws, NULL, "urgent"); + ipc_event_workspace(NULL, ws, "urgent"); } bool view_is_urgent(struct sway_view *view) { -- cgit v1.2.3 From 5f0a4bb6a46cf359dd270e3c448ca1e112331f9d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 13:15:35 +1000 Subject: Update workspace urgent state when views close or move workspaces --- sway/tree/view.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index ae520b07..b5b73408 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -595,16 +595,21 @@ void view_unmap(struct sway_view *view) { view->urgent_timer = NULL; } + struct sway_container *parent; + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); + if (view->is_fullscreen) { - struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); ws->sway_workspace->fullscreen = NULL; - container_destroy(view->swayc); + parent = container_destroy(view->swayc); arrange_windows(ws->parent); } else { struct sway_container *parent = container_destroy(view->swayc); arrange_windows(parent); } + if (parent->type >= C_WORKSPACE) { // if the workspace still exists + workspace_detect_urgent(ws); + } transaction_commit_dirty(); view->surface = NULL; } @@ -1073,7 +1078,7 @@ void view_set_urgent(struct sway_view *view, bool enable) { ipc_event_window(view->swayc, "urgent"); struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); - ipc_event_workspace(NULL, ws, "urgent"); + workspace_detect_urgent(ws); } bool view_is_urgent(struct sway_view *view) { -- cgit v1.2.3