From da6b916d06d98047cceeb5a8cbd0b5954d9308c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Mon, 28 Jul 2014 13:44:51 +0200 Subject: [i3] Move patch --- x11-wm/i3-4.8/move.patch | 152 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 x11-wm/i3-4.8/move.patch diff --git a/x11-wm/i3-4.8/move.patch b/x11-wm/i3-4.8/move.patch new file mode 100644 index 0000000..c65bd8a --- /dev/null +++ b/x11-wm/i3-4.8/move.patch @@ -0,0 +1,152 @@ +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 -- cgit v1.2.3