From c2b6b06da7db49bd3ecd6fa1561ef2b407ff64a3 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 19 Jun 2014 12:09:31 +0000 Subject: Make command `move [direction]` work with criteria A container selected with criteria should be moved with the `move [direction]` command, instead of this command always acting on the focused container. --- diff --git a/include/move.h b/include/move.h index 5c8a7d2..939665e 100644 --- a/include/move.h +++ b/include/move.h @@ -10,8 +10,8 @@ #pragma once /** - * Moves the current container in the given direction (TOK_LEFT, TOK_RIGHT, + * Moves the given container in the given direction (TOK_LEFT, TOK_RIGHT, * TOK_UP, TOK_DOWN from cmdparse.l) * */ -void tree_move(int direction); +void tree_move(Con *con, int direction); diff --git a/src/commands.c b/src/commands.c index a60dde6..baf1989 100644 --- a/src/commands.c +++ b/src/commands.c @@ -1545,26 +1545,36 @@ void cmd_move_direction(I3_CMD, char *direction, char *move_px) { // TODO: We could either handle this in the parser itself as a separate token (and make the stack typed) or we need a better way to convert a string to a number with error checking int px = atoi(move_px); - /* TODO: make 'move' work with criteria. */ - DLOG("moving in direction %s, px %s\n", direction, move_px); - if (con_is_floating(focused)) { - DLOG("floating move with %d pixels\n", px); - Rect newrect = focused->parent->rect; - if (strcmp(direction, "left") == 0) { - newrect.x -= px; - } else if (strcmp(direction, "right") == 0) { - newrect.x += px; - } else if (strcmp(direction, "up") == 0) { - newrect.y -= px; - } else if (strcmp(direction, "down") == 0) { - newrect.y += px; + owindow *current; + HANDLE_EMPTY_MATCH; + + Con *initially_focused = focused; + + TAILQ_FOREACH (current, &owindows, owindows) { + DLOG("moving in direction %s, px %s\n", direction, move_px); + if (con_is_floating(current->con)) { + DLOG("floating move with %d pixels\n", px); + Rect newrect = current->con->parent->rect; + if (strcmp(direction, "left") == 0) { + newrect.x -= px; + } else if (strcmp(direction, "right") == 0) { + newrect.x += px; + } else if (strcmp(direction, "up") == 0) { + newrect.y -= px; + } else if (strcmp(direction, "down") == 0) { + newrect.y += px; + } + floating_reposition(current->con->parent, newrect); + } else { + tree_move(current->con, (strcmp(direction, "right") == 0 ? D_RIGHT : (strcmp(direction, "left") == 0 ? D_LEFT : (strcmp(direction, "up") == 0 ? D_UP : D_DOWN)))); + cmd_output->needs_tree_render = true; } - floating_reposition(focused->parent, newrect); - } else { - tree_move((strcmp(direction, "right") == 0 ? D_RIGHT : (strcmp(direction, "left") == 0 ? D_LEFT : (strcmp(direction, "up") == 0 ? D_UP : D_DOWN)))); - cmd_output->needs_tree_render = true; } + /* the move command should not disturb focus */ + if (focused != initially_focused) + con_focus(initially_focused); + // XXX: default reply for now, make this a better reply ysuccess(true); } diff --git a/src/move.c b/src/move.c index 44045f2..9c0f310 100644 --- a/src/move.c +++ b/src/move.c @@ -132,18 +132,17 @@ static void move_to_output_directed(Con *con, direction_t direction) { } /* - * Moves the current container in the given direction (D_LEFT, D_RIGHT, + * Moves the given container in the given direction (D_LEFT, D_RIGHT, * D_UP, D_DOWN). * */ -void tree_move(int direction) { +void tree_move(Con *con, int direction) { position_t position; Con *target; DLOG("Moving in direction %d\n", direction); /* 1: get the first parent with the same orientation */ - Con *con = focused; if (con->type == CT_WORKSPACE) { DLOG("Not moving workspace\n"); diff --git a/testcases/t/232-cmd-move-criteria.t b/testcases/t/232-cmd-move-criteria.t new file mode 100644 index 0000000..22a2eb4 --- a/dev/null +++ b/testcases/t/232-cmd-move-criteria.t @@ -0,0 +1,37 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Please read the following documents before working on tests: +# • http://build.i3wm.org/docs/testsuite.html +# (or docs/testsuite) +# +# • http://build.i3wm.org/docs/lib-i3test.html +# (alternatively: perldoc ./testcases/lib/i3test.pm) +# +# • http://build.i3wm.org/docs/ipc.html +# (or docs/ipc) +# +# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf +# (unless you are already familiar with Perl) +# +# Test that the `move [direction]` command works with criteria +# Bug still in: 4.8-16-g6888a1f +use i3test; + +my $ws = fresh_workspace; + +my $win1 = open_window; +my $win2 = open_window; +my $win3 = open_window; + +# move win1 from the left to the right +cmd '[id="' . $win1->{id} . '"] move right'; + +# now they should be switched, with win2 still being focused +my $ws_con = get_ws($ws); + +# win2 should be on the left +is($ws_con->{nodes}[0]->{window}, $win2->{id}, 'the `move [direction]` command should work with criteria'); +is($x->input_focus, $win3->{id}, 'it should not disturb focus'); + +done_testing; -- cgit v0.9.0.3