diff --git a/src/con.c b/src/con.c index b610b0c6..41dd0196 100644 --- a/src/con.c +++ b/src/con.c @@ -736,6 +736,9 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool } } + /* Save the urgency state so that we can restore it. */ + bool urgent = con->urgent; + /* Save the current workspace. So we can call workspace_show() by the end * of this function. */ Con *current_ws = con_get_workspace(focused); @@ -843,7 +846,7 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool if (source_ws == current_ws) con_focus(con_descend_focused(focus_next)); - /* If anything within the container is associated with a startup sequence, + /* 9. If anything within the container is associated with a startup sequence, * delete it so child windows won't be created on the old workspace. */ struct Startup_Sequence *sequence; xcb_get_property_cookie_t cookie; @@ -877,6 +880,12 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool CALL(parent, on_remove_child); + /* 10. If the container was marked urgent, move the urgency hint. */ + if (urgent) { + workspace_update_urgent_flag(source_ws); + con_set_urgency(con, true); + } + ipc_send_window_event("move", con); } diff --git a/testcases/t/113-urgent.t b/testcases/t/113-urgent.t index bb913819..3b82fe22 100644 --- a/testcases/t/113-urgent.t +++ b/testcases/t/113-urgent.t @@ -307,6 +307,33 @@ for ($type = 1; $type <= 2; $type++) { my $ws = get_ws($tmp); ok(!$ws->{urgent}, 'urgent flag not set on workspace'); +############################################################################## +# Regression test for #1187: Urgency hint moves to new workspace when moving +# a container to another workspace. +############################################################################## + + my $tmp_source = fresh_workspace; + my $tmp_target = fresh_workspace; + cmd 'workspace ' . $tmp_source; + sync_with_i3; + my $w1 = open_window; + my $w2 = open_window; + sync_with_i3; + cmd '[id="' . $w1->id . '"] focus'; + sync_with_i3; + cmd 'mark urgent_con'; + cmd '[id="' . $w2->id . '"] focus'; + set_urgency($w1, 1, $type); + sync_with_i3; + cmd '[con_mark="urgent_con"] move container to workspace ' . $tmp_target; + sync_with_i3; + my $source_ws = get_ws($tmp_source); + my $target_ws = get_ws($tmp_target); + ok(!$source_ws->{urgent}, 'Source workspace is no longer marked urgent'); + is($target_ws->{urgent}, 1, 'Target workspace is now marked urgent'); + +############################################################################## + exit_gracefully($pid); }