]> git.sur5r.net Git - i3/i3/commitdiff
re-insert floating cons next to the currently focused con of the appropriate workspace
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 27 Jan 2011 15:04:17 +0000 (16:04 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 27 Jan 2011 15:04:17 +0000 (16:04 +0100)
include/con.h
src/con.c
src/floating.c

index 5788aea2ccdb80f935e628139fb13d0115528d94..de53721850e9ccbf800a4400445868cf9be1dab6 100644 (file)
@@ -152,6 +152,14 @@ Con *con_next_focused(Con *con);
  */
 Con *con_get_next(Con *con, char way, orientation_t orientation);
 
+/**
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ */
+Con *con_descend_focused(Con *con);
+
 /**
  * Returns a "relative" Rect which contains the amount of pixels that need to
  * be added to the original Rect to get the final position (obviously the
index 5e3f9283c27e8b1afd56f2440db3c325af50d892..2f02bfcd8a4a9a7613c5160c465d96679fb8ae87 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -627,6 +627,18 @@ Con *con_get_next(Con *con, char way, orientation_t orientation) {
     return next;
 }
 
+/*
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ */
+Con *con_descend_focused(Con *con) {
+    Con *next = con;
+    while (!TAILQ_EMPTY(&(next->focus_head)))
+        next = TAILQ_FIRST(&(next->focus_head));
+    return next;
+}
 
 /*
  * Returns a "relative" Rect which contains the amount of pixels that need to
index 50987de49d3207e4a7e09978d101151de996114a..b4d21963f073ec13255e1e5c948cc03c981e31ec 100644 (file)
@@ -149,8 +149,10 @@ void floating_disable(Con *con, bool automatic) {
     TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
     tree_close(con->parent, false, false);
 
-    /* 3: re-attach to previous parent */
-    con->parent = con_get_workspace(con);
+    /* 3: re-attach to the parent of the currently focused con on the workspace
+     * this floating con was on */
+    Con *focused = con_descend_focused(con_get_workspace(con));
+    con->parent = focused->parent;
 
     /* XXX: We adjust the percentage value to start with a fair value. Floating
      * cons always have 1.0 as percent which doesn’t work so well when