scratchpad_show focus unfocused scratchpad window
Patch status: rejected
Patch by Sascha Kruse
Long description:
When there's an unfocused scratchpad window on the current workspace scratchpad_show will focus that scratchpad window.
To apply this patch, use:
curl http://cr.i3wm.org/patch/23/raw.patch | git am
b/src/scratchpad.c
| 16 |
@@ -89,20 +89,31 @@ void scratchpad_show(Con *con) {
|
| 17 |
} |
| 18 |
|
| 19 |
/* If this was 'scratchpad show' without criteria, we check if there is a |
| 20 |
- * visible scratchpad window on another workspace. In this case we move it |
| 21 |
- * to the current workspace. */ |
| 22 |
+ * visible scratchpad window. If there is one and it's on another workspace |
| 23 |
+ * we move it to the current workspace. If there is one on the current workspace |
| 24 |
+ * but unfocused we focus it */ |
| 25 |
Con *walk_con; |
| 26 |
Con *focused_ws = con_get_workspace(focused); |
| 27 |
TAILQ_FOREACH(walk_con, &all_cons, all_cons) {
|
| 28 |
Con *walk_ws = con_get_workspace(walk_con); |
| 29 |
if (walk_ws && |
| 30 |
- !con_is_internal(walk_ws) && focused_ws != walk_ws && |
| 31 |
+ !con_is_internal(walk_ws) && |
| 32 |
(floating = con_inside_floating(walk_con)) && |
| 33 |
floating->scratchpad_state != SCRATCHPAD_NONE) {
|
| 34 |
- DLOG("Found a visible scratchpad window on another workspace,\n");
|
| 35 |
- DLOG("moving it to this workspace: con = %p\n", walk_con);
|
| 36 |
- con_move_to_workspace(walk_con, focused_ws, true, false); |
| 37 |
- return; |
| 38 |
+ if (focused_ws != walk_ws) {
|
| 39 |
+ DLOG("Found a visible scratchpad window on another workspace,\n");
|
| 40 |
+ DLOG("moving it to this workspace: con = %p\n", walk_con);
|
| 41 |
+ con_move_to_workspace(walk_con, focused_ws, true, false); |
| 42 |
+ return; |
| 43 |
+ } else if (floating != con_inside_floating(focused)) {
|
| 44 |
+ DLOG("Found an unfocused scratchpad window on this workspace\n");
|
| 45 |
+ DLOG("Focusing it: %p\n", walk_con);
|
| 46 |
+ /* use con_descend_tiling_focused to get the last focused |
| 47 |
+ * window inside this scratch container in order to |
| 48 |
+ * keep the focus the same within this container */ |
| 49 |
+ con_focus(con_descend_tiling_focused(walk_con)); |
| 50 |
+ return; |
| 51 |
+ } |
| 52 |
} |
| 53 |
} |
| 54 |
|
b/testcases/t/185-scratchpad.t
| 59 |
@@ -400,6 +400,28 @@ $second = fresh_workspace; |
| 60 |
verify_scratchpad_move_with_visible_scratch_con($first, $second, 0); |
| 61 |
does_i3_live; |
| 62 |
|
| 63 |
+ |
| 64 |
+################################################################################ |
| 65 |
+# 13: Test whether scratchpad show moves focus to the scratchpad window |
| 66 |
+# when another window on the same workspace has focus |
| 67 |
+################################################################################ |
| 68 |
+ |
| 69 |
+clear_scratchpad; |
| 70 |
+my $ws = fresh_workspace; |
| 71 |
+ |
| 72 |
+open_window; |
| 73 |
+my $scratch = get_focused($ws); |
| 74 |
+cmd 'move scratchpad'; |
| 75 |
+cmd 'scratchpad show'; |
| 76 |
+ |
| 77 |
+open_window; |
| 78 |
+my $not_scratch = get_focused($ws); |
| 79 |
+is(get_focused($ws), $not_scratch, 'not scratch window has focus'); |
| 80 |
+ |
| 81 |
+cmd 'scratchpad show'; |
| 82 |
+ |
| 83 |
+is(get_focused($ws), $scratch, 'scratchpad is focused'); |
| 84 |
+ |
| 85 |
# TODO: make i3bar display *something* when a window on the scratchpad has the urgency hint |
| 86 |
|
| 87 |
done_testing; |