Introduce a new syntax for the 'assign' command:
Instead of using a quoted string to specify the class / title, the assign command now uses criteria, just like the for_window command or the command scopes. An example comes here: # Assign all Chromium windows (including popups) to workspace 1: www assign [class="^Chromium$"] → 1: www # Make the main browser window borderless for_window [class="^Chromium$" title=" - Chromium$"] border none This gives you more control over the matching process due to various reasons: 1) Criteria work case-sensitive by default. Use the (?i) option if you want a case-insensitive match, like this: assign [class="(?i)^ChroMIUM$"] → 1 2) class and instance of WM_CLASS can now be matched separately. For example, when starting urxvt -name irssi, xprop will report this: WM_CLASS(STRING) = "irssi", "URxvt" The first part of this is the instance ("irssi"), the second part is the class ("URxvt"). An appropriate assignment looks like this: assign [class="^URxvt$" instance="irssi"] → 2 3) You can now freely use a forward slash (/) in all strings since that is no longer used to separate class from title (in-band signaling is bad, mhkay?).
This commit is contained in:
parent
d03dffe012
commit
e47e100819
@ -75,6 +75,14 @@ EOL (\r?\n)
|
|||||||
|
|
||||||
|
|
||||||
<FOR_WINDOW_COND>"]" { yy_pop_state(); return ']'; }
|
<FOR_WINDOW_COND>"]" { yy_pop_state(); return ']'; }
|
||||||
|
<ASSIGN_COND>"[" {
|
||||||
|
/* this is the case for the new assign syntax
|
||||||
|
* that uses criteria */
|
||||||
|
yy_pop_state();
|
||||||
|
yy_push_state(FOR_WINDOW_COND);
|
||||||
|
/* afterwards we will be in ASSIGN_TARGET_COND */
|
||||||
|
return '[';
|
||||||
|
}
|
||||||
<EAT_WHITESPACE>[ \t]* { yy_pop_state(); }
|
<EAT_WHITESPACE>[ \t]* { yy_pop_state(); }
|
||||||
<WANT_QSTRING>\"[^\"]+\" {
|
<WANT_QSTRING>\"[^\"]+\" {
|
||||||
yy_pop_state();
|
yy_pop_state();
|
||||||
@ -194,7 +202,7 @@ title { yy_push_state(WANT_QSTRING); return TOK_TITLE;
|
|||||||
yylval.string = copy;
|
yylval.string = copy;
|
||||||
return QUOTEDSTRING;
|
return QUOTEDSTRING;
|
||||||
}
|
}
|
||||||
<ASSIGN_COND>[^ \t\"]+ { BEGIN(ASSIGN_TARGET_COND); yylval.string = sstrdup(yytext); return STR_NG; }
|
<ASSIGN_COND>[^ \t\"\[]+ { BEGIN(ASSIGN_TARGET_COND); yylval.string = sstrdup(yytext); return STR_NG; }
|
||||||
<BINDSYM_COND>[a-zA-Z0-9_]+ { yylval.string = sstrdup(yytext); return WORD; }
|
<BINDSYM_COND>[a-zA-Z0-9_]+ { yylval.string = sstrdup(yytext); return WORD; }
|
||||||
[a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; }
|
[a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; }
|
||||||
. { return (int)yytext[0]; }
|
. { return (int)yytext[0]; }
|
||||||
|
@ -1137,6 +1137,15 @@ assign:
|
|||||||
assignment->dest.workspace = workspace;
|
assignment->dest.workspace = workspace;
|
||||||
TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
|
TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
|
||||||
}
|
}
|
||||||
|
| TOKASSIGN match STR
|
||||||
|
{
|
||||||
|
printf("new assignment, using above criteria, to workspace %s\n", $3);
|
||||||
|
Assignment *assignment = scalloc(sizeof(Assignment));
|
||||||
|
assignment->match = current_match;
|
||||||
|
assignment->type = A_TO_WORKSPACE;
|
||||||
|
assignment->dest.workspace = $3;
|
||||||
|
TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
window_class:
|
window_class:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user