X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcon.c;h=ca65a150e149c07ff1ffb8a36636ba4d70b188eb;hb=ede954128afca118025db6a04d4d9d259473c70f;hp=deb6555846d05311acd05269a7e84fca53e45bad;hpb=5a0f02b7ff310f1b928ad4f8bc841b2ed51ab166;p=i3%2Fi3 diff --git a/src/con.c b/src/con.c index deb65558..ca65a150 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); } /* @@ -509,6 +509,23 @@ 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 * @@ -1097,7 +1114,7 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi /* Prevent moving if this would violate the fullscreen focus restrictions. */ Con *target_ws = con_get_workspace(target); - if (!con_fullscreen_permits_focusing(target_ws)) { + if (!ignore_focus && !con_fullscreen_permits_focusing(target_ws)) { LOG("Cannot move out of a fullscreen container.\n"); return false; } @@ -1437,6 +1454,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 +1714,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 +1974,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 +1995,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; } } @@ -2373,6 +2392,10 @@ bool con_swap(Con *first, Con *second) { /* Move first to second. */ result &= _con_move_to_con(first, second, false, false, false, true, false); + /* If swapping the containers didn't work we don't need to mess with the focus. */ + if (!result) { + goto swap_end; + } /* If we moved the container holding the focused window to another * workspace we need to ensure the visible workspace has the focused @@ -2385,8 +2408,6 @@ bool con_swap(Con *first, Con *second) { /* Move second to where first has been originally. */ result &= _con_move_to_con(second, fake, false, false, false, true, false); - - /* If swapping the containers didn't work we don't need to mess with the focus. */ if (!result) { goto swap_end; }