[Xfce4-commits] <xfdesktop:master> Fix icon labels in RTL languages (Bug 10604)

Eric Koegel noreply at xfce.org
Wed Jan 8 18:02:01 CET 2014


Updating branch refs/heads/master
         to 3cbad61da8ed5ef919d3e1ce38a483134eca8044 (commit)
       from be66a78f2a43de278411bd02bdde1cc0764bb03e (commit)

commit 3cbad61da8ed5ef919d3e1ce38a483134eca8044
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Mon Jan 6 16:01:50 2014 +0300

    Fix icon labels in RTL languages (Bug 10604)

 src/xfdesktop-icon-view.c |   48 +++++++++++++++++++++++++++------------------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c
index 595d25e..ee39f82 100644
--- a/src/xfdesktop-icon-view.c
+++ b/src/xfdesktop-icon-view.c
@@ -267,7 +267,8 @@ static gboolean xfdesktop_icon_view_update_icon_extents(XfdesktopIconView *icon_
                                                         XfdesktopIcon *icon,
                                                         GdkRectangle *pixbuf_extents,
                                                         GdkRectangle *text_extents,
-                                                        GdkRectangle *total_extents);
+                                                        GdkRectangle *total_extents,
+                                                        gint *rtl_offset);
 static void xfdesktop_icon_view_invalidate_icon(XfdesktopIconView *icon_view,
                                                 XfdesktopIcon *icon,
                                                 gboolean recalc_extents);
@@ -2757,6 +2758,7 @@ xfdesktop_icon_view_invalidate_icon(XfdesktopIconView *icon_view,
 {
     GdkRectangle extents;
     gboolean invalidated_something = FALSE;
+    gint rtl_offset;
     
     g_return_if_fail(icon);
     
@@ -2779,7 +2781,8 @@ xfdesktop_icon_view_invalidate_icon(XfdesktopIconView *icon_view,
         if(!xfdesktop_icon_view_update_icon_extents(icon_view, icon,
                                                     &pixbuf_extents,
                                                     &text_extents,
-                                                    &total_extents))
+                                                    &total_extents,
+                                                    &rtl_offset))
         {
             g_warning("Trying to invalidate icon, but can't recalculate extents");
         } else if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
@@ -2986,14 +2989,15 @@ xfdesktop_icon_view_update_icon_extents(XfdesktopIconView *icon_view,
                                         XfdesktopIcon *icon,
                                         GdkRectangle *pixbuf_extents,
                                         GdkRectangle *text_extents,
-                                        GdkRectangle *total_extents)
+                                        GdkRectangle *total_extents,
+                                        gint *rtl_offset)
 {
     GdkRectangle tmp_text;
 
     g_return_val_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view)
                          && XFDESKTOP_IS_ICON(icon)
                          && pixbuf_extents && text_extents
-                         && total_extents, FALSE);
+                         && total_extents && rtl_offset, FALSE);
 
     if(!xfdesktop_icon_view_calculate_icon_pixbuf_area(icon_view, icon,
                                                        pixbuf_extents)
@@ -3005,14 +3009,17 @@ xfdesktop_icon_view_update_icon_extents(XfdesktopIconView *icon_view,
     pixbuf_extents->x += CELL_PADDING + ((CELL_SIZE - CELL_PADDING * 2) - pixbuf_extents->width) / 2;
     pixbuf_extents->y += CELL_PADDING;
 
-    if(!xfdesktop_icon_view_calculate_icon_text_area(icon_view, icon,
-                                                     text_extents)
-       || !xfdesktop_icon_view_shift_area_to_cell(icon_view, icon,
-                                                  text_extents))
-    {
+    if(!xfdesktop_icon_view_calculate_icon_text_area(icon_view, icon, text_extents))
         return FALSE;
-    }
-    text_extents->x += (CELL_SIZE - text_extents->width) / 2;
+
+    /* text_extents->x right now includes the padding needed for rtl languages
+     * to display properly if it's set */
+    *rtl_offset = text_extents->x;
+
+    if(!xfdesktop_icon_view_shift_area_to_cell(icon_view, icon, text_extents))
+        return FALSE;
+
+    text_extents->x += (CELL_SIZE - text_extents->width) / 2 - *rtl_offset;
     text_extents->y += ICON_SIZE + SPACING + LABEL_RADIUS + CELL_PADDING;
 
     tmp_text = *text_extents;
@@ -3043,11 +3050,11 @@ xfdesktop_icon_view_draw_image(cairo_t *cr, GdkPixbuf *pix, GdkRectangle *rect)
 
 static void
 xfdesktop_icon_view_draw_text(cairo_t *cr, PangoLayout *playout,
-                              gint x, gint y, GdkColor *color)
+                              gint x, gint y, gint rtl_offset, GdkColor *color)
 {
     cairo_save(cr);
 
-    cairo_move_to(cr, x, y);
+    cairo_move_to(cr, x - rtl_offset, y);
 
     gdk_cairo_set_source_color(cr, color);
     pango_cairo_show_layout(cr, playout);
@@ -3061,7 +3068,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
                                GdkRectangle *area)
 {
     GtkWidget *widget = GTK_WIDGET(icon_view);
-    gint state;
+    gint state, rtl_offset;
     PangoLayout *playout;
     GdkRectangle pixbuf_extents, text_extents, total_extents;
     GdkRectangle intersection;
@@ -3082,7 +3089,8 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
     if(!xfdesktop_icon_view_update_icon_extents(icon_view, icon,
                                                 &pixbuf_extents,
                                                 &text_extents,
-                                                &total_extents))
+                                                &total_extents,
+                                                &rtl_offset))
     {
         g_warning("Can't update extents for icon '%s'",
                   xfdesktop_icon_peek_label(icon));
@@ -3144,6 +3152,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
             xfdesktop_icon_view_draw_text(cr, playout,
                                           text_extents.x + x_offset,
                                           text_extents.y + y_offset,
+                                          rtl_offset,
                                           sh_text_col);
         }
 
@@ -3154,6 +3163,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         xfdesktop_icon_view_draw_text(cr, playout,
                                       text_extents.x,
                                       text_extents.y,
+                                      rtl_offset,
                                       gtk_widget_get_style(widget)->fg);
     }
 
@@ -3191,10 +3201,10 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         cairo_stroke(cr);
 
 
-        //DBG("cell extents:       %dx%d+%d+%d", cell.width, cell.height, cell.x, cell.y);
-        //DBG("new pixbuf extents: %dx%d+%d+%d", pixbuf_extents.width, pixbuf_extents.height, pixbuf_extents.x, pixbuf_extents.y);
-        //DBG("new text extents:   %dx%d+%d+%d", text_extents.width, text_extents.height, text_extents.x, text_extents.y);
-        //DBG("new total extents:  %dx%d+%d+%d", total_extents.width, total_extents.height, total_extents.x, total_extents.y);
+        DBG("cell extents:       %dx%d+%d+%d", cell.width, cell.height, cell.x, cell.y);
+        DBG("new pixbuf extents: %dx%d+%d+%d", pixbuf_extents.width, pixbuf_extents.height, pixbuf_extents.x, pixbuf_extents.y);
+        DBG("new text extents:   %dx%d+%d+%d", text_extents.width, text_extents.height, text_extents.x, text_extents.y);
+        DBG("new total extents:  %dx%d+%d+%d", total_extents.width, total_extents.height, total_extents.x, total_extents.y);
     }
 #endif
 


More information about the Xfce4-commits mailing list