]> git.sur5r.net Git - i3/i3/commitdiff
Added new criteria 'tiling' / 'floating'. (#2481)
authorIngo Bürk <admin@airblader.de>
Wed, 28 Sep 2016 02:04:00 +0000 (04:04 +0200)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Wed, 28 Sep 2016 02:04:00 +0000 (19:04 -0700)
These criteria allow selecting only windows in a specific mode, i.e.,
tiling and floating, respectively.

fixes #2406

docs/userguide
include/data.h
parser-specs/commands.spec
parser-specs/config.spec
src/match.c
testcases/t/165-for_window.t

index 9472fdd7f0099df0c093c62f8dae19524ea57b83..93c544678559991e138bd03d8a8e4ea6b9185f2a 100644 (file)
@@ -1679,6 +1679,9 @@ bindsym $mod+x [class="Firefox" window_role="About"] kill
 
 # enable floating mode and move container to workspace 4
 for_window [class="^evil-app$"] floating enable, move container to workspace 4
+
+# move all floating windows to the scratchpad
+bindsym $mod+x [floating] move scratchpad
 ------------------------------------
 
 The criteria which are currently implemented are:
@@ -1721,6 +1724,10 @@ con_id::
        Compares the i3-internal container ID, which you can get via the IPC
        interface. Handy for scripting. Use the special value +\_\_focused__+
        to match only the currently focused window.
+floating::
+       Only matches floating windows. This criterion requires no value.
+tiling::
+       Only matches tiling windows. This criterion requires no value.
 
 The criteria +class+, +instance+, +role+, +title+, +workspace+ and +mark+ are
 actually regular expressions (PCRE). See +pcresyntax(3)+ or +perldoc perlre+ for
index 247cd3c50af134ec12c769688303464a7d69153c..70edd2223da2206a801dbf837985ad8d9002fd43 100644 (file)
@@ -474,9 +474,9 @@ struct Match {
         M_DOCK_BOTTOM = 3
     } dock;
     xcb_window_t id;
-    enum { M_ANY = 0,
-           M_TILING,
-           M_FLOATING } floating;
+    enum { WM_ANY = 0,
+           WM_TILING,
+           WM_FLOATING } window_mode;
     Con *con_id;
 
     /* Where the window looking for a match should be inserted:
index ec7fbabf9907474451980bfd1e5ef14417b4c506..d4b3dbc61b066c9d57807719d02f93e1f8d1b5c2 100644 (file)
@@ -53,6 +53,8 @@ state CRITERIA:
   ctype = 'title'       -> CRITERION
   ctype = 'urgent'      -> CRITERION
   ctype = 'workspace'   -> CRITERION
+  ctype = 'tiling', 'floating'
+      -> call cmd_criteria_add($ctype, NULL); CRITERIA
   ']' -> call cmd_criteria_match_windows(); INITIAL
 
 state CRITERION:
index eeafaac868c1b42962a70ff406ef8a68c064aca5..9029681983791be93000e7566ec0c5c6763c3d03 100644 (file)
@@ -173,6 +173,8 @@ state CRITERIA:
   ctype = 'title'       -> CRITERION
   ctype = 'urgent'      -> CRITERION
   ctype = 'workspace'   -> CRITERION
+  ctype = 'tiling', 'floating'
+      -> call cfg_criteria_add($ctype, NULL); CRITERIA
   ']'
       -> call cfg_criteria_pop_state()
 
index ba87eb236fb8fe737255b54391eb394f1268e801..ac9ddaf98168a3b3af0eed29e73c6023b27c3067 100644 (file)
@@ -28,6 +28,7 @@
 void match_init(Match *match) {
     memset(match, 0, sizeof(Match));
     match->urgent = U_DONTCHECK;
+    match->window_mode = WM_ANY;
     /* we use this as the placeholder value for "not set". */
     match->window_type = UINT32_MAX;
 }
@@ -53,7 +54,7 @@ bool match_is_empty(Match *match) {
             match->window_type == UINT32_MAX &&
             match->con_id == NULL &&
             match->dock == M_NODOCK &&
-            match->floating == M_ANY);
+            match->window_mode == WM_ANY);
 }
 
 /*
@@ -243,6 +244,21 @@ bool match_matches_window(Match *match, i3Window *window) {
         }
     }
 
+    if (match->window_mode != WM_ANY) {
+        if ((con = con_by_window_id(window->id)) == NULL)
+            return false;
+
+        const bool floating = (con_inside_floating(con) != NULL);
+
+        if ((match->window_mode == WM_TILING && floating) ||
+            (match->window_mode == WM_FLOATING && !floating)) {
+            LOG("window_mode does not match\n");
+            return false;
+        }
+
+        LOG("window_mode matches\n");
+    }
+
     return true;
 }
 
@@ -384,5 +400,15 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
         return;
     }
 
+    if (strcmp(ctype, "tiling") == 0) {
+        match->window_mode = WM_TILING;
+        return;
+    }
+
+    if (strcmp(ctype, "floating") == 0) {
+        match->window_mode = WM_FLOATING;
+        return;
+    }
+
     ELOG("Unknown criterion: %s\n", ctype);
 }
index 025fe21cc9fe1d7630af45c4e9eab2abc56a173f..bc3df1145c215a4c61677ea9c0e5efd8f1aedd1a 100644 (file)
@@ -459,6 +459,33 @@ is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'triggered' ], "mark set for workspa
 
 exit_gracefully($pid);
 
+##############################################################
+# 13: check that the tiling / floating criteria work.
+##############################################################
+
+$config = <<"EOT";
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [tiling] mark tiled
+for_window [floating] mark floated
+EOT
+
+$pid = launch_with_config($config);
+$tmp = fresh_workspace;
+
+open_window;
+open_floating_window;
+
+@nodes = @{get_ws($tmp)->{nodes}};
+cmp_ok(@nodes, '==', 1, 'one tiling container on this workspace');
+is_deeply($nodes[0]->{marks}, [ 'tiled' ], "mark set for 'tiling' criterion");
+
+@nodes = @{get_ws($tmp)->{floating_nodes}};
+cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
+is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'floated' ], "mark set for 'floating' criterion");
+
+exit_gracefully($pid);
+
 ##############################################################
 
 done_testing;