[Xfce4-commits] <xfce4-xkb-plugin:4.10_panel_support> Scale layout label text to the size of the button

Igor Slepchin noreply at xfce.org
Wed Mar 27 00:12:17 CET 2013


Updating branch refs/heads/4.10_panel_support
         to cb13f27b1a2b14a412a260b58a42a35c50dffc92 (commit)
       from 71a87726f0cbbad1df2143c7f84d885a1b6df7e9 (commit)

commit cb13f27b1a2b14a412a260b58a42a35c50dffc92
Author: Igor Slepchin <igor.slepchin at gmail.com>
Date:   Mon Mar 25 16:50:53 2013 -0400

    Scale layout label text to the size of the button
    
    large text size will scale to the max size that fits into the button;
    medium size is 0.7 of that size; small is 0.475 of the max.
    
    The default text label size is now large.
    (largely cherry picked from commit e0fe4255033fab3615006ca23358bfbb7dba1604)

 panel-plugin/xfce4-xkb-plugin.c |    4 +-
 panel-plugin/xkb-cairo.c        |   82 +++++++++++++++++++++++++++------------
 panel-plugin/xkb-cairo.h        |   16 ++++----
 3 files changed, 67 insertions(+), 35 deletions(-)

diff --git a/panel-plugin/xfce4-xkb-plugin.c b/panel-plugin/xfce4-xkb-plugin.c
index 879346b..073fba7 100644
--- a/panel-plugin/xfce4-xkb-plugin.c
+++ b/panel-plugin/xfce4-xkb-plugin.c
@@ -297,7 +297,7 @@ xkb_load_config (t_xkb *xkb, const gchar *filename)
         xfce_rc_set_group (rcfile, NULL);
 
         xkb->display_type = xfce_rc_read_int_entry (rcfile, "display_type", DISPLAY_TYPE_IMAGE);
-        xkb->display_textsize = xfce_rc_read_int_entry (rcfile, "display_textsize", DISPLAY_TEXTSIZE_SMALL);
+        xkb->display_textsize = xfce_rc_read_int_entry (rcfile, "display_textsize", DISPLAY_TEXTSIZE_LARGE);
         xkb->settings->group_policy = xfce_rc_read_int_entry (rcfile, "group_policy", GROUP_POLICY_PER_APPLICATION);
 
         if (xkb->settings->group_policy != GROUP_POLICY_GLOBAL)
@@ -329,7 +329,7 @@ static void
 xkb_load_default (t_xkb *xkb)
 {
     xkb->display_type = DISPLAY_TYPE_IMAGE;
-    xkb->display_textsize = DISPLAY_TEXTSIZE_SMALL;
+    xkb->display_textsize = DISPLAY_TEXTSIZE_LARGE;
     xkb->settings->group_policy = GROUP_POLICY_PER_APPLICATION;
     xkb->settings->default_group = 0;
     xkb->settings->kbd_config = NULL;
diff --git a/panel-plugin/xkb-cairo.c b/panel-plugin/xkb-cairo.c
index 8a3a4ef..af598a7 100644
--- a/panel-plugin/xkb-cairo.c
+++ b/panel-plugin/xkb-cairo.c
@@ -27,7 +27,7 @@
 #include "xkb-util.h"
 #include "xfce4-xkb-plugin.h"
 
-#define XKB_PREFERRED_FONT "Courier New, Courier 10 Pitch, Monospace Bold %d"
+#define XKB_PREFERRED_FONT "Courier New, Courier 10 Pitch, Monospace Bold"
 
 #define xkb_cairo_arc_for_flag(cr, x, y, r, a1, a2) \
     xx = layoutx + width - 12 + x; \
@@ -126,28 +126,31 @@ xkb_cairo_draw_flag (cairo_t *cr,
 void
 xkb_cairo_draw_label (cairo_t *cr,
                       const gchar *group_name,
-                      gint panel_size,
-                      gint actual_width,
-                      gint actual_height,
-                      gint width,
-                      gint height,
-                      gint variant_markers_count,
-                      gint textsize,
-                      GdkColor fgcolor)
+                      const gint panel_size,
+                      const gint actual_width,
+                      const gint actual_height,
+                      const gint width,
+                      const gint height,
+                      const gint variant_markers_count,
+                      const gint textsize,
+                      const GdkColor fgcolor)
 {
     gchar *normalized_group_name;
-    gchar font_str[80];
     gint pango_width, pango_height;
-    gint layoutx, layouty;
+    double layoutx, layouty, text_width, text_height;
     double xx, yy;
+    double scalex, scaley;
     gint i;
-    gint radius;
+    double radius, diameter;
 
     PangoLayout *layout;
     PangoFontDescription *desc;
 
     g_assert (cr != NULL);
 
+    DBG ("actual width/height: %d/%d; markers: %d",
+         actual_width, actual_height, variant_markers_count);
+
     layout = pango_cairo_create_layout (cr);
     normalized_group_name = xkb_util_normalize_group_name (group_name);
 
@@ -160,40 +163,69 @@ xkb_cairo_draw_label (cairo_t *cr,
     }
 
     pango_layout_set_text (layout, normalized_group_name, -1);
+
+    desc = pango_font_description_from_string ( XKB_PREFERRED_FONT );
+    pango_layout_set_font_description (layout, desc);
+    pango_font_description_free (desc);
+
+    gdk_cairo_set_source_color (cr, &fgcolor);
+    pango_layout_get_pixel_size (layout, &pango_width, &pango_height);
+    DBG ("pango_width/height: %d/%d", pango_width, pango_height);
+
     switch (textsize){
         case DISPLAY_TEXTSIZE_SMALL:
         default:    /* catch misconfiguration */
-            g_sprintf (font_str, XKB_PREFERRED_FONT, (int)(0.375 * panel_size) );
+            scalex = scaley = 0.475;
             break;
         case DISPLAY_TEXTSIZE_MEDIUM:
-            g_sprintf (font_str, XKB_PREFERRED_FONT, (int)(0.600 * panel_size) );
+            scalex = scaley = 0.7;
             break;
         case DISPLAY_TEXTSIZE_LARGE:
-            g_sprintf (font_str, XKB_PREFERRED_FONT, (int)(0.900 * panel_size) );
+            scalex = scaley = 1;
             break;
     }
 
-    desc = pango_font_description_from_string (font_str);
-    pango_layout_set_font_description (layout, desc);
-    pango_font_description_free (desc);
+    DBG ("txt size scale x/y: %.2f/%.2f", scalex, scaley);
 
-    gdk_cairo_set_source_color (cr, &fgcolor);
-    pango_layout_get_pixel_size (layout, &pango_width, &pango_height);
+    text_height = actual_height * scaley;
+    scaley = text_height / pango_height;
+    radius = (text_height < 32) ? 1.2 : 2.5;
+    diameter = 2 * radius;
+
+    text_width  = actual_width * scalex;
+    if (actual_width - text_width < 3 + variant_markers_count * diameter)
+    {
+        text_width = actual_width - 3 - (variant_markers_count) * diameter;
+    }
+    else if (textsize == DISPLAY_TEXTSIZE_LARGE)
+    {
+        text_width -= 3;
+    }
 
-    layoutx = (int) (actual_width - (pango_width + variant_markers_count * 7)) / 2;
-    layouty = (int) (actual_height - pango_height) / 2;
+    scalex =  text_width/pango_width;
+
+    layoutx = (actual_width -
+               (text_width + (variant_markers_count ? 3:0) +
+                variant_markers_count * diameter)) / 2;
+    layouty = (actual_height - text_height) / 2;
+
+    DBG ("text_width/height: %.2f/%.2f", text_width, text_height);
+    DBG ("layout x/y: %.2f/%.2f scale x/y: %.2f/%.2f, radius: %.2f",
+         layoutx, layouty, scalex, scaley, radius);
 
     xkb_cairo_move_to (cr, layoutx, layouty);
+    cairo_save (cr);
+    cairo_scale (cr, scalex, scaley);
     pango_cairo_show_layout (cr, layout);
+    cairo_restore (cr);
 
     for (i = 0; i < variant_markers_count; i++)
     {
         cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
         cairo_set_line_width (cr, 1);
-        radius = (panel_size < 32) ? 1.5 : 2.5;
         xkb_cairo_arc_for_label (cr,
-                layoutx + pango_width + 3 + (7 * i),
-                layouty + pango_height - (pango_height / 5),
+                layoutx + text_width + 3 + (diameter * i),
+                layouty + text_height - (text_height / 5),
                 radius, 0, 2 * G_PI
         );
         cairo_fill (cr);
diff --git a/panel-plugin/xkb-cairo.h b/panel-plugin/xkb-cairo.h
index 13b790a..4be2b24 100644
--- a/panel-plugin/xkb-cairo.h
+++ b/panel-plugin/xkb-cairo.h
@@ -46,14 +46,14 @@ void        xkb_cairo_draw_flag     (cairo_t *cr,
 
 void        xkb_cairo_draw_label    (cairo_t *cr,
                                      const gchar *group_name,
-                                     gint panel_size,
-                                     gint actual_width,
-                                     gint actual_height,
-                                     gint width,
-                                     gint height,
-                                     gint variant_markers_count,
-                                     gint textsize,
-                                     GdkColor fgcolor);
+                                     const gint panel_size,
+                                     const gint actual_width,
+                                     const gint actual_height,
+                                     const gint width,
+                                     const gint height,
+                                     const gint variant_markers_count,
+                                     const gint textsize,
+                                     const GdkColor fgcolor);
 
 #endif
 


More information about the Xfce4-commits mailing list