From 138d3e38d88dbcb1426bd1eb0cd8c43dd01777ad Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 25 Apr 2007 01:32:43 +0000 Subject: [PATCH] add shortcuts for text rendering. it underlines the first character in the string that matches the shortcut --- render/font.c | 38 +++++++++++++++++++++++++++++++++++++- render/render.h | 1 + 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/render/font.c b/render/font.c index 266a0086..a0e622d5 100644 --- a/render/font.c +++ b/render/font.c @@ -175,6 +175,8 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) XftColor c; gint mw; PangoRectangle rect; + gchar *text; + PangoAttrList* attrs = NULL; /* center the text vertically 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; 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); + g_free(text); + + /* * * end of setting up the layout * * */ + pango_layout_get_pixel_extents(t->font->layout, NULL, &rect); 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.alpha = 0xffff * t->shadow_alpha / 255; c.pixel = t->shadow_color->pixel; + + pango_layout_set_attributes(t->font->layout, NULL); + /* see below... */ pango_xft_render_layout_line (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.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 The line doesn't need to be freed, it's a part of the layout */ pango_xft_render_layout_line diff --git a/render/render.h b/render/render.h index 7beef9c9..26de9e48 100644 --- a/render/render.h +++ b/render/render.h @@ -126,6 +126,7 @@ struct _RrTextureText { gint shadow_offset_y; RrColor *shadow_color; gchar shadow_alpha; + gunichar shortcut; /*!< Underline this character */ }; struct _RrPixmapMask { -- 2.39.2