diff options
Diffstat (limited to 'e-util/e-unicode.c')
-rw-r--r-- | e-util/e-unicode.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/e-util/e-unicode.c b/e-util/e-unicode.c new file mode 100644 index 0000000000..a865a7d0fa --- /dev/null +++ b/e-util/e-unicode.c @@ -0,0 +1,159 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2000 Helix Code, Inc. + * + * Authors: Lauris Kaplinski <lauris@helixcode.com> + * + */ + +#include <config.h> +#include <unicode.h> +#include "e-unicode.h" + +gchar * +e_utf8_from_gtk_event_key (GtkWidget *widget, guint keyval, const gchar *string) +{ + /* test it out with iso-8859-1 */ + + static gboolean uinit = FALSE; + static gboolean uerror = FALSE; + static unicode_iconv_t uiconv = (unicode_iconv_t) -1; + char *new, *ob; + size_t ibl, obl; + + if (uerror) return NULL; + + if (!string) return NULL; + + if (!uinit) { + unicode_init (); + uiconv = unicode_iconv_open ("UTF-8", "iso-8859-1"); + if (uiconv == (unicode_iconv_t) -1) { + uerror = TRUE; + return NULL; + } else { + uinit = TRUE; + } + } + + ibl = strlen (string); + new = ob = g_new (gchar, ibl * 6 + 1); + obl = ibl * 6 + 1; + + unicode_iconv (uiconv, &string, &ibl, &ob, &obl); + + *ob = '\0'; + + return new; +} + +gchar * +e_utf8_from_gtk_string (GtkWidget *widget, const gchar *string) +{ + /* test it out with iso-8859-1 */ + + static gboolean uinit = FALSE; + static gboolean uerror = FALSE; + static unicode_iconv_t uiconv = (unicode_iconv_t) -1; + char *new, *ob; + size_t ibl, obl; + + if (uerror) return NULL; + + if (!string) return NULL; + + if (!uinit) { + unicode_init (); + uiconv = unicode_iconv_open ("UTF-8", "iso-8859-1"); + if (uiconv == (unicode_iconv_t) -1) { + uerror = TRUE; + return NULL; + } else { + uinit = TRUE; + } + } + + ibl = strlen (string); + new = ob = g_new (gchar, ibl * 6 + 1); + obl = ibl * 6 + 1; + + unicode_iconv (uiconv, &string, &ibl, &ob, &obl); + + *ob = '\0'; + + return new; +} + +gchar * +e_utf8_to_gtk_string (GtkWidget *widget, const gchar *string) +{ + /* test it out with iso-8859-1 */ + + static gboolean uinit = FALSE; + static gboolean uerror = FALSE; + static unicode_iconv_t uiconv = (unicode_iconv_t) -1; + char *new, *ob; + size_t ibl, obl; + + if (uerror) return NULL; + + if (!string) return NULL; + + if (!uinit) { + unicode_init (); + uiconv = unicode_iconv_open ("iso-8859-1", "UTF-8"); + if (uiconv == (unicode_iconv_t) -1) { + uerror = TRUE; + return NULL; + } else { + uinit = TRUE; + } + } + + ibl = strlen (string); + new = ob = g_new (gchar, ibl * 2 + 1); + obl = ibl * 2 + 1; + + unicode_iconv (uiconv, &string, &ibl, &ob, &obl); + + *ob = '\0'; + + return new; +} + +gchar * +e_utf8_gtk_entry_get_text (GtkEntry *entry) +{ + gchar *s, *u; + + s = gtk_entry_get_text (entry); + if (!s) return NULL; + u = e_utf8_from_gtk_string ((GtkWidget *) entry, s); + return u; +} + +gchar * +e_utf8_gtk_editable_get_chars (GtkEditable *editable, gint start, gint end) +{ + gchar *s, *u; + + s = gtk_editable_get_chars (editable, start, end); + if (!s) return NULL; + u = e_utf8_from_gtk_string ((GtkWidget *) editable, s); + g_free (s); + return u; +} + +void +e_utf8_gtk_entry_set_text (GtkEntry *entry, const gchar *text) +{ + gchar *s; + + if (!text) return; + + s = e_utf8_to_gtk_string ((GtkWidget *) entry, text); + gtk_entry_set_text (entry, s); + + if (s) g_free (s); +} + |