Merge pull request #2095 from Airblader/bug-2090

Allow "move position center" to operate on matched windows
This commit is contained in:
Michael Stapelberg 2015-12-04 09:02:51 +01:00
commit 04be42f7cd
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);
}