*
*/
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) {
/* 3: draw a rectangle in border color around the client */
if (p->border_style != BS_NONE && p->con_is_leaf) {
/* We might hide some borders adjacent to the screen-edge */
- adjacent_t borders_to_hide = ADJ_NONE;
- borders_to_hide = con_adjacent_borders(con) & config.hide_edge_borders;
-
+ adjacent_t borders_to_hide = con_adjacent_borders(con) & config.hide_edge_borders;
Rect br = con_border_style_rect(con);
/* These rectangles represent the border around the child window
* (left, bottom and right part). We don’t just fill the whole
- * rectangle because some childs are not freely resizable and we want
+ * rectangle because some children are not freely resizable and we want
* their background color to "shine through". */
if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) {
draw_util_rectangle(&(con->frame_buffer), p->color->child_border, 0, 0, br.x, r->height);
/* 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("");
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);