scratchpad_show focus unfocused scratchpad window
Patch status: merged
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/26/raw.patch | git am
b/src/scratchpad.c
| 16 |
@@ -89,10 +89,27 @@ 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 |
+ * unfocused scratchpad on the current workspace and focus it */ |
| 23 |
Con *walk_con; |
| 24 |
Con *focused_ws = con_get_workspace(focused); |
| 25 |
+ TAILQ_FOREACH(walk_con, &(focused_ws->floating_head), floating_windows) {
|
| 26 |
+ if ((floating = con_inside_floating(walk_con)) && |
| 27 |
+ floating->scratchpad_state != SCRATCHPAD_NONE && |
| 28 |
+ floating != con_inside_floating(focused)) {
|
| 29 |
+ DLOG("Found an unfocused scratchpad window on this workspace\n");
|
| 30 |
+ DLOG("Focusing it: %p\n", walk_con);
|
| 31 |
+ /* use con_descend_tiling_focused to get the last focused |
| 32 |
+ * window inside this scratch container in order to |
| 33 |
+ * keep the focus the same within this container */ |
| 34 |
+ con_focus(con_descend_tiling_focused(walk_con)); |
| 35 |
+ return; |
| 36 |
+ } |
| 37 |
+ } |
| 38 |
+ |
| 39 |
+ /* If this was 'scratchpad show' without criteria, we check if there is a |
| 40 |
+ * visible scratchpad window on another workspace. In this case we move it |
| 41 |
+ * to the current workspace. */ |
| 42 |
+ focused_ws = con_get_workspace(focused); |
| 43 |
TAILQ_FOREACH(walk_con, &all_cons, all_cons) {
|
| 44 |
Con *walk_ws = con_get_workspace(walk_con); |
| 45 |
if (walk_ws && |
b/testcases/t/185-scratchpad.t
| 50 |
@@ -400,6 +400,28 @@ $second = fresh_workspace; |
| 51 |
verify_scratchpad_move_with_visible_scratch_con($first, $second, 0); |
| 52 |
does_i3_live; |
| 53 |
|
| 54 |
+ |
| 55 |
+################################################################################ |
| 56 |
+# 13: Test whether scratchpad show moves focus to the scratchpad window |
| 57 |
+# when another window on the same workspace has focus |
| 58 |
+################################################################################ |
| 59 |
+ |
| 60 |
+clear_scratchpad; |
| 61 |
+my $ws = fresh_workspace; |
| 62 |
+ |
| 63 |
+open_window; |
| 64 |
+my $scratch = get_focused($ws); |
| 65 |
+cmd 'move scratchpad'; |
| 66 |
+cmd 'scratchpad show'; |
| 67 |
+ |
| 68 |
+open_window; |
| 69 |
+my $not_scratch = get_focused($ws); |
| 70 |
+is(get_focused($ws), $not_scratch, 'not scratch window has focus'); |
| 71 |
+ |
| 72 |
+cmd 'scratchpad show'; |
| 73 |
+ |
| 74 |
+is(get_focused($ws), $scratch, 'scratchpad is focused'); |
| 75 |
+ |
| 76 |
# TODO: make i3bar display *something* when a window on the scratchpad has the urgency hint |
| 77 |
|
| 78 |
done_testing; |