From: Orestis Floros Date: Wed, 13 Sep 2017 00:54:40 +0000 (+0300) Subject: Fix focus order in floating_disable for unfocused windows X-Git-Tag: 4.16~105^2~3 X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=commitdiff_plain;h=10a3c1e8275120340a6e25727026e41eb5c91124 Fix focus order in floating_disable for unfocused windows Partially fixes issue #2938 --- diff --git a/include/move.h b/include/move.h index 64b12b80..df644a6b 100644 --- a/include/move.h +++ b/include/move.h @@ -17,3 +17,13 @@ * */ void tree_move(Con *con, int direction); + +typedef enum { BEFORE, + AFTER } position_t; + +/** + * This function detaches 'con' from its parent and inserts it either before or + * after 'target'. + * + */ +void insert_con_into(Con *con, Con *target, position_t position); diff --git a/src/floating.c b/src/floating.c index dcf73b41..834ee168 100644 --- a/src/floating.c +++ b/src/floating.c @@ -327,43 +327,22 @@ void floating_disable(Con *con, bool automatic) { return; } - const bool set_focus = (con == focused); - Con *ws = con_get_workspace(con); - Con *parent = con->parent; - - /* 1: detach from parent container */ - con_detach(con); - - /* 2: kill parent container */ - con_detach(con->parent); - /* clear the pointer before calling tree_close_internal in which the memory is freed */ - con->parent = NULL; - tree_close_internal(parent, DONT_KILL_WINDOW, true, false); - - /* 3: re-attach to the parent of the currently focused con on the workspace - * this floating con was on */ - Con *focused = con_descend_tiling_focused(ws); + Con *tiling_focused = con_descend_tiling_focused(ws); - /* if there is no other container on this workspace, focused will be the - * workspace itself */ - if (focused->type == CT_WORKSPACE) - con->parent = focused; - else - con->parent = focused->parent; - - /* con_fix_percent will adjust the percent value */ - con->percent = 0.0; + if (tiling_focused->type == CT_WORKSPACE) { + Con *parent = con->parent; + con_detach(con); + con->parent = NULL; + tree_close_internal(parent, DONT_KILL_WINDOW, true, false); + con_attach(con, tiling_focused, false); + con->percent = 0.0; + con_fix_percent(con->parent); + } else { + insert_con_into(con, tiling_focused, AFTER); + } con->floating = FLOATING_USER_OFF; - - con_attach(con, con->parent, false); - - con_fix_percent(con->parent); - - if (set_focus) - con_activate(con); - floating_set_hint_atom(con, false); ipc_send_window_event("floating", con); } diff --git a/src/move.c b/src/move.c index e8620c24..5bff3dae 100644 --- a/src/move.c +++ b/src/move.c @@ -9,9 +9,6 @@ */ #include "all.h" -typedef enum { BEFORE, - AFTER } position_t; - /* * Returns the lowest container in the tree that has both a and b as descendants. * @@ -65,7 +62,7 @@ static bool is_focused_descendant(Con *con, Con *ancestor) { * after 'target'. * */ -static void insert_con_into(Con *con, Con *target, position_t position) { +void insert_con_into(Con *con, Con *target, position_t position) { Con *parent = target->parent; /* We need to preserve the old con->parent. While it might still be used to * insert the entry before/after it, we call the on_remove_child callback