]> git.sur5r.net Git - i3/i3/blobdiff - src/floating.c
Bugfix: don’t kill parent when currently in tree_close() for a child of this parent
[i3/i3] / src / floating.c
index 8f144113909e7ea4849141a1a9bb415eefc0b4c3..005f2092c48fffd420c5a523975bcb1f6cff4dc7 100644 (file)
@@ -32,8 +32,22 @@ void floating_enable(Con *con, bool automatic) {
     /* 2: create a new container to render the decoration on, add
      * it as a floating window to the workspace */
     Con *nc = con_new(NULL);
+    /* we need to set the parent afterwards instead of passing it as an
+     * argument to con_new() because nc would be inserted into the tiling layer
+     * otherwise. */
     nc->parent = con_get_workspace(con);
+
+    char *name;
+    asprintf(&name, "[i3 con] floatingcon around %p", con);
+    x_set_name(nc, name);
+    free(name);
+
     nc->rect = con->rect;
+    /* add pixels for the decoration */
+    /* TODO: don’t add them when the user automatically puts new windows into
+     * 1pixel/borderless mode */
+    nc->rect.height += 17 + 2;
+    nc->rect.width += 4;
     nc->orientation = NO_ORIENTATION;
     nc->type = CT_FLOATING_CON;
     TAILQ_INSERT_TAIL(&(nc->parent->floating_head), nc, floating_windows);
@@ -43,8 +57,25 @@ void floating_enable(Con *con, bool automatic) {
     con->old_parent = con->parent;
     con->parent = nc;
     con->floating = FLOATING_USER_ON;
-    nc->rect.x = 400;
-    nc->rect.y = 400;
+
+    /* Some clients (like GIMP’s color picker window) get mapped
+     * to (0, 0), so we push them to a reasonable position
+     * (centered over their leader) */
+    if (nc->rect.x == 0 && nc->rect.y == 0) {
+        Con *leader;
+        if (con->window && con->window->leader != XCB_NONE &&
+            (leader = con_by_window_id(con->window->leader)) != NULL) {
+            DLOG("Centering above leader\n");
+            nc->rect.x = leader->rect.x + (leader->rect.width / 2) - (nc->rect.width / 2);
+            nc->rect.y = leader->rect.y + (leader->rect.height / 2) - (nc->rect.height / 2);
+        } else {
+            /* center the window on workspace as fallback */
+            Con *ws = nc->parent;
+            nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
+            nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+        }
+    }
+
     TAILQ_INSERT_TAIL(&(nc->nodes_head), con, nodes);
     TAILQ_INSERT_TAIL(&(nc->focus_head), con, focused);
 }
@@ -64,7 +95,7 @@ void floating_disable(Con *con, bool automatic) {
     /* 2: kill parent container */
     TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows);
     TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
-    tree_close(con->parent, false);
+    tree_close(con->parent, false, false);
 
     /* 3: re-attach to previous parent */
     con->parent = con->old_parent;