]> git.sur5r.net Git - i3/i3/commitdiff
Fix focus order in floating_disable for unfocused windows
authorOrestis Floros <orestisf1993@gmail.com>
Wed, 13 Sep 2017 00:54:40 +0000 (03:54 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Fri, 30 Mar 2018 15:20:40 +0000 (18:20 +0300)
Partially fixes issue #2938

include/move.h
src/floating.c
src/move.c

index 64b12b80cc7b937c8c2773989fa312a41b43adda..df644a6b8b7b217b1c3dfd8b433a00e5d94621eb 100644 (file)
  *
  */
 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);
index dcf73b4102c1612789cb750f0653d91227e60857..834ee1685bf0d77edbe69532bc3ca3b040f5c646 100644 (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;
-
-    /* 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);
 }
index e8620c247b0339d4b0fe529ef97108816ad703c9..5bff3dae5030bc844d915ac8a14d28c71b34876b 100644 (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