aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc')
-rw-r--r--widgets/misc/e-unicode.c159
-rw-r--r--widgets/misc/e-unicode.h27
2 files changed, 186 insertions, 0 deletions
diff --git a/widgets/misc/e-unicode.c b/widgets/misc/e-unicode.c
new file mode 100644
index 0000000000..a865a7d0fa
--- /dev/null
+++ b/widgets/misc/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);
+}
+
diff --git a/widgets/misc/e-unicode.h b/widgets/misc/e-unicode.h
new file mode 100644
index 0000000000..7bfba7e532
--- /dev/null
+++ b/widgets/misc/e-unicode.h
@@ -0,0 +1,27 @@
+#ifndef _E_UNICODE_H_
+#define _E_UNICODE_H_
+
+#include <sys/types.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+
+gchar *e_utf8_from_gtk_event_key (GtkWidget *widget, guint keyval, const gchar *string);
+
+gchar *e_utf8_from_gtk_string (GtkWidget *widget, const gchar *string);
+
+gchar * e_utf8_to_gtk_string (GtkWidget *widget, const gchar *string);
+
+/*
+ * These are simple wrappers that save us some typing
+ */
+
+/* NB! This return newly allocated string, not const as gtk+ one */
+
+gchar *e_utf8_gtk_entry_get_text (GtkEntry *entry);
+
+void e_utf8_gtk_entry_set_text (GtkEntry *entry, const gchar *text);
+
+gchar *e_utf8_gtk_editable_get_chars (GtkEditable *editable, gint start, gint end);
+
+#endif
+