The attached patch is meant to improve icon view line breaks by looking for '.', '_' and CamelCase characters, and inserting pango hints that it may preferably break at a particular position (i.e. treat it as end of word). It is meant to fix bug 300790 [1], while the more interesting discussion was going on in bug 323711 [2] between Behdad and myself. caveats: - Some developers might not like breaking after CamelCase. It looks more aesthetically, but makes FooFooBar indistinguishable from FooFoo Bar if we break between the two words. Comments appreciated - The code tries to be smart by only breaking after '.' and '_' if no digit follows to not break version information. It seems to work quiet well, but needs some testing - The layout is changed when editing a filename that had a manually inserted line break. This won't be fixed until [2] is properly resolved [1] http://bugzilla.gnome.org/show_bug.cgi?id=300790 [2] http://bugzilla.gnome.org/show_bug.cgi?id=323711 -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-icon-canvas-item.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-canvas-item.c,v retrieving revision 1.195 diff -u -p -r1.195 nautilus-icon-canvas-item.c --- libnautilus-private/nautilus-icon-canvas-item.c 14 Nov 2005 15:49:58 -0000 1.195 +++ libnautilus-private/nautilus-icon-canvas-item.c 11 Dec 2005 21:01:42 -0000 @@ -1588,6 +1588,8 @@ nautilus_icon_canvas_item_draw (EelCanva draw_label_text (icon_item, drawable, FALSE, icon_rect); } +#define ZERO_WIDTH_SPACE "\xE2\x80\x8B" + static PangoLayout * create_label_layout (NautilusIconCanvasItem *item, const char *text) @@ -1597,6 +1599,9 @@ create_label_layout (NautilusIconCanvasI PangoFontDescription *desc; NautilusIconContainer *container; EelCanvasItem *canvas_item; + char *zeroified_text; + const char *p; + char *q; canvas_item = EEL_CANVAS_ITEM (item); @@ -1604,7 +1609,29 @@ create_label_layout (NautilusIconCanvasI context = gtk_widget_get_pango_context (GTK_WIDGET (canvas_item->canvas)); layout = pango_layout_new (context); - pango_layout_set_text (layout, text, -1); + if (text == NULL) { + zeroified_text = NULL; + } else { + zeroified_text = g_malloc ((1 + strlen (ZERO_WIDTH_SPACE)) * (strlen (text) + 1)); + q = zeroified_text; + + for (p = text; *p != '\0'; p++) { + *(q++) = *p; + + if (((*p == '_' || *p == '.') && !g_ascii_isdigit(*(p+1))) || + (g_ascii_islower (*p) && g_ascii_isupper (*(p+1)))) { + /* Ensure that we allow to break after '_' or '.' characters, + * if they are not likely to be part of a version information, to + * not break wrapping of foobar-0.0.1. + * Also allow wrapping for CamelCase filenames. */ + strcpy (q, ZERO_WIDTH_SPACE); + q += strlen (ZERO_WIDTH_SPACE); + } + } + *q = '\0'; + } + + pango_layout_set_text (layout, zeroified_text, -1); pango_layout_set_width (layout, floor (nautilus_icon_canvas_item_get_max_text_width (item)) * PANGO_SCALE); if (container->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE) { @@ -1627,6 +1654,7 @@ create_label_layout (NautilusIconCanvasI } pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); + g_free (zeroified_text); return layout; }
Attachment:
signature.asc
Description: This is a digitally signed message part