Allow "move position center" to operate on matched windows

Moving windows to the center previously did not consider command criteria.
We now operate on matched windows as for other commands.

fixes #2090
This commit is contained in:
Ingo Bürk 2015-12-03 13:24:39 +01:00
parent c490a60d94
commit caeb193a6c
1 changed files with 30 additions and 16 deletions

View File

@ -1760,28 +1760,42 @@ void cmd_move_window_to_position(I3_CMD, const char *method, long x, long y) {
*
*/
void cmd_move_window_to_center(I3_CMD, const char *method) {
if (!con_is_floating(focused)) {
ELOG("Cannot change position. The window/container is not floating\n");
yerror("Cannot change position. The window/container is not floating.");
return;
bool has_error = false;
HANDLE_EMPTY_MATCH;
owindow *current;
TAILQ_FOREACH(current, &owindows, owindows) {
Con *floating_con = con_inside_floating(current->con);
if (floating_con == NULL) {
ELOG("con %p / %s is not floating, cannot move it to the center.\n",
current->con, current->con->name);
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) {
DLOG("moving to absolute center\n");
floating_center(focused->parent, croot->rect);
floating_center(floating_con, croot->rect);
floating_maybe_reassign_ws(focused->parent);
floating_maybe_reassign_ws(floating_con);
cmd_output->needs_tree_render = true;
}
if (strcmp(method, "position") == 0) {
DLOG("moving to center\n");
floating_center(focused->parent, con_get_workspace(focused)->rect);
floating_center(floating_con, con_get_workspace(floating_con)->rect);
cmd_output->needs_tree_render = true;
}
}
// XXX: default reply for now, make this a better reply
if (!has_error)
ysuccess(true);
}