X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcon.c;h=ba14e06c66028083c46da87a16c5f7ed0dc75562;hb=1dbdd4fece86c5f85bde54e40f58fa1a91810933;hp=750b1c13911c5ad8b754aa1420af3148558b9573;hpb=b0e2be9a6b061dd3bd3091bca31d6f3f16039aad;p=i3%2Fi3 diff --git a/src/con.c b/src/con.c index 750b1c13..ba14e06c 100644 --- a/src/con.c +++ b/src/con.c @@ -44,18 +44,22 @@ static void con_force_split_parents_redraw(Con *con) { /* * Create a new container (and attach it to the given parent, if not NULL). - * This function initializes the data structures and creates the appropriate - * X11 IDs using x_con_init(). + * This function only initializes the data structures. * */ -Con *con_new(Con *parent, i3Window *window) { +Con *con_new_skeleton(Con *parent, i3Window *window) { Con *new = scalloc(sizeof(Con)); new->on_remove_child = con_on_remove_child; TAILQ_INSERT_TAIL(&all_cons, new, all_cons); + new->aspect_ratio = 0.0; new->type = CT_CON; new->window = window; new->border_style = config.default_border; new->current_border_width = -1; + if (window) + new->depth = window->depth; + else + new->depth = XCB_COPY_FROM_PARENT; static int cnt = 0; DLOG("opening window %d\n", cnt); @@ -66,10 +70,6 @@ Con *con_new(Con *parent, i3Window *window) { cnt++; if ((cnt % (sizeof(colors) / sizeof(char*))) == 0) cnt = 0; - if (window) - x_con_init(new, window->depth); - else - x_con_init(new, XCB_COPY_FROM_PARENT); TAILQ_INIT(&(new->floating_head)); TAILQ_INIT(&(new->nodes_head)); @@ -82,6 +82,15 @@ Con *con_new(Con *parent, i3Window *window) { return new; } +/* A wrapper for con_new_skeleton, to retain the old con_new behaviour + * + */ +Con *con_new(Con *parent, i3Window *window) { + Con *new = con_new_skeleton(parent, window); + x_con_init(new, new->depth); + return new; +} + /* * Attaches the given container to the given parent. This happens when moving * a container or when inserting a new container at a specific place in the @@ -560,8 +569,9 @@ void con_fix_percent(Con *con) { } /* - * Toggles fullscreen mode for the given container. Fullscreen mode will not be - * entered when there already is a fullscreen container on this workspace. + * Toggles fullscreen mode for the given container. If there already is a + * fullscreen container on this workspace, fullscreen will be disabled and then + * enabled for the container the user wants to have in fullscreen mode. * */ void con_toggle_fullscreen(Con *con, int fullscreen_mode) { @@ -1079,6 +1089,12 @@ Rect con_border_style_rect(Con *con) { } else { result = (Rect){border_width, border_width, -(2 * border_width), -(2 * border_width)}; } + + /* Floating windows are never adjacent to any other window, so + don’t hide their border(s). This prevents bug #998. */ + if (con_is_floating(con)) + return result; + if (borders_to_hide & ADJ_LEFT_SCREEN_EDGE) { result.x -= border_width; result.width += border_width; @@ -1195,7 +1211,7 @@ void con_set_border_style(Con *con, int border_style, int border_width) { * new split container before). * */ -void con_set_layout(Con *con, int layout) { +void con_set_layout(Con *con, layout_t layout) { DLOG("con_set_layout(%p, %d), con->type = %d\n", con, layout, con->type); @@ -1339,8 +1355,9 @@ static void con_on_remove_child(Con *con) { * not be closed when the last child was removed */ if (con->type == CT_OUTPUT || con->type == CT_ROOT || - con->type == CT_DOCKAREA) { - DLOG("not handling, type = %d\n", con->type); + con->type == CT_DOCKAREA || + (con->parent != NULL && con->parent->type == CT_OUTPUT)) { + DLOG("not handling, type = %d, name = %s\n", con->type, con->name); return; } @@ -1355,6 +1372,8 @@ static void con_on_remove_child(Con *con) { } con_force_split_parents_redraw(con); + con->urgent = con_has_urgent_child(con); + con_update_parents_urgency(con); /* TODO: check if this container would swallow any other client and * don’t close it automatically. */ @@ -1530,6 +1549,45 @@ void con_update_parents_urgency(Con *con) { } } +/* + * Set urgency flag to the container, all the parent containers and the workspace. + * + */ +void con_set_urgency(Con *con, bool urgent) { + if (focused == con) { + DLOG("Ignoring urgency flag for current client\n"); + con->window->urgent.tv_sec = 0; + con->window->urgent.tv_usec = 0; + return; + } + + if (con->urgency_timer == NULL) { + con->urgent = urgent; + } else + DLOG("Discarding urgency WM_HINT because timer is running\n"); + + //CLIENT_LOG(con); + if (con->window) { + if (con->urgent) { + gettimeofday(&con->window->urgent, NULL); + } else { + con->window->urgent.tv_sec = 0; + con->window->urgent.tv_usec = 0; + } + } + + con_update_parents_urgency(con); + + if (con->urgent == urgent) + LOG("Urgency flag changed to %d\n", con->urgent); + + Con *ws; + /* Set the urgency flag on the workspace, if a workspace could be found + * (for dock clients, that is not the case). */ + if ((ws = con_get_workspace(con)) != NULL) + workspace_update_urgent_flag(ws); +} + /* * Create a string representing the subtree under con. *