X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcmdparse.y;h=04e8b3ca3f4cb0a8f66337a2132b5e2ceb90223f;hb=1717b88174d26ed946bea0a0038a8a999fc2387f;hp=021b0b83f26be663f2c2183b77b82da0fb266706;hpb=698d97cd02e3b50e0e62add0bf82b2404bba40ef;p=i3%2Fi3 diff --git a/src/cmdparse.y b/src/cmdparse.y index 021b0b83..04e8b3ca 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -149,6 +149,7 @@ bool definitelyGreaterThan(float a, float b, float epsilon) { %token TOK_ENABLE "enable" %token TOK_DISABLE "disable" %token TOK_WORKSPACE "workspace" +%token TOK_OUTPUT "output" %token TOK_TOGGLE "toggle" %token TOK_FOCUS "focus" %token TOK_MOVE "move" @@ -176,6 +177,7 @@ bool definitelyGreaterThan(float a, float b, float epsilon) { %token TOK_CLASS "class" %token TOK_INSTANCE "instance" +%token TOK_WINDOW_ROLE "window_role" %token TOK_ID "id" %token TOK_CON_ID "con_id" %token TOK_TITLE "title" @@ -266,10 +268,9 @@ matchend: } } else if (current_match.mark != NULL && current->con->mark != NULL && - strcasecmp(current_match.mark, current->con->mark) == 0) { + regex_matches(current_match.mark, current->con->mark)) { printf("match by mark\n"); - TAILQ_INSERT_TAIL(&owindows, current, owindows); - + TAILQ_INSERT_TAIL(&owindows, current, owindows); } else { if (current->con->window == NULL) continue; @@ -299,12 +300,20 @@ criterion: TOK_CLASS '=' STR { printf("criteria: class = %s\n", $3); - current_match.class = $3; + current_match.class = regex_new($3); + free($3); } | TOK_INSTANCE '=' STR { printf("criteria: instance = %s\n", $3); - current_match.instance = $3; + current_match.instance = regex_new($3); + free($3); + } + | TOK_WINDOW_ROLE '=' STR + { + printf("criteria: window_role = %s\n", $3); + current_match.role = regex_new($3); + free($3); } | TOK_CON_ID '=' STR { @@ -339,12 +348,14 @@ criterion: | TOK_MARK '=' STR { printf("criteria: mark = %s\n", $3); - current_match.mark = $3; + current_match.mark = regex_new($3); + free($3); } | TOK_TITLE '=' STR { printf("criteria: title = %s\n", $3); - current_match.title = $3; + current_match.title = regex_new($3); + free($3); } ; @@ -533,7 +544,7 @@ kill: else { TAILQ_FOREACH(current, &owindows, owindows) { printf("matching: %p / %s\n", current->con, current->con->name); - tree_close(current->con, $2, false); + tree_close(current->con, $2, false, false); } } @@ -699,7 +710,52 @@ move: TAILQ_FOREACH(current, &owindows, owindows) { printf("matching: %p / %s\n", current->con, current->con->name); - con_move_to_workspace(current->con, ws, false); + con_move_to_workspace(current->con, ws, true, false); + } + + tree_render(); + } + | TOK_MOVE TOK_OUTPUT STR + { + owindow *current; + + printf("should move window to output %s", $3); + + HANDLE_EMPTY_MATCH; + + /* get the output */ + Output *current_output = NULL; + Output *output; + + TAILQ_FOREACH(current, &owindows, owindows) + current_output = get_output_containing(current->con->rect.x, current->con->rect.y); + + assert(current_output != NULL); + + if (strcasecmp($3, "up") == 0) + output = get_output_next(D_UP, current_output); + else if (strcasecmp($3, "down") == 0) + output = get_output_next(D_DOWN, current_output); + else if (strcasecmp($3, "left") == 0) + output = get_output_next(D_LEFT, current_output); + else if (strcasecmp($3, "right") == 0) + output = get_output_next(D_RIGHT, current_output); + else + output = get_output_by_name($3); + free($3); + + if (!output) + break; + + /* get visible workspace on output */ + Con *ws = NULL; + GREP_FIRST(ws, output_get_content(output->con), workspace_is_visible(child)); + if (!ws) + break; + + TAILQ_FOREACH(current, &owindows, owindows) { + printf("matching: %p / %s\n", current->con, current->con->name); + con_move_to_workspace(current->con, ws, true, false); } tree_render(); @@ -811,6 +867,17 @@ resize: double percentage = 1.0 / children; LOG("default percentage = %f\n", percentage); + orientation_t orientation = current->parent->orientation; + + if ((orientation == HORIZ && + (direction == TOK_UP || direction == TOK_DOWN)) || + (orientation == VERT && + (direction == TOK_LEFT || direction == TOK_RIGHT))) { + LOG("You cannot resize in that direction. Your focus is in a %s split container currently.\n", + (orientation == HORIZ ? "horizontal" : "vertical")); + break; + } + if (direction == TOK_UP || direction == TOK_LEFT) { other = TAILQ_PREV(current, nodes_head, nodes); } else { @@ -818,7 +885,7 @@ resize: } if (other == TAILQ_END(workspaces)) { LOG("No other container in this direction found, cannot resize.\n"); - return 0; + break; } LOG("other->percent = %f\n", other->percent); LOG("current->percent before = %f\n", current->percent);