Make absolute floating move work with criteria
Make commands of type `move [window|container] [to] [absolute] position <px> [px] <px> [px]` work with command selection criteria. fixes #1301
This commit is contained in:
parent
5cbe2d63c0
commit
7381b50587
|
@ -1810,33 +1810,45 @@ void cmd_focus_output(I3_CMD, char *name) {
|
||||||
void cmd_move_window_to_position(I3_CMD, char *method, char *cx, char *cy) {
|
void cmd_move_window_to_position(I3_CMD, char *method, char *cx, char *cy) {
|
||||||
int x = atoi(cx);
|
int x = atoi(cx);
|
||||||
int y = atoi(cy);
|
int y = atoi(cy);
|
||||||
|
bool has_error = false;
|
||||||
|
|
||||||
if (!con_is_floating(focused)) {
|
owindow *current;
|
||||||
|
HANDLE_EMPTY_MATCH;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||||
|
if (!con_is_floating(current->con)) {
|
||||||
ELOG("Cannot change position. The window/container is not floating\n");
|
ELOG("Cannot change position. The window/container is not floating\n");
|
||||||
yerror("Cannot change position. The window/container is not floating.");
|
|
||||||
return;
|
if (!has_error) {
|
||||||
|
yerror("Cannot change position of a window/container because it is not floating.");
|
||||||
|
has_error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(method, "absolute") == 0) {
|
if (strcmp(method, "absolute") == 0) {
|
||||||
focused->parent->rect.x = x;
|
current->con->parent->rect.x = x;
|
||||||
focused->parent->rect.y = y;
|
current->con->parent->rect.y = y;
|
||||||
|
|
||||||
DLOG("moving to absolute position %d %d\n", x, y);
|
DLOG("moving to absolute position %d %d\n", x, y);
|
||||||
floating_maybe_reassign_ws(focused->parent);
|
floating_maybe_reassign_ws(current->con->parent);
|
||||||
cmd_output->needs_tree_render = true;
|
cmd_output->needs_tree_render = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(method, "position") == 0) {
|
if (strcmp(method, "position") == 0) {
|
||||||
Rect newrect = focused->parent->rect;
|
Rect newrect = current->con->parent->rect;
|
||||||
|
|
||||||
DLOG("moving to position %d %d\n", x, y);
|
DLOG("moving to position %d %d\n", x, y);
|
||||||
newrect.x = x;
|
newrect.x = x;
|
||||||
newrect.y = y;
|
newrect.y = y;
|
||||||
|
|
||||||
floating_reposition(focused->parent, newrect);
|
floating_reposition(current->con->parent, newrect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: default reply for now, make this a better reply
|
// XXX: default reply for now, make this a better reply
|
||||||
|
if (!has_error)
|
||||||
ysuccess(true);
|
ysuccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,4 +245,20 @@ my $center_y = int($x->root->rect->height/2) - int($floatcon[0]->{rect}->{height
|
||||||
is($floatcon[0]->{rect}->{x}, $center_x, "moved to center at position $center_x x");
|
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");
|
is($floatcon[0]->{rect}->{y}, $center_y, "moved to center at position $center_y y");
|
||||||
|
|
||||||
|
# Make sure the command works with criteria
|
||||||
|
open_floating_window;
|
||||||
|
|
||||||
|
@floatcon = @{get_ws($tmp)->{floating_nodes}};
|
||||||
|
|
||||||
|
cmd '[con_id="' . $floatcon[0]->{nodes}[0]->{id} . '"] move position 25 px 30 px';
|
||||||
|
cmd '[con_id="' . $floatcon[1]->{nodes}[0]->{id} . '"] move position 35 px 40 px';
|
||||||
|
|
||||||
|
@floatcon = @{get_ws($tmp)->{floating_nodes}};
|
||||||
|
|
||||||
|
is($floatcon[0]->{rect}->{x}, 25, 'moved to position 25 x with criteria');
|
||||||
|
is($floatcon[0]->{rect}->{y}, 30, 'moved to position 30 y with criteria');
|
||||||
|
|
||||||
|
is($floatcon[1]->{rect}->{x}, 35, 'moved to position 35 x with criteria');
|
||||||
|
is($floatcon[1]->{rect}->{y}, 40, 'moved to position 40 y with criteria');
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue