mode { return TOK_MODE; }
tiling { return TOK_TILING; }
floating { return TOK_FLOATING; }
-workspace { return TOK_WORKSPACE; }
+workspace { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; }
focus { return TOK_FOCUS; }
move { return TOK_MOVE; }
+open { return TOK_OPEN; }
class { BEGIN(WANT_QSTRING); return TOK_CLASS; }
+id { BEGIN(WANT_QSTRING); return TOK_ID; }
+con_id { BEGIN(WANT_QSTRING); return TOK_CON_ID; }
. { return (int)yytext[0]; }
%token TOK_WORKSPACE "workspace"
%token TOK_FOCUS "focus"
%token TOK_MOVE "move"
+%token TOK_OPEN "open"
%token TOK_CLASS "class"
+%token TOK_ID "id"
+%token TOK_CON_ID "con_id"
%token WHITESPACE "<whitespace>"
%token STR "<string>"
/* copy all_cons */
Con *con;
TAILQ_FOREACH(con, &all_cons, all_cons) {
- if (con->window == NULL)
- continue;
-
owindow *ow = smalloc(sizeof(owindow));
ow->con = con;
TAILQ_INSERT_TAIL(&owindows, ow, owindows);
next = TAILQ_NEXT(next, owindows);
printf("checking if con %p / %s matches\n", current->con, current->con->name);
- if (match_matches_window(¤t_match, current->con->window)) {
- printf("matches!\n");
- TAILQ_INSERT_TAIL(&owindows, current, owindows);
+ if (current_match.con_id != NULL) {
+ if (current_match.con_id == current->con) {
+ printf("matches container!\n");
+ TAILQ_INSERT_TAIL(&owindows, current, owindows);
+
+ }
} else {
- printf("doesnt match\n");
- free(current);
+ if (current->con->window == NULL)
+ continue;
+ if (match_matches_window(¤t_match, current->con->window)) {
+ printf("matches window!\n");
+ TAILQ_INSERT_TAIL(&owindows, current, owindows);
+ } else {
+ printf("doesnt match\n");
+ free(current);
+ }
}
}
printf("criteria: class = %s\n", $<string>3);
current_match.class = $<string>3;
}
+ | TOK_CON_ID '=' STR
+ {
+ printf("criteria: id = %s\n", $<string>3);
+ /* TODO: correctly parse number */
+ current_match.con_id = atoi($<string>3);
+ printf("id as int = %d\n", current_match.con_id);
+ }
;
operations:
| mode
| workspace
| move*/
+ | workspace
| attach
| focus
| kill
+ | open
;
exec:
owindow *current;
printf("killing!\n");
+ /* TODO: check if the match is empty, not if the result is empty */
+ if (TAILQ_EMPTY(&owindows))
+ tree_close(focused);
+ else {
TAILQ_FOREACH(current, &owindows, owindows) {
printf("matching: %p / %s\n", current->con, current->con->name);
tree_close(current->con);
}
+ }
+
+ }
+ ;
+workspace:
+ TOK_WORKSPACE WHITESPACE STR
+ {
+ printf("should switch to workspace %s\n", $<string>3);
+ workspace_show($<string>3);
+ free($<string>3);
+ }
+ ;
+
+open:
+ TOK_OPEN
+ {
+ printf("opening new container\n");
+ tree_open_con(NULL);
}
;
#
# Tests whether opening an empty container and killing it again works
#
-use Test::More tests => 3;
+use Test::More tests => 6;
+use Data::Dumper;
use FindBin;
use lib "$FindBin::Bin/lib";
use i3test;
$i3->command("kill")->recv;
ok(@{get_ws_content($tmp)} == 0, 'container killed');
+##############################################################
+# open two containers and kill the one which is not focused
+# by its ID to test if the parser correctly matches the window
+##############################################################
+
+$i3->command('open')->recv;
+$i3->command('open')->recv;
+ok(@{get_ws_content($tmp)} == 2, 'two containers opened');
+
+my $content = get_ws_content($tmp);
+# TODO: get the focused window, don’t assume that it is
+# the latest one
+my $id = $content->[0]->{id};
+diag('id of not focused = ' . $id);
+
+$i3->command("[con_id=\"$id\"] kill")->recv;
+
+$content = get_ws_content($tmp);
+ok(@{$content} == 1, 'one container killed');
+ok($content->[0]->{id} != $id, 'correct window killed');
+
diag( "Testing i3, Perl $], $^X" );