]> git.sur5r.net Git - i3/i3/commitdiff
When making floating cons tiling, re-insert next to the next focused *tiling* con...
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 14 Mar 2011 22:50:29 +0000 (23:50 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 14 Mar 2011 22:50:29 +0000 (23:50 +0100)
Fixes: #337 and #350
include/con.h
src/con.c
src/floating.c

index 8ffa7ce2a260184227d6ab92c99621e2cc7d3d7a..1dd65a6eadcedce5ae52bb3bce10314943c21781 100644 (file)
@@ -167,6 +167,16 @@ Con *con_get_next(Con *con, char way, orientation_t orientation);
  */
 Con *con_descend_focused(Con *con);
 
+/**
+ * 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.
+ *
+ * Works like con_descend_focused but considers only tiling cons.
+ *
+ */
+Con *con_descend_tiling_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 0ed4436ae1b88a79bef7d752bef164a6d0da3353..04db250ba11444b71d257ba66d7c7b17b89c49cc 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -694,6 +694,32 @@ Con *con_descend_focused(Con *con) {
     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.
+ *
+ * Works like con_descend_focused but considers only tiling cons.
+ *
+ */
+Con *con_descend_tiling_focused(Con *con) {
+    Con *next = con;
+    Con *before;
+    Con *child;
+    do {
+        before = next;
+        TAILQ_FOREACH(child, &(next->focus_head), focused) {
+            if (child->type == CT_FLOATING_CON)
+                continue;
+
+            next = child;
+            break;
+        }
+    } while (before != next);
+    return next;
+}
+
+
 /*
  * 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 fe878f75420185ae72ff76ceaddb097a3714fd7e..ef500bf6d2e7f902134cded7990ff1e7e2115cd7 100644 (file)
@@ -175,7 +175,8 @@ void floating_disable(Con *con, bool automatic) {
 
     /* 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 *focused = con_descend_tiling_focused(con_get_workspace(con));
+
     /* if there is no other container on this workspace, focused will be the
      * workspace itself */
     if (focused->type == CT_WORKSPACE)