From: Michael Stapelberg Date: Sun, 11 Sep 2011 20:54:13 +0000 (+0100) Subject: Introduce a new syntax for the 'assign' command: X-Git-Tag: 4.1~166^2~3 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e47e1008193f1f65016a61e3beeb02adc2de0773;p=i3%2Fi3 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?). --- diff --git a/src/cfgparse.l b/src/cfgparse.l index e29f6efc..12840f26 100644 --- a/src/cfgparse.l +++ b/src/cfgparse.l @@ -75,6 +75,14 @@ EOL (\r?\n) "]" { yy_pop_state(); return ']'; } +"[" { + /* 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 '['; + } [ \t]* { yy_pop_state(); } \"[^\"]+\" { yy_pop_state(); @@ -194,7 +202,7 @@ title { yy_push_state(WANT_QSTRING); return TOK_TITLE; yylval.string = copy; return QUOTEDSTRING; } -[^ \t\"]+ { BEGIN(ASSIGN_TARGET_COND); yylval.string = sstrdup(yytext); return STR_NG; } +[^ \t\"\[]+ { BEGIN(ASSIGN_TARGET_COND); yylval.string = sstrdup(yytext); return STR_NG; } [a-zA-Z0-9_]+ { yylval.string = sstrdup(yytext); return WORD; } [a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; } . { return (int)yytext[0]; } diff --git a/src/cfgparse.y b/src/cfgparse.y index ca2d0710..53d23815 100644 --- a/src/cfgparse.y +++ b/src/cfgparse.y @@ -1137,6 +1137,15 @@ assign: assignment->dest.workspace = workspace; 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: