add shortcuts for text rendering. it underlines the first character in the string that matches the shortcut
This commit is contained in:
parent
d91c67bf93
commit
138d3e38d8
2 changed files with 38 additions and 1 deletions
|
@ -175,6 +175,8 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
XftColor c;
|
XftColor c;
|
||||||
gint mw;
|
gint mw;
|
||||||
PangoRectangle rect;
|
PangoRectangle rect;
|
||||||
|
gchar *text;
|
||||||
|
PangoAttrList* attrs = NULL;
|
||||||
|
|
||||||
/* center the text vertically
|
/* center the text vertically
|
||||||
We do this centering based on the 'baseline' since different fonts have
|
We do this centering based on the 'baseline' since different fonts have
|
||||||
|
@ -188,9 +190,37 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
w = area->width - 4;
|
w = area->width - 4;
|
||||||
h = area->height;
|
h = area->height;
|
||||||
|
|
||||||
pango_layout_set_text(t->font->layout, t->string, -1);
|
/* * * set up the layout * * */
|
||||||
|
|
||||||
|
text = g_strdup(t->string);
|
||||||
|
|
||||||
|
if (t->shortcut) {
|
||||||
|
gchar *i;
|
||||||
|
gchar *lowertext;
|
||||||
|
|
||||||
|
lowertext = g_utf8_strdown(text, -1);
|
||||||
|
i = g_utf8_strchr(lowertext, -1, t->shortcut);
|
||||||
|
if (i != NULL) {
|
||||||
|
PangoAttribute *a;
|
||||||
|
|
||||||
|
a = pango_attr_underline_new(PANGO_UNDERLINE_LOW);
|
||||||
|
a->start_index = i - lowertext;
|
||||||
|
a->end_index = i - lowertext +
|
||||||
|
g_unichar_to_utf8(t->shortcut, NULL);
|
||||||
|
|
||||||
|
attrs = pango_attr_list_new();
|
||||||
|
pango_attr_list_insert(attrs, a);
|
||||||
|
}
|
||||||
|
g_free(lowertext);
|
||||||
|
}
|
||||||
|
|
||||||
|
pango_layout_set_text(t->font->layout, text, -1);
|
||||||
pango_layout_set_width(t->font->layout, w * PANGO_SCALE);
|
pango_layout_set_width(t->font->layout, w * PANGO_SCALE);
|
||||||
|
|
||||||
|
g_free(text);
|
||||||
|
|
||||||
|
/* * * end of setting up the layout * * */
|
||||||
|
|
||||||
pango_layout_get_pixel_extents(t->font->layout, NULL, &rect);
|
pango_layout_get_pixel_extents(t->font->layout, NULL, &rect);
|
||||||
mw = rect.width;
|
mw = rect.width;
|
||||||
|
|
||||||
|
@ -213,6 +243,9 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
c.color.blue = t->shadow_color->b | t->shadow_color->b << 8;
|
c.color.blue = t->shadow_color->b | t->shadow_color->b << 8;
|
||||||
c.color.alpha = 0xffff * t->shadow_alpha / 255;
|
c.color.alpha = 0xffff * t->shadow_alpha / 255;
|
||||||
c.pixel = t->shadow_color->pixel;
|
c.pixel = t->shadow_color->pixel;
|
||||||
|
|
||||||
|
pango_layout_set_attributes(t->font->layout, NULL);
|
||||||
|
|
||||||
/* see below... */
|
/* see below... */
|
||||||
pango_xft_render_layout_line
|
pango_xft_render_layout_line
|
||||||
(d, &c, pango_layout_get_line(t->font->layout, 0),
|
(d, &c, pango_layout_get_line(t->font->layout, 0),
|
||||||
|
@ -226,6 +259,9 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
c.color.alpha = 0xff | 0xff << 8; /* fully opaque text */
|
c.color.alpha = 0xff | 0xff << 8; /* fully opaque text */
|
||||||
c.pixel = t->color->pixel;
|
c.pixel = t->color->pixel;
|
||||||
|
|
||||||
|
pango_layout_set_attributes(t->font->layout, attrs);
|
||||||
|
if (attrs != NULL) pango_attr_list_unref(attrs);
|
||||||
|
|
||||||
/* layout_line() uses y to specify the baseline
|
/* layout_line() uses y to specify the baseline
|
||||||
The line doesn't need to be freed, it's a part of the layout */
|
The line doesn't need to be freed, it's a part of the layout */
|
||||||
pango_xft_render_layout_line
|
pango_xft_render_layout_line
|
||||||
|
|
|
@ -126,6 +126,7 @@ struct _RrTextureText {
|
||||||
gint shadow_offset_y;
|
gint shadow_offset_y;
|
||||||
RrColor *shadow_color;
|
RrColor *shadow_color;
|
||||||
gchar shadow_alpha;
|
gchar shadow_alpha;
|
||||||
|
gunichar shortcut; /*!< Underline this character */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _RrPixmapMask {
|
struct _RrPixmapMask {
|
||||||
|
|
Loading…
Reference in a new issue