Merge pull request #2040 from Airblader/bug-2034

Fix crash when trying to split and float a dock container.
next
Michael Stapelberg 2015-10-27 10:07:25 +01:00
commit 2451551f63
4 changed files with 40 additions and 16 deletions

View File

@ -112,6 +112,12 @@ bool con_is_internal(Con *con);
*/
bool con_is_floating(Con *con);
/**
* Returns true if the container is a docked container.
*
*/
bool con_is_docked(Con *con);
/**
* Checks if the given container is either floating or inside some floating
* container. It returns the FLOATING_CON container.

View File

@ -1192,16 +1192,18 @@ void cmd_move_workspace_to_output(I3_CMD, const char *name) {
*
*/
void cmd_split(I3_CMD, const char *direction) {
HANDLE_EMPTY_MATCH;
owindow *current;
/* TODO: use matches */
LOG("splitting in direction %c\n", direction[0]);
if (match_is_empty(current_match))
tree_split(focused, (direction[0] == 'v' ? VERT : HORIZ));
else {
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
tree_split(current->con, (direction[0] == 'v' ? VERT : HORIZ));
TAILQ_FOREACH(current, &owindows, owindows) {
if (con_is_docked(current->con)) {
ELOG("Cannot split a docked container, skipping.\n");
continue;
}
DLOG("matching: %p / %s\n", current->con, current->con->name);
tree_split(current->con, (direction[0] == 'v' ? VERT : HORIZ));
}
cmd_output->needs_tree_render = true;
@ -1528,9 +1530,10 @@ void cmd_move_direction(I3_CMD, const char *direction, long move_px) {
*
*/
void cmd_layout(I3_CMD, const char *layout_str) {
HANDLE_EMPTY_MATCH;
if (strcmp(layout_str, "stacking") == 0)
layout_str = "stacked";
owindow *current;
layout_t layout;
/* default is a special case which will be handled in con_set_layout(). */
if (strcmp(layout_str, "default") == 0)
@ -1550,14 +1553,15 @@ void cmd_layout(I3_CMD, const char *layout_str) {
DLOG("changing layout to %s (%d)\n", layout_str, layout);
/* check if the match is empty, not if the result is empty */
if (match_is_empty(current_match))
con_set_layout(focused, layout);
else {
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
con_set_layout(current->con, layout);
owindow *current;
TAILQ_FOREACH(current, &owindows, owindows) {
if (con_is_docked(current->con)) {
ELOG("cannot change layout of a docked container, skipping it.\n");
continue;
}
DLOG("matching: %p / %s\n", current->con, current->con->name);
con_set_layout(current->con, layout);
}
cmd_output->needs_tree_render = true;

View File

@ -448,6 +448,20 @@ bool con_is_floating(Con *con) {
return (con->floating >= FLOATING_AUTO_ON);
}
/*
* Returns true if the container is a docked container.
*
*/
bool con_is_docked(Con *con) {
if (con->parent == NULL)
return false;
if (con->parent->type == CT_DOCKAREA)
return true;
return con_is_docked(con->parent);
}
/*
* Checks if the given container is either floating or inside some floating
* container. It returns the FLOATING_CON container.

View File

@ -108,7 +108,7 @@ void floating_check_size(Con *floating_con) {
void floating_enable(Con *con, bool automatic) {
bool set_focus = (con == focused);
if (con->parent && con->parent->type == CT_DOCKAREA) {
if (con_is_docked(con)) {
LOG("Container is a dock window, not enabling floating mode.\n");
return;
}