]> git.sur5r.net Git - i3/i3/commitdiff
Extends move command for floating windows
authorPavel Löbl <lobl.pavel@gmail.com>
Fri, 23 Mar 2012 12:39:17 +0000 (13:39 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 25 Mar 2012 09:06:49 +0000 (11:06 +0200)
docs/userguide
include/commands.h
parser-specs/commands.spec
src/commands.c
testcases/t/124-move.t
testcases/t/187-commands-parser.t

index 75a5b6456b8be14dc6bdb95cbadc2acbec4d5f2a..957d0c7fceba520f07b500c17ad06c890a186ebd 100644 (file)
@@ -1233,6 +1233,7 @@ focus <left|right|down|up>
 focus <parent|child|floating|tiling|mode_toggle>
 focus output <<left|right|down|up>|output>
 move <left|right|down|up> [<px> px]
+move [absolute] position [[<px> px] [<px> px]|center]
 -----------------------------------
 
 Note that the amount of pixels you can specify for the +move+ command is only
@@ -1267,6 +1268,10 @@ bindsym mod+semicolon move right
 # Move container, but make floating containers
 # move more than the default
 bindsym mod+j move left 20 px
+
+# Move floating container to the center
+# of all outputs
+bindsym mod+c move absolute position center
 ----------------------
 
 === Changing (named) workspaces/moving to workspaces
index 2b69422dec1e909b9c2aef0aeacc273f7ed046c6..88521d31ea8bb9562dc02e2016f78801c4c38e11 100644 (file)
@@ -223,6 +223,18 @@ void cmd_open(I3_CMD);
  */
 void cmd_focus_output(I3_CMD, char *name);
 
+/**
+ * Implementation of 'move [window|container] [to] [absolute] position <px> [px] <px> [px]
+ *
+ */
+void cmd_move_window_to_position(I3_CMD, char *method, char *x, char *y);
+
+/**
+ * Implementation of 'move [window|container] [to] [absolute] position center
+ *
+ */
+void cmd_move_window_to_center(I3_CMD, char *method);
+
 /**
  * Implementation of 'move scratchpad'.
  *
index bbd7ab285e80476280b2eaa12d59690d4cb65f15..490e49720244cdcf0fbf99df2f46837e98d9189a 100644 (file)
@@ -172,6 +172,7 @@ state RESIZE_TILING_OR:
 # move [window|container] [to] scratchpad
 # move workspace to [output] <str>
 # move scratchpad
+# move [window|container] [to] [absolute] position [ [<pixels> [px] <pixels> [px]] | center ]
 state MOVE:
   'window'
       ->
@@ -187,6 +188,10 @@ state MOVE:
       -> call cmd_move_scratchpad()
   direction = 'left', 'right', 'up', 'down'
       -> MOVE_DIRECTION
+  method = 'position'
+      -> MOVE_TO_POSITION
+  method = 'absolute'
+      -> MOVE_TO_ABSOLUTE_POSITION
 
 state MOVE_DIRECTION:
   pixels = word
@@ -218,6 +223,26 @@ state MOVE_WORKSPACE_TO_OUTPUT:
   output = string
       -> call cmd_move_workspace_to_output($output)
 
+state MOVE_TO_ABSOLUTE_POSITION:
+  'position'
+      -> MOVE_TO_POSITION
+
+state MOVE_TO_POSITION:
+  'center'
+      -> call cmd_move_window_to_center($method)
+  coord_x = word
+      -> MOVE_TO_POSITION_X
+
+state MOVE_TO_POSITION_X:
+  'px'
+      ->
+  coord_y = word
+      -> MOVE_TO_POSITION_Y
+
+state MOVE_TO_POSITION_Y:
+  'px', end
+      -> call cmd_move_window_to_position($method, $coord_x, $coord_y)
+
 # mode <string>
 state MODE:
   mode = string
index 8fc80a199c3b0c11efbe58583982d5006f8fc99b..8111b54c201bb222ed2e65786408d247e401d555 100644 (file)
@@ -1255,6 +1255,85 @@ void cmd_focus_output(I3_CMD, char *name) {
     cmd_output->json_output = sstrdup("{\"success\": true}");
 }
 
+/*
+ * Implementation of 'move [window|container] [to] [absolute] position <px> [px] <px> [px]
+ *
+ */
+void cmd_move_window_to_position(I3_CMD, char *method, char *cx, char *cy) {
+
+    int x = atoi(cx);
+    int y = atoi(cy);
+
+    if (!con_is_floating(focused)) {
+        ELOG("Cannot change position. The window/container is not floating\n");
+        sasprintf(&(cmd_output->json_output),
+                  "{\"success\":false, \"error\":\"Cannot change position. "
+                  "The window/container is not floating.\"}");
+        return;
+    }
+
+    if (strcmp(method, "absolute") == 0) {
+        focused->parent->rect.x = x;
+        focused->parent->rect.y = y;
+
+        DLOG("moving to absolute position %d %d\n", x, y);
+        floating_maybe_reassign_ws(focused->parent);
+        cmd_output->needs_tree_render = true;
+    }
+
+    if (strcmp(method, "position") == 0) {
+        Rect newrect = focused->parent->rect;
+
+        DLOG("moving to position %d %d\n", x, y);
+        newrect.x = x;
+        newrect.y = y;
+
+        floating_reposition(focused->parent, newrect);
+    }
+
+    // XXX: default reply for now, make this a better reply
+    cmd_output->json_output = sstrdup("{\"success\": true}");
+}
+
+/*
+ * Implementation of 'move [window|container] [to] [absolute] position center
+ *
+ */
+void cmd_move_window_to_center(I3_CMD, char *method) {
+
+    if (!con_is_floating(focused)) {
+        ELOG("Cannot change position. The window/container is not floating\n");
+        sasprintf(&(cmd_output->json_output),
+                  "{\"success\":false, \"error\":\"Cannot change position. "
+                  "The window/container is not floating.\"}");
+    }
+
+    if (strcmp(method, "absolute") == 0) {
+        Rect *rect = &focused->parent->rect;
+
+        DLOG("moving to absolute center\n");
+        rect->x = croot->rect.width/2 - rect->width/2;
+        rect->y = croot->rect.height/2 - rect->height/2;
+
+        floating_maybe_reassign_ws(focused->parent);
+        cmd_output->needs_tree_render = true;
+    }
+
+    if (strcmp(method, "position") == 0) {
+        Rect *wsrect = &con_get_workspace(focused)->rect;
+        Rect newrect = focused->parent->rect;
+
+        DLOG("moving to center\n");
+        newrect.x = wsrect->width/2 - newrect.width/2;
+        newrect.y = wsrect->height/2 - newrect.height/2;
+
+        floating_reposition(focused->parent, newrect);
+    }
+
+    // XXX: default reply for now, make this a better reply
+    cmd_output->json_output = sstrdup("{\"success\": true}");
+}
+
 /*
  * Implementation of 'move scratchpad'.
  *
index ae989f065d0727eff7ede111aa971616312d0bc1..052cdbff5ce1afee6ac80aec0617be4faeca7ab8 100644 (file)
@@ -200,6 +200,29 @@ is($absolute->y, $absolute_before->y, 'y not changed');
 is($absolute->width, $absolute_before->width, 'width not changed');
 is($absolute->height, $absolute_before->height, 'height not changed');
 
+######################################################################
+# 6) test moving floating window to a specified position
+#    and to absolute center
+######################################################################
+
+$tmp = fresh_workspace;
+open_floating_window; my @floatcon;
+
+cmd 'move position 5 px 15 px';
+
+@floatcon = @{get_ws($tmp)->{floating_nodes}};
+
+is($floatcon[0]->{rect}->{x}, 5, 'moved to position 5 x');
+is($floatcon[0]->{rect}->{y}, 15, 'moved to position 15 y');
+
+cmd 'move absolute position center';
+
+@floatcon = @{get_ws($tmp)->{floating_nodes}};
+
+my $center_x = int($x->root->rect->width/2) - int($floatcon[0]->{rect}->{width}/2);
+my $center_y = int($x->root->rect->height/2) - int($floatcon[0]->{rect}->{height}/2);
 
+is($floatcon[0]->{rect}->{x}, $center_x, "moved to center at position $center_x x");
+is($floatcon[0]->{rect}->{y}, $center_y, "moved to center at position $center_y y");
 
 done_testing;
index b0e543ba1f4e910a5190b9857e525bcebe8bd9a2..7e6f97bd1607fd7815c856e3aa8f39ff3716bfd8 100644 (file)
@@ -133,7 +133,7 @@ is(parser_calls('unknown_literal'),
    'error for unknown literal ok');
 
 is(parser_calls('move something to somewhere'),
-   "Expected one of these tokens: 'window', 'container', 'to', 'workspace', 'output', 'scratchpad', 'left', 'right', 'up', 'down'\n" .
+   "Expected one of these tokens: 'window', 'container', 'to', 'workspace', 'output', 'scratchpad', 'left', 'right', 'up', 'down', 'position', 'absolute'\n" .
    "Your command: move something to somewhere\n" .
    "                   ^^^^^^^^^^^^^^^^^^^^^^",
    'error for unknown literal ok');