Introduce special value __focused__ for criterion con_id.

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
This commit is contained in:
Ingo Bürk 2015-10-22 15:38:23 +02:00
parent 9537ada5ad
commit 60158d31a2
3 changed files with 28 additions and 1 deletions

View File

@ -1664,7 +1664,8 @@ con_mark::
mark. mark.
con_id:: con_id::
Compares the i3-internal container ID, which you can get via the IPC 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 The criteria +class+, +instance+, +role+, +title+, +workspace+ and +mark+ are
actually regular expressions (PCRE). See +pcresyntax(3)+ or +perldoc perlre+ for actually regular expressions (PCRE). See +pcresyntax(3)+ or +perldoc perlre+ for

View 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(ctype, "con_id") == 0) {
if (strcmp(cvalue, "__focused__") == 0) {
match->con_id = focused;
return;
}
char *end; char *end;
long parsed = strtol(cvalue, &end, 10); long parsed = strtol(cvalue, &end, 10);
if (parsed == LONG_MIN || if (parsed == LONG_MIN ||

View File

@ -91,6 +91,27 @@ is_deeply(get_mark_for_window_on_workspace($ws, $con), [ 'A', 'B', 'C' ], 'match
cmd 'unmark'; 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; done_testing;