From c2ed3d8bd6e2ec12f2ce70d7e106c09a7078e91f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 20 Jul 2018 19:37:27 +1000 Subject: Implement force_display_urgency_hint The directive sets the timeout before an urgent view becomes normal again after switching to it from another workspace. Also: * When an xwayland surface removes the urgent hint while the timer is active, we now ignore the request. This happens as soon as the view receives focus, so it was effectively making the timer pointless. * The timeout is now only applied when switching to it from another workspace. --- sway/commands/force_display_urgency_hint.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 sway/commands/force_display_urgency_hint.c (limited to 'sway/commands') diff --git a/sway/commands/force_display_urgency_hint.c b/sway/commands/force_display_urgency_hint.c new file mode 100644 index 00000000..a25ffff8 --- /dev/null +++ b/sway/commands/force_display_urgency_hint.c @@ -0,0 +1,28 @@ +#include "log.h" +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/arrange.h" +#include "sway/tree/container.h" +#include "sway/tree/view.h" +#include "sway/tree/layout.h" + +struct cmd_results *cmd_force_display_urgency_hint(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "force_display_urgency_hint", + EXPECTED_AT_LEAST, 1))) { + return error; + } + + char *err; + int timeout = (int)strtol(argv[0], &err, 10); + if (*err) { + if (strcmp(err, "ms") != 0) { + return cmd_results_new(CMD_INVALID, "force_display_urgency_hint", + "Expected 'force_display_urgency_hint ms'"); + } + } + + config->urgent_timeout = timeout > 0 ? timeout : 0; + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} -- cgit v1.2.3 From 37b33f92e8cd94984c4e3c8c851f5dfdacbe14f5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 21 Jul 2018 10:27:40 +1000 Subject: Fix urgent timer logic and remove unnecessary header includes --- sway/commands/force_display_urgency_hint.c | 5 ----- sway/input/seat.c | 16 ++++++++++------ 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'sway/commands') diff --git a/sway/commands/force_display_urgency_hint.c b/sway/commands/force_display_urgency_hint.c index a25ffff8..5e5e2d55 100644 --- a/sway/commands/force_display_urgency_hint.c +++ b/sway/commands/force_display_urgency_hint.c @@ -1,10 +1,5 @@ -#include "log.h" #include "sway/commands.h" #include "sway/config.h" -#include "sway/tree/arrange.h" -#include "sway/tree/container.h" -#include "sway/tree/view.h" -#include "sway/tree/layout.h" struct cmd_results *cmd_force_display_urgency_hint(int argc, char **argv) { struct cmd_results *error = NULL; diff --git a/sway/input/seat.c b/sway/input/seat.c index 816429d3..e77d88a8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -677,16 +677,20 @@ void seat_set_focus_warp(struct sway_seat *seat, } } - // If urgent, start a timer to unset it + // If urgent, either unset the urgency or start a timer to unset it if (container && container->type == C_VIEW && - last_workspace && last_workspace != new_workspace && view_is_urgent(container->sway_view) && - config->urgent_timeout > 0 && !container->sway_view->urgent_timer) { struct sway_view *view = container->sway_view; - view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, - handle_urgent_timeout, view); - wl_event_source_timer_update(view->urgent_timer, config->urgent_timeout); + if (last_workspace && last_workspace != new_workspace && + config->urgent_timeout > 0) { + view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, + handle_urgent_timeout, view); + wl_event_source_timer_update(view->urgent_timer, + config->urgent_timeout); + } else { + view_set_urgent(view, false); + } } // If we've focused a floating container, bring it to the front. -- cgit v1.2.3