aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2005-10-10 20:48:49 +0800
committerChristian Persch <chpe@src.gnome.org>2005-10-10 20:48:49 +0800
commitc42c18f05cccabccd3b812f2ddf768d166db259c (patch)
tree5cff27d0e00fc4b886bb9148a4c30f226b433b9a /lib
parentd22a95c092b87ad574dadaa91167912a963aa528 (diff)
downloadgsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar.gz
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar.bz2
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar.lz
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar.xz
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.tar.zst
gsoc2013-epiphany-c42c18f05cccabccd3b812f2ddf768d166db259c.zip
Bring back ephy_string_shorten.
2005-10-10 Christian Persch <chpe@cvs.gnome.org> * lib/ephy-string.c: (ephy_string_blank_chr), (ephy_string_shorten): * lib/ephy-string.h: Bring back ephy_string_shorten. * src/ephy-tab.c: (ephy_tab_file_monitor_cb), (ephy_tab_set_title): Shorten overlong tab titles, hard. Increase reload delay slightly. Strip whitespace from tab title before determining if it's empty.
Diffstat (limited to 'lib')
-rw-r--r--lib/ephy-string.c49
-rw-r--r--lib/ephy-string.h9
2 files changed, 55 insertions, 3 deletions
diff --git a/lib/ephy-string.c b/lib/ephy-string.c
index 2d53c25b5..f996a7fe3 100644
--- a/lib/ephy-string.c
+++ b/lib/ephy-string.c
@@ -27,6 +27,8 @@
#include <stdlib.h>
#include <glib.h>
+#define ELLIPSIS "\xe2\x80\xa6"
+
gboolean
ephy_string_to_int (const char *string, gulong *integer)
{
@@ -85,3 +87,50 @@ ephy_string_blank_chr (char *source)
return source;
}
+
+/**
+ * ephy_string_shorten: shortens a string
+ * @str: the string to shorten, in UTF-8
+ * @target_length: the length of the shortened string (in characters)
+ *
+ * If @str is already short enough, it is returned. Otherwise a new string
+ * is allocated and @str is consumed.
+ *
+ * Return value: a newly allocated string, not longer than target_length
+ * characters.
+ */
+char *
+ephy_string_shorten (const char *str,
+ gsize target_length)
+{
+ char *new_str;
+ glong actual_length;
+ gulong bytes;
+
+ g_return_val_if_fail (target_length > 0, NULL);
+
+ if (!str) return NULL;
+
+ /* FIXME: this function is a big mess. While it is utf-8 safe now,
+ * it can still split a sequence of combining characters.
+ */
+
+ actual_length = g_utf8_strlen (str, -1);
+
+ /* if the string is already short enough, or if it's too short for
+ * us to shorten it, return a new copy */
+ if (actual_length <= target_length) return g_strdup (str);
+
+ /* create string */
+ bytes = GPOINTER_TO_UINT (g_utf8_offset_to_pointer (str, target_length - 1) - str);
+
+ new_str = g_new (gchar, bytes + strlen(ELLIPSIS) + 1);
+
+ strncpy (new_str, str, bytes);
+ strncpy (new_str + bytes, ELLIPSIS, strlen (ELLIPSIS));
+ new_str[bytes + strlen (ELLIPSIS)] = '\0';
+
+ g_free (str);
+
+ return new_str;
+}
diff --git a/lib/ephy-string.h b/lib/ephy-string.h
index 36e23d1c3..86ab9eafc 100644
--- a/lib/ephy-string.h
+++ b/lib/ephy-string.h
@@ -25,10 +25,13 @@
G_BEGIN_DECLS
-gboolean ephy_string_to_int (const char *string,
- gulong *integer);
+gboolean ephy_string_to_int (const char *string,
+ gulong *integer);
-char *ephy_string_blank_chr (char *source);
+char *ephy_string_blank_chr (char *source);
+
+char *ephy_string_shorten (const char *str,
+ gsize target_length);
G_END_DECLS