]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'fix-instance-criterion'
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 4 Aug 2011 18:11:40 +0000 (20:11 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 4 Aug 2011 18:11:40 +0000 (20:11 +0200)
src/cfgparse.l
src/cfgparse.y
src/cmdparse.l
src/cmdparse.y
testcases/t/65-for_window.t

index 2e1d240af58bf21a76e5f5e3e75f2b720c4ee422..4cf1a1c3777a5fd1f7a115c7cf85b3123764e055 100644 (file)
@@ -167,6 +167,7 @@ ctrl                            { return TOKCONTROL; }
 shift                           { return TOKSHIFT; }
 
 class                           { yy_push_state(WANT_QSTRING); return TOK_CLASS; }
+instance                        { yy_push_state(WANT_QSTRING); return TOK_INSTANCE; }
 id                              { yy_push_state(WANT_QSTRING); return TOK_ID; }
 con_id                          { yy_push_state(WANT_QSTRING); return TOK_CON_ID; }
 con_mark                        { yy_push_state(WANT_QSTRING); return TOK_MARK; }
index 38f306e9ef24e09be921a61ad8790688b0e54148..59b22c6c9ef15a9188e8e9f35fb4b97ece1772e8 100644 (file)
@@ -547,6 +547,7 @@ void parse_file(const char *f) {
 
 %token              TOK_MARK            "mark"
 %token              TOK_CLASS           "class"
+%token              TOK_INSTANCE        "instance"
 %token              TOK_ID              "id"
 %token              TOK_CON_ID          "con_id"
 %token              TOK_TITLE           "title"
@@ -694,6 +695,11 @@ criterion:
         printf("criteria: class = %s\n", $3);
         current_match.class = $3;
     }
+    | TOK_INSTANCE '=' STR
+    {
+        printf("criteria: instance = %s\n", $3);
+        current_match.instance = $3;
+    }
     | TOK_CON_ID '=' STR
     {
         printf("criteria: id = %s\n", $3);
index 898416c2443485d9228bf3d227600c9b651ad049..6c756b0d42850db11a014c5b1838ec3e21704ec4 100644 (file)
@@ -153,6 +153,7 @@ false                           { return TOK_DISABLE; }
 no                              { return TOK_DISABLE; }
 
 class                           { BEGIN(WANT_QSTRING); return TOK_CLASS; }
+instance                        { BEGIN(WANT_QSTRING); return TOK_INSTANCE; }
 id                              { BEGIN(WANT_QSTRING); return TOK_ID; }
 con_id                          { BEGIN(WANT_QSTRING); return TOK_CON_ID; }
 con_mark                        { BEGIN(WANT_QSTRING); return TOK_MARK; }
index e115f3e52293a8d958af635ef584f8d38d369cde..32558f2ea6af5f7b94a122451aa0e11340a3703d 100644 (file)
@@ -175,6 +175,7 @@ bool definitelyGreaterThan(float a, float b, float epsilon) {
 %token              TOK_NOP             "nop"
 
 %token              TOK_CLASS           "class"
+%token              TOK_INSTANCE        "instance"
 %token              TOK_ID              "id"
 %token              TOK_CON_ID          "con_id"
 %token              TOK_TITLE           "title"
@@ -300,6 +301,11 @@ criterion:
         printf("criteria: class = %s\n", $3);
         current_match.class = $3;
     }
+    | TOK_INSTANCE '=' STR
+    {
+        printf("criteria: instance = %s\n", $3);
+        current_match.instance = $3;
+    }
     | TOK_CON_ID '=' STR
     {
         printf("criteria: id = %s\n", $3);
index f156f11b38b5c0690419a611162e4200f1125626..2fb85dfaf2c2fc94c6fc37c9e10b58d88326f75c 100644 (file)
@@ -244,6 +244,73 @@ cmp_ok(@content, '==', 1, 'one node on this workspace now');
 is($content[0]->{border}, 'normal', 'no border');
 
 
+exit_gracefully($process->pid);
+
+##############################################################
+# 5: check that a class criterion does not match the instance
+##############################################################
+
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [class="foo"] border 1pixel
+EOT
+
+$process = launch_with_config($config);
+
+$tmp = fresh_workspace;
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->_create;
+
+set_wm_class($window->id, 'bar', 'foo');
+$window->name('usethis');
+$window->map;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'normal', 'normal border, not matched');
+
+exit_gracefully($process->pid);
+
+##############################################################
+# 6: check that the 'instance' criterion works
+##############################################################
+
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+for_window [class="foo"] border 1pixel
+for_window [instance="foo"] border none
+EOT
+
+$process = launch_with_config($config);
+
+$tmp = fresh_workspace;
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->_create;
+
+set_wm_class($window->id, 'bar', 'foo');
+$window->name('usethis');
+$window->map;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'none', 'no border');
+
 exit_gracefully($process->pid);
 
 done_testing;