cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
}
+/* Draws a border with a specified line width */
+static void
+draw_border(cairo_t *cairo, double width, double height, double line_width)
+{
+ cairo_save(cairo);
+
+ double x, y, w, h;
+ /* The anchor point of a line is in the center */
+ x = y = line_width / 2;
+ w = width - line_width;
+ h = height - line_width;
+ cairo_set_line_width(cairo, line_width);
+ cairo_rectangle(cairo, x, y, w, h);
+ cairo_stroke(cairo);
+
+ cairo_restore(cairo);
+}
+
/* is title different from app_id/class? */
static int
is_title_different(struct view *view)
cairo_rectangle(cairo, 0, 0, w, h);
cairo_fill(cairo);
- /* border */
- set_source(cairo, theme->osd_label_text_color);
- cairo_rectangle(cairo, 0, 0, w, h);
- cairo_stroke(cairo);
+ /* Border */
+ set_source(cairo, theme->osd_border_color);
+ draw_border(cairo, w, h, theme->osd_border_width);
/* highlight current window */
int y = OSD_BORDER_WIDTH;
parse_hexstr("#dddad6", theme->menu_items_active_bg_color);
parse_hexstr("#000000", theme->menu_items_active_text_color);
- /* inherit colors in post_processing() if not set elsewhere */
+ /* inherit settings in post_processing() if not set elsewhere */
theme->osd_bg_color[0] = FLT_MIN;
+ theme->osd_border_width = INT_MIN;
+ theme->osd_border_color[0] = FLT_MIN;
theme->osd_label_text_color[0] = FLT_MIN;
}
if (match(key, "osd.bg.color")) {
parse_hexstr(value, theme->osd_bg_color);
}
+ if (match(key, "osd.border.width")) {
+ theme->osd_border_width = atoi(value);
+ }
+ if (match(key, "osd.border.color")) {
+ parse_hexstr(value, theme->osd_border_color);
+ }
if (match(key, "osd.label.text.color")) {
parse_hexstr(value, theme->osd_label_text_color);
}
theme->title_height = rc.corner_radius + 1;
}
- /* Inherit colors if not set */
+ /* Inherit OSD settings if not set */
if (theme->osd_bg_color[0] == FLT_MIN) {
memcpy(theme->osd_bg_color,
theme->window_active_title_bg_color,
sizeof(theme->osd_bg_color));
}
+ if (theme->osd_border_width == INT_MIN) {
+ theme->osd_border_width = theme->border_width;
+ }
if (theme->osd_label_text_color[0] == FLT_MIN) {
memcpy(theme->osd_label_text_color,
theme->window_active_label_text_color,
sizeof(theme->osd_label_text_color));
}
+ if (theme->osd_border_color[0] == FLT_MIN) {
+ /*
+ * As per http://openbox.org/wiki/Help:Themes#osd.border.color
+ * we should fall back to window_active_border_color but
+ * that is usually the same as window_active_title_bg_color
+ * and thus the fallback for osd_bg_color. Which would mean
+ * they are both the same color and thus the border is invisible.
+ *
+ * Instead, we fall back to osd_label_text_color which in turn
+ * falls back to window_active_label_text_color.
+ */
+ memcpy(theme->osd_border_color, theme->osd_label_text_color,
+ sizeof(theme->osd_border_color));
+ }
}
void