X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=src%2Fcon.c;h=21d2f097af4d667c7ccd0b94afa7d25b209e1cb7;hp=f20f7c359c30b234266e60b65548d70c8561e595;hb=HEAD;hpb=55dd5b8d8406c45b8ba406eabe453bc8596c1336 diff --git a/src/con.c b/src/con.c index f20f7c35..21d2f097 100644 --- a/src/con.c +++ b/src/con.c @@ -286,14 +286,14 @@ void con_close(Con *con, kill_window_t kill_window) { for (child = TAILQ_FIRST(&(con->focus_head)); child;) { nextchild = TAILQ_NEXT(child, focused); DLOG("killing child = %p.\n", child); - tree_close_internal(child, kill_window, false, false); + tree_close_internal(child, kill_window, false); child = nextchild; } return; } - tree_close_internal(con, kill_window, false, false); + tree_close_internal(con, kill_window, false); } /* @@ -312,7 +312,7 @@ bool con_has_managed_window(Con *con) { return (con != NULL && con->window != NULL && con->window->id != XCB_WINDOW_NONE && con_get_workspace(con) != NULL); } -/** +/* * Returns true if this node has regular or floating children. * */ @@ -509,7 +509,24 @@ Con *con_get_fullscreen_con(Con *con, fullscreen_mode_t fullscreen_mode) { return NULL; } -/** +/* + * Returns the fullscreen node that covers the given workspace if it exists. + * This is either a CF_GLOBAL fullscreen container anywhere or a CF_OUTPUT + * fullscreen container in the workspace. + * + */ +Con *con_get_fullscreen_covering_ws(Con *ws) { + if (!ws) { + return NULL; + } + Con *fs = con_get_fullscreen_con(croot, CF_GLOBAL); + if (!fs) { + return con_get_fullscreen_con(ws, CF_OUTPUT); + } + return fs; +} + +/* * Returns true if the container is internal, such as __i3_scratch * */ @@ -879,7 +896,7 @@ int con_num_children(Con *con) { return children; } -/** +/* * Returns the number of visible non-floating children of this container. * For example, if the container contains a hsplit which has two children, * this will return 2 instead of 1. @@ -919,6 +936,10 @@ int con_num_windows(Con *con) { num += con_num_windows(current); } + TAILQ_FOREACH(current, &(con->floating_head), floating_windows) { + num += con_num_windows(current); + } + return num; } @@ -1154,13 +1175,13 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi target = target->parent; } - /* 3: if the target container is floating, we get the workspace instead. - * Only tiling windows need to get inserted next to the current container. - * */ - Con *floatingcon = con_inside_floating(target); - if (floatingcon != NULL) { + /* 3: if the original target is the direct child of a floating container, we + * can't move con next to it - floating containers have only one child - so + * we get the workspace instead. */ + if (target->type == CT_FLOATING_CON) { DLOG("floatingcon, going up even further\n"); - target = floatingcon->parent; + orig_target = target; + target = target->parent; } if (con->type == CT_FLOATING_CON) { @@ -1213,14 +1234,12 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi Con *old_focus = focused; con_activate(con_descend_focused(con)); - /* Restore focus if the output's focused workspace has changed. */ - if (con_get_workspace(focused) != old_focus_ws) { - con_focus(old_focus); - } - - /* Restore focus to the currently focused container. */ if (old_focus_ws == current_ws && old_focus->type != CT_WORKSPACE) { + /* Restore focus to the currently focused container. */ con_activate(old_focus); + } else if (con_get_workspace(focused) != old_focus_ws) { + /* Restore focus if the output's focused workspace has changed. */ + con_focus(con_descend_focused(old_focus_ws)); } } @@ -1437,6 +1456,9 @@ Con *con_next_focused(Con *con) { DLOG("selecting workspace for dock client\n"); return con_descend_focused(output_get_content(con->parent->parent)); } + if (con_is_floating(con)) { + con = con->parent; + } /* if 'con' is not the first entry in the focus stack, use the first one as * it’s currently focused already */ @@ -1694,8 +1716,7 @@ adjacent_t con_adjacent_borders(Con *con) { * */ int con_border_style(Con *con) { - Con *fs = con_get_fullscreen_con(con->parent, CF_OUTPUT); - if (fs == con) { + if (con->fullscreen_mode == CF_OUTPUT || con->fullscreen_mode == CF_GLOBAL) { DLOG("this one is fullscreen! overriding BS_NONE\n"); return BS_NONE; } @@ -1955,7 +1976,7 @@ static void con_on_remove_child(Con *con) { if (TAILQ_EMPTY(&(con->focus_head)) && !workspace_is_visible(con)) { LOG("Closing old workspace (%p / %s), it is empty\n", con, con->name); yajl_gen gen = ipc_marshal_workspace_event("empty", con, NULL); - tree_close_internal(con, DONT_KILL_WINDOW, false, false); + tree_close_internal(con, DONT_KILL_WINDOW, false); const unsigned char *payload; ylength length; @@ -1976,7 +1997,7 @@ static void con_on_remove_child(Con *con) { int children = con_num_children(con); if (children == 0) { DLOG("Container empty, closing\n"); - tree_close_internal(con, DONT_KILL_WINDOW, false, false); + tree_close_internal(con, DONT_KILL_WINDOW, false); return; } }