Fix focus order in floating_disable for unfocused windows

Partially fixes issue #2938
This commit is contained in:
Orestis Floros 2017-09-13 03:54:40 +03:00
parent 60875c7bcb
commit 10a3c1e827
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
3 changed files with 23 additions and 37 deletions

View File

@ -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);

View File

@ -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;
Con *tiling_focused = con_descend_tiling_focused(ws);
/* 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);
/* 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);
}

View File

@ -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