]> git.sur5r.net Git - i3/i3/commitdiff
Introduce special value __focused__ for criterion con_id. 2018/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Thu, 22 Oct 2015 13:38:23 +0000 (15:38 +0200)
committerIngo Bürk <ingo.buerk@tngtech.com>
Thu, 22 Oct 2015 13:46:55 +0000 (15:46 +0200)
This allows matching with

    [con_id=__focused__] unmark

for commands that do not default to operating on the focused window
if no criteria have been specified (such as unmark).

relates to #2014

docs/userguide
src/match.c
testcases/t/255-multiple-marks.t

index 21caae6eabcd923fbfe05a35bf4d6278082d4757..0d63269f861401b11f8d8d86932eda5755f8f353 100644 (file)
@@ -1664,7 +1664,8 @@ con_mark::
         mark.
 con_id::
        Compares the i3-internal container ID, which you can get via the IPC
-       interface. Handy for scripting.
+       interface. Handy for scripting. Use the special value +\_\_focused__+
+       to match only the currently focused window.
 
 The criteria +class+, +instance+, +role+, +title+, +workspace+ and +mark+ are
 actually regular expressions (PCRE). See +pcresyntax(3)+ or +perldoc perlre+ for
index 67054dae42960035d4e7b6e351d917b94bd3efed..8da3c1eaaa1cb05c1780ddc6a0b4b8dc3d5017ad 100644 (file)
@@ -279,6 +279,11 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
     }
 
     if (strcmp(ctype, "con_id") == 0) {
+        if (strcmp(cvalue, "__focused__") == 0) {
+            match->con_id = focused;
+            return;
+        }
+
         char *end;
         long parsed = strtol(cvalue, &end, 10);
         if (parsed == LONG_MIN ||
index 925e39db656c126e7cecc10115e256a06a054072..2269f0d809b9d07caef40a99228c600dd4bdabef 100644 (file)
@@ -91,6 +91,27 @@ is_deeply(get_mark_for_window_on_workspace($ws, $con), [ 'A', 'B', 'C' ], 'match
 
 cmd 'unmark';
 
+###############################################################################
+# Verify that "unmark" can be matched on the focused window.
+###############################################################################
+
+$ws = fresh_workspace;
+$con = open_window;
+cmd 'mark --add A';
+cmd 'mark --add B';
+open_window;
+cmd 'mark --add C';
+cmd 'mark --add D';
+
+is_deeply(sort(get_marks()), [ 'A', 'B', 'C', 'D' ], 'all marks exist');
+
+cmd '[con_id=__focused__] unmark';
+
+is_deeply(sort(get_marks()), [ 'A', 'B' ], 'marks on the unfocused window still exist');
+is_deeply(get_mark_for_window_on_workspace($ws, $con), [ 'A', 'B' ], 'matching on con_id=__focused__ works for unmark');
+
+cmd 'unmark';
+
 ###############################################################################
 
 done_testing;