]> Dogcows Code - chaz/openbox/blobdiff - render/font.c
add shortcuts for text rendering. it underlines the first character in the string...
[chaz/openbox] / render / font.c
index e91925b5090f745984e3cf096b6fc5d6c7adc54a..a0e622d55364deac81a5f66f50690127173bc649 100644 (file)
@@ -2,7 +2,7 @@
 
    font.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
    Copyright (c) 2003        Derek Foreman
 
    This program is free software; you can redistribute it and/or modify
@@ -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
This page took 0.022667 seconds and 4 git commands to generate.