Mercurial > pidgin.yaz
diff pidgin/gtkutils.c @ 27940:b623c1824f29
propagate from branch 'im.pidgin.pidgin' (head 58fbcc161c5eadf3f307cd460a6ce0a209d908df)
to branch 'im.pidgin.pidgin.yaz' (head a378a1d9618c47f5b0e6c67daf613d3c4275f7cf)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Thu, 16 Apr 2009 05:51:42 +0000 |
parents | b162300ab1e7 1688f7e15530 |
children | f3ccb5a36fd6 |
line wrap: on
line diff
--- a/pidgin/gtkutils.c Wed Apr 15 15:46:31 2009 +0000 +++ b/pidgin/gtkutils.c Thu Apr 16 05:51:42 2009 +0000 @@ -3677,3 +3677,61 @@ gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); } +gchar * +pidgin_gtk_ellipsis_text(GtkWidget *widget, const char *text, gint min_width, gchar *ellipsis) +{ + PangoLayout *layout; + gint width, height; + gint ewidth; + glong len0, len1, len2; + gchar *buf, *buf_tmp; + gboolean with_ellipsis = FALSE; + const gchar default_ellipsis[] = "..."; + + if(!ellipsis) + ellipsis = default_ellipsis; + + /* allocate buf */ + buf = g_malloc0(strlen(text) * 2); + + /* create layout */ + layout = gtk_widget_create_pango_layout(widget, ellipsis); + pango_layout_get_pixel_size(layout, &width, &height); + ewidth = width; /* length of ellipsis text. */ + + len0 = 0; + len1 = g_utf8_strlen(text, -1); + len2 = len1; + + while (1) { + + if (len2 == len0) + break; + + g_utf8_strncpy(buf, text, len2); + pango_layout_set_text(layout, buf, -1); + pango_layout_get_pixel_size(layout, &width, &height); + + if(!with_ellipsis && width <= min_width) + break; + else + with_ellipsis = TRUE; + + if (width + ewidth > min_width) + len1 = len2; + else + len0 = len2; + + len2 = (len0 + len1) / 2; + } + + g_object_unref(layout); + + if (with_ellipsis) { + buf_tmp = buf; + buf = g_strdup_printf("%s%s", buf_tmp, ellipsis); + g_free(buf_tmp); + } + + return buf; +}