* @text: text to be generated as texture
* @font: font description
* @color: foreground color in rgba format
+ * @bg_color: background color in rgba format
* @arrow: arrow (utf8) character to show or NULL for none
*/
void font_buffer_create(struct lab_data_buffer **buffer, int max_width,
- const char *text, struct font *font, float *color, const char *arrow,
- double scale);
+ const char *text, struct font *font, const float *color,
+ const float *bg_color, const char *arrow, double scale);
/**
* font_finish - free some font related resources
* Sets the cairo color.
* Splits a float[4] single color array into its own arguments
*/
-void set_cairo_color(cairo_t *cairo, float *color);
+void set_cairo_color(cairo_t *cairo, const float *color);
/* Draws a border with a specified line width */
void draw_cairo_border(cairo_t *cairo, struct wlr_fbox fbox, double line_width);
char *text;
int max_width;
float color[4];
+ float bg_color[4];
char *arrow;
struct font font;
struct scaled_scene_buffer *scaled_buffer;
* - font and color the same
*/
void scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
- int max_width, struct font *font, float *color, const char *arrow);
+ int max_width, struct font *font, const float *color,
+ const float *bg_color, const char *arrow);
/**
* Update the max width of an existing auto scaling font buffer
void
font_buffer_create(struct lab_data_buffer **buffer, int max_width,
- const char *text, struct font *font, float *color, const char *arrow,
- double scale)
+ const char *text, struct font *font, const float *color,
+ const float *bg_color, const char *arrow, double scale)
{
/* Allow a minimum of one pixel each for text and arrow */
if (max_width < 2) {
cairo_t *cairo = (*buffer)->cairo;
cairo_surface_t *surf = cairo_get_target(cairo);
+ /*
+ * Fill background color first - necessary for subpixel
+ * rendering, which does not work properly on transparency
+ */
+ set_cairo_color(cairo, bg_color);
+ cairo_rectangle(cairo, 0, 0, (*buffer)->unscaled_width,
+ (*buffer)->unscaled_height);
+ cairo_fill(cairo);
+
set_cairo_color(cairo, color);
cairo_move_to(cairo, 0, 0);
/* Sets the cairo color. Splits the single color channels */
void
-set_cairo_color(cairo_t *cairo, float *c)
+set_cairo_color(cairo_t *cairo, const float *c)
{
cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
}
/* Buffer gets free'd automatically along the backing wlr_buffer */
font_buffer_create(&buffer, self->max_width, self->text,
- &self->font, self->color, self->arrow, scale);
+ &self->font, self->color, self->bg_color, self->arrow, scale);
self->width = buffer ? buffer->unscaled_width : 0;
self->height = buffer ? buffer->unscaled_height : 0;
void
scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
- int max_width, struct font *font, float *color,
- const char *arrow)
+ int max_width, struct font *font, const float *color,
+ const float *bg_color, const char *arrow)
{
assert(self);
assert(text);
self->font.slant = font->slant;
self->font.weight = font->weight;
memcpy(self->color, color, sizeof(self->color));
+ memcpy(self->bg_color, bg_color, sizeof(self->bg_color));
self->arrow = arrow ? xstrdup(arrow) : NULL;
/* Invalidate cache and force a new render */
/* Font buffers */
scaled_font_buffer_update(menuitem->normal.buffer, text, menuitem->native_width,
- &rc.font_menuitem, theme->menu_items_text_color, arrow);
+ &rc.font_menuitem, theme->menu_items_text_color,
+ theme->menu_items_bg_color, arrow);
scaled_font_buffer_update(menuitem->selected.buffer, text, menuitem->native_width,
- &rc.font_menuitem, theme->menu_items_active_text_color, arrow);
+ &rc.font_menuitem, theme->menu_items_active_text_color,
+ theme->menu_items_active_bg_color, arrow);
/* Center font nodes */
x = theme->menu_item_padding_x;
(eff_height - indicator->height) / 2);
scaled_font_buffer_update(indicator->text, text, width, &rc.font_osd,
- rc.theme->osd_label_text_color, NULL /* const char *arrow */);
+ rc.theme->osd_label_text_color, rc.theme->osd_bg_color,
+ NULL /* const char *arrow */);
}
void
struct ssd_state_title *state = &ssd->state.title;
bool title_unchanged = state->text && !strcmp(title, state->text);
- float *text_color;
+ const float *text_color;
+ const float *bg_color;
struct font *font = NULL;
struct ssd_part *part;
struct ssd_sub_tree *subtree;
if (subtree == &ssd->titlebar.active) {
dstate = &state->active;
text_color = theme->window_active_label_text_color;
+ bg_color = theme->window_active_title_bg_color;
font = &rc.font_activewindow;
} else {
dstate = &state->inactive;
text_color = theme->window_inactive_label_text_color;
+ bg_color = theme->window_inactive_title_bg_color;
font = &rc.font_inactivewindow;
}
if (part->buffer) {
scaled_font_buffer_update(part->buffer, title,
title_bg_width, font,
- text_color, NULL);
+ text_color, bg_color, NULL);
}
/* And finally update the cache */