X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=src%2Fx.c;h=267372f93bace95ce5e53ebee6e4d2a208034a9a;hp=6a0170a5699be528dd17b67b05cf13396400edc5;hb=HEAD;hpb=66d504f3cda8fce9dc420ca4ec704910594d5b37 diff --git a/src/x.c b/src/x.c index 6a0170a5..267372f9 100644 --- a/src/x.c +++ b/src/x.c @@ -105,6 +105,10 @@ static con_state *state_for_frame(xcb_window_t window) { * */ static void change_ewmh_focus(xcb_window_t new_focus, xcb_window_t old_focus) { + if (new_focus == old_focus) { + return; + } + ewmh_update_active_window(new_focus); if (new_focus != XCB_WINDOW_NONE) { @@ -575,31 +579,8 @@ void x_draw_decoration(Con *con) { /* 6: draw the title */ int text_offset_y = (con->deco_rect.height - config.font.height) / 2; - struct Window *win = con->window; - if (win == NULL) { - i3String *title; - if (con->title_format == NULL) { - char *_title; - char *tree = con_get_tree_representation(con); - sasprintf(&_title, "i3: %s", tree); - free(tree); - - title = i3string_from_utf8(_title); - FREE(_title); - } else { - title = con_parse_title_format(con); - } - - draw_util_text(title, &(parent->frame_buffer), - p->color->text, p->color->background, - con->deco_rect.x + logical_px(2), - con->deco_rect.y + text_offset_y, - con->deco_rect.width - 2 * logical_px(2)); - I3STRING_FREE(title); - - goto after_title; - } - + const int title_padding = logical_px(2); + const int deco_width = (int)con->deco_rect.width; int mark_width = 0; if (config.show_marks && !TAILQ_EMPTY(&(con->marks_head))) { char *formatted_mark = sstrdup(""); @@ -621,33 +602,75 @@ void x_draw_decoration(Con *con) { i3String *mark = i3string_from_utf8(formatted_mark); mark_width = predict_text_width(mark); + int mark_offset_x = (config.title_align == ALIGN_RIGHT) + ? title_padding + : deco_width - mark_width - title_padding; + draw_util_text(mark, &(parent->frame_buffer), p->color->text, p->color->background, - con->deco_rect.x + con->deco_rect.width - mark_width - logical_px(2), + con->deco_rect.x + mark_offset_x, con->deco_rect.y + text_offset_y, mark_width); - I3STRING_FREE(mark); + + mark_width += title_padding; } FREE(formatted_mark); } - i3String *title = con->title_format == NULL ? win->name : con_parse_title_format(con); + i3String *title = NULL; + struct Window *win = con->window; + if (win == NULL) { + if (con->title_format == NULL) { + char *_title; + char *tree = con_get_tree_representation(con); + sasprintf(&_title, "i3: %s", tree); + free(tree); + + title = i3string_from_utf8(_title); + FREE(_title); + } else { + title = con_parse_title_format(con); + } + } else { + title = con->title_format == NULL ? win->name : con_parse_title_format(con); + } if (title == NULL) { goto copy_pixmaps; } + int title_offset_x; + switch (config.title_align) { + case ALIGN_LEFT: + /* (pad)[text ](pad)[mark + its pad) */ + title_offset_x = title_padding; + break; + case ALIGN_CENTER: + /* (pad)[ text ](pad)[mark + its pad) + * To center the text inside its allocated space, the surface + * between the brackets, we use the formula + * (surface_width - predict_text_width) / 2 + * where surface_width = deco_width - 2 * pad - mark_width + * so, offset = pad + (surface_width - predict_text_width) / 2 = + * = … = (deco_width - mark_width - predict_text_width) / 2 */ + title_offset_x = max(title_padding, (deco_width - mark_width - predict_text_width(title)) / 2); + break; + case ALIGN_RIGHT: + /* [mark + its pad](pad)[ text](pad) */ + title_offset_x = max(title_padding + mark_width, deco_width - title_padding - predict_text_width(title)); + break; + } + draw_util_text(title, &(parent->frame_buffer), p->color->text, p->color->background, - con->deco_rect.x + logical_px(2), + con->deco_rect.x + title_offset_x, con->deco_rect.y + text_offset_y, - con->deco_rect.width - mark_width - 2 * logical_px(2)); + deco_width - mark_width - 2 * title_padding); - if (con->title_format != NULL) { + if (win == NULL || con->title_format != NULL) { I3STRING_FREE(title); } -after_title: x_draw_decoration_after_title(con, p); copy_pixmaps: draw_util_copy_surface(&(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height);