]> git.sur5r.net Git - i3/i3/commitdiff
scratchpad_show focus unfocused scratchpad window
authorSascha Kruse <knopwob@googlemail.com>
Mon, 28 Jan 2013 09:11:53 +0000 (10:11 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 30 Jan 2013 12:33:55 +0000 (13:33 +0100)
When there's an unfocused scratchpad window on the current workspace
scratchpad_show will focus that scratchpad window.

src/scratchpad.c
testcases/t/185-scratchpad.t

index bf43d403cf03d432b8bc89a96842da06f3bad79b..8b96521704eb80dc8c87f2c52f94df86eb7f7c25 100644 (file)
@@ -89,10 +89,27 @@ void scratchpad_show(Con *con) {
     }
 
     /* If this was 'scratchpad show' without criteria, we check if there is a
-     * visible scratchpad window on another workspace. In this case we move it
-     * to the current workspace. */
+     * unfocused scratchpad on the current workspace and focus it */
     Con *walk_con;
     Con *focused_ws = con_get_workspace(focused);
+    TAILQ_FOREACH(walk_con, &(focused_ws->floating_head), floating_windows) {
+        if ((floating = con_inside_floating(walk_con)) &&
+            floating->scratchpad_state != SCRATCHPAD_NONE &&
+            floating != con_inside_floating(focused)) {
+                DLOG("Found an unfocused scratchpad window on this workspace\n");
+                DLOG("Focusing it: %p\n", walk_con);
+                /* use con_descend_tiling_focused to get the last focused
+                 * window inside this scratch container in order to
+                 * keep the focus the same within this container */
+                con_focus(con_descend_tiling_focused(walk_con));
+                return;
+            }
+    }
+
+    /* If this was 'scratchpad show' without criteria, we check if there is a
+     * visible scratchpad window on another workspace. In this case we move it
+     * to the current workspace. */
+    focused_ws = con_get_workspace(focused);
     TAILQ_FOREACH(walk_con, &all_cons, all_cons) {
         Con *walk_ws = con_get_workspace(walk_con);
         if (walk_ws &&
index 598f2b360e6a05a27f7b4ef520347ccd1a605395..d3994300ec400098121c4978f496bf9331d99a69 100644 (file)
@@ -400,6 +400,28 @@ $second = fresh_workspace;
 verify_scratchpad_move_with_visible_scratch_con($first, $second, 0);
 does_i3_live;
 
+
+################################################################################
+# 13: Test whether scratchpad show moves focus to the scratchpad window
+# when another window on the same workspace has focus
+################################################################################
+
+clear_scratchpad;
+my $ws = fresh_workspace;
+
+open_window;
+my $scratch = get_focused($ws);
+cmd 'move scratchpad';
+cmd 'scratchpad show';
+
+open_window;
+my $not_scratch = get_focused($ws);
+is(get_focused($ws), $not_scratch, 'not scratch window has focus');
+
+cmd 'scratchpad show';
+
+is(get_focused($ws), $scratch, 'scratchpad is focused');
+
 # TODO: make i3bar display *something* when a window on the scratchpad has the urgency hint
 
 done_testing;