X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Ffloating.c;h=ef500bf6d2e7f902134cded7990ff1e7e2115cd7;hb=2f992f5c0ed75452a61b19d6c118e5f5f3ba67e9;hp=558f7f9aa8dae10cf322efbd447ec45d4040f4e8;hpb=33c2b4e58232f7384d996c8aaf6a512605525c3f;p=i3%2Fi3 diff --git a/src/floating.c b/src/floating.c index 558f7f9a..ef500bf6 100644 --- a/src/floating.c +++ b/src/floating.c @@ -30,6 +30,10 @@ void floating_enable(Con *con, bool automatic) { * are children of the workspace. */ if (con->type == CT_WORKSPACE) { LOG("This is a workspace, creating new container around content\n"); + if (con_num_children(con) == 0) { + LOG("Workspace is empty, aborting\n"); + return; + } /* TODO: refactor this with src/con.c:con_set_layout */ Con *new = con_new(NULL); new->parent = con; @@ -90,11 +94,25 @@ void floating_enable(Con *con, bool automatic) { free(name); /* find the height for the decorations */ - i3Font *font = load_font(conn, config.font); - int deco_height = font->height + 5; + int deco_height = config.font.height + 5; DLOG("Original rect: (%d, %d) with %d x %d\n", con->rect.x, con->rect.y, con->rect.width, con->rect.height); - nc->rect = con->rect; + Rect zero = { 0, 0, 0, 0 }; + nc->rect = con->geometry; + /* If the geometry was not set (split containers), we need to determine a + * sensible one by combining the geometry of all children */ + if (memcmp(&(nc->rect), &zero, sizeof(Rect)) == 0) { + DLOG("Geometry not set, combining children\n"); + Con *child; + TAILQ_FOREACH(child, &(con->nodes_head), nodes) { + DLOG("child geometry: %d x %d\n", child->geometry.width, child->geometry.height); + nc->rect.width += child->geometry.width; + nc->rect.height = max(nc->rect.height, child->geometry.height); + } + } + /* Raise the width/height to at least 75x50 (minimum size for windows) */ + nc->rect.width = max(nc->rect.width, 75); + nc->rect.height = max(nc->rect.height, 50); /* add pixels for the decoration */ /* TODO: don’t add them when the user automatically puts new windows into * 1pixel/borderless mode */ @@ -157,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) @@ -265,12 +284,10 @@ DRAGGING_CB(resize_window_callback) { dest_height = old_rect->height - (new_y - event->root_y); else dest_height = old_rect->height + (new_y - event->root_y); - /* TODO: minimum window size */ -#if 0 /* Obey minimum window size */ - dest_width = max(dest_width, client_min_width(client)); - dest_height = max(dest_height, client_min_height(client)); -#endif + Rect minimum = con_minimum_size(con); + dest_width = max(dest_width, minimum.width); + dest_height = max(dest_height, minimum.height); /* User wants to keep proportions, so we may have to adjust our values */ if (params->proportional) {