return state;
/* TODO: better error handling? */
- ELOG("No state found\n");
+ ELOG("No state found for window 0x%08x\n", window);
assert(false);
return NULL;
}
*
*/
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) {
assert(con->parent != NULL);
Rect *dr = &(con->deco_rect);
- adjacent_t borders_to_hide = con_adjacent_borders(con) & config.hide_edge_borders;
- int deco_diff_l = borders_to_hide & ADJ_LEFT_SCREEN_EDGE ? 0 : con->current_border_width;
- int deco_diff_r = borders_to_hide & ADJ_RIGHT_SCREEN_EDGE ? 0 : con->current_border_width;
- if (con->parent->layout == L_TABBED ||
- (con->parent->layout == L_STACKED && TAILQ_NEXT(con, nodes) != NULL)) {
- deco_diff_l = 0;
- deco_diff_r = 0;
- }
+ /* Left */
+ draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
+ dr->x, dr->y, 1, dr->height);
+
+ /* Right */
+ draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
+ dr->x + dr->width - 1, dr->y, 1, dr->height);
+
+ /* Top */
draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
dr->x, dr->y, dr->width, 1);
+ /* Bottom */
draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
- dr->x + deco_diff_l, dr->y + dr->height - 1, dr->width - (deco_diff_l + deco_diff_r), 1);
+ dr->x, dr->y + dr->height - 1, dr->width, 1);
}
static void x_draw_decoration_after_title(Con *con, struct deco_render_params *p) {
dr->height);
}
- /* Draw a 1px separator line before and after every tab, so that tabs can
- * be easily distinguished. */
- if (con->parent->layout == L_TABBED) {
- /* Left side */
- draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
- dr->x, dr->y, 1, dr->height);
-
- /* Right side */
- draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
- dr->x + dr->width - 1, dr->y, 1, dr->height);
- }
-
/* Redraw the border. */
x_draw_title_border(con, p);
}
draw_util_rectangle(&(parent->frame_buffer), p->color->background,
con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height);
- /* 5: draw two unconnected horizontal lines in border color */
+ /* 5: draw title border */
x_draw_title_border(con, p);
/* 6: draw the 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);
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) {
I3STRING_FREE(title);