Fix workspaces' and window's urgency on window move
Patch status: needinfo
Patch by Yuriy Taraday
Long description:
- window keeps urgent flag if it's moved to another workspace; - old workspace's urgent flag is unset if it was the only urgent window in this workspace; - target workspace's urgent flag is set if the window is urgent. Fixes bug #1187
To apply this patch, use:
curl http://cr.i3wm.org/patch/429/raw.patch | git am
b/src/con.c
| 20 |
@@ -765,11 +765,21 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool |
| 21 |
* new workspace is hidden and it's necessary to immediately switch |
| 22 |
* back to the originally-focused workspace. */ |
| 23 |
Con *old_focus = TAILQ_FIRST(&(output_get_content(dest_output)->focus_head)); |
| 24 |
+ /* We need to keep urgency flag in case we're not planning to keep |
| 25 |
+ * focus on this container. */ |
| 26 |
+ bool con_urgent = con->urgent; |
| 27 |
con_focus(con_descend_focused(con)); |
| 28 |
|
| 29 |
/* Restore focus if the output's focused workspace has changed. */ |
| 30 |
- if (con_get_workspace(focused) != old_focus) |
| 31 |
+ if (con_get_workspace(focused) != old_focus) {
|
| 32 |
con_focus(old_focus); |
| 33 |
+ /* If the container was urgent we should reraise urgency flag */ |
| 34 |
+ if (con_urgent) {
|
| 35 |
+ con->urgent = true; |
| 36 |
+ con_update_parents_urgency(con); |
| 37 |
+ workspace_update_urgent_flag(workspace); |
| 38 |
+ } |
| 39 |
+ } |
| 40 |
} |
| 41 |
|
| 42 |
/* 8: when moving to another workspace, we leave the focus on the current |
| 43 |
@@ -818,6 +828,9 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool |
| 44 |
} |
| 45 |
|
| 46 |
CALL(parent, on_remove_child); |
| 47 |
+ /* This would clear urgency flag from workspace if we just moved the only |
| 48 |
+ * urgent container out of it. */ |
| 49 |
+ workspace_update_urgent_flag(current_ws); |
| 50 |
} |
| 51 |
|
| 52 |
/* |
b/testcases/t/113-urgent.t
| 57 |
@@ -307,6 +307,22 @@ for ($type = 1; $type <= 2; $type++) {
|
| 58 |
my $ws = get_ws($tmp); |
| 59 |
ok(!$ws->{urgent}, 'urgent flag not set on workspace');
|
| 60 |
|
| 61 |
+############################################################################## |
| 62 |
+# Check if urgent flag migrates with a window to a new workspace |
| 63 |
+############################################################################## |
| 64 |
+ my $ws1 = fresh_workspace; |
| 65 |
+ my $ws2 = fresh_workspace; |
| 66 |
+ cmd "workspace $ws1"; |
| 67 |
+ my $w1 = open_window; |
| 68 |
+ my $w2 = open_window; |
| 69 |
+ set_urgency($w1, 1, $type); |
| 70 |
+ sync_with_i3; |
| 71 |
+ cmd '[id="' . $w1->id . '"] move to workspace ' . $ws2; |
| 72 |
+ my $w = get_ws($ws1); |
| 73 |
+ ok(!$w->{urgent}, 'Workspace we migrated window from is not urgent anymore');
|
| 74 |
+ my $w = get_ws($ws2); |
| 75 |
+ ok($w->{urgent}, 'Workspace we migrated window to is now urgent');
|
| 76 |
+ |
| 77 |
exit_gracefully($pid); |
| 78 |
} |
| 79 |
|