From 9aa7e5fbd6f0ed02bc0edd34cf7cd28bf1eacd85 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 8 Jun 2011 23:34:08 +0200 Subject: [PATCH] Parse multiple criteria in commands (+test), better error message for 'focus' --- src/cmdparse.l | 1 + src/cmdparse.y | 27 ++++++++++++++++++++++----- testcases/t/11-goto.t | 11 ++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/cmdparse.l b/src/cmdparse.l index 91aed5e3..ba2789f2 100644 --- a/src/cmdparse.l +++ b/src/cmdparse.l @@ -143,6 +143,7 @@ class { BEGIN(WANT_QSTRING); return TOK_CLASS; } id { BEGIN(WANT_QSTRING); return TOK_ID; } con_id { BEGIN(WANT_QSTRING); return TOK_CON_ID; } con_mark { BEGIN(WANT_QSTRING); return TOK_MARK; } +title { BEGIN(WANT_QSTRING); return TOK_TITLE; } [0-9]+ { cmdyylval.number = atoi(yytext); return NUMBER; } diff --git a/src/cmdparse.y b/src/cmdparse.y index 08f02c61..c33a145b 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -162,6 +162,7 @@ char *parse_cmd(const char *new) { %token TOK_CLASS "class" %token TOK_ID "id" %token TOK_CON_ID "con_id" +%token TOK_TITLE "title" %token STR "" %token NUMBER "" @@ -271,6 +272,11 @@ matchend: ; criteria: + criteria criterion + | criterion + ; + +criterion: TOK_CLASS '=' STR { printf("criteria: class = %s\n", $3); @@ -311,6 +317,11 @@ criteria: printf("criteria: mark = %s\n", $3); current_match.mark = $3; } + | TOK_TITLE '=' STR + { + printf("criteria: title = %s\n", $3); + current_match.title = $3; + } ; operations: @@ -381,20 +392,26 @@ focus: { owindow *current; - printf("should focus\n"); if (match_is_empty(¤t_match)) { - /* TODO: better error message */ - LOG("Error: The focus command requires you to use some criteria.\n"); + ELOG("You have to specify which window/container should be focused.\n"); + ELOG("Example: [class=\"urxvt\" title=\"irssi\"] focus\n"); + + asprintf(&json_output, "{\"success\":false, \"error\":\"You have to " + "specify which window/container should be focused\"}"); break; } - /* TODO: warning if the match contains more than one entry. does not - * make so much sense when focusing */ + int count = 0; TAILQ_FOREACH(current, &owindows, owindows) { LOG("focusing %p / %s\n", current->con, current->con->name); con_focus(current->con); + count++; } + if (count > 1) + LOG("WARNING: Your criteria for the focus command matches %d containers, " + "while only exactly one container can be focused at a time.\n", count); + tree_render(); } | TOK_FOCUS direction diff --git a/testcases/t/11-goto.t b/testcases/t/11-goto.t index 7aebc880..4eedb56c 100644 --- a/testcases/t/11-goto.t +++ b/testcases/t/11-goto.t @@ -1,7 +1,7 @@ #!perl # vim:ts=4:sw=4:expandtab -use i3test tests => 6; +use i3test; use X11::XCB qw(:all); use Digest::SHA1 qw(sha1_base64); @@ -65,4 +65,13 @@ is($focus, $top->id, "Top window focused"); $focus = focus_after(qq|[con_mark="$random_mark"] focus|); is($focus, $mid->id, "goto worked"); +# check that we can specify multiple criteria + +$focus = focus_after('focus left'); +is($focus, $top->id, "Top window focused"); + +$focus = focus_after(qq|[con_mark="$random_mark" con_mark="$random_mark"] focus|); +is($focus, $mid->id, "goto worked"); + + done_testing; -- 2.39.5