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
# 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
*/
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'.
*
# 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'
->
-> 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
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
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'.
*
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;
'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');