aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc')
-rw-r--r--widgets/misc/e-unicode.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/widgets/misc/e-unicode.c b/widgets/misc/e-unicode.c
index c4c612002a..596bc0af1f 100644
--- a/widgets/misc/e-unicode.c
+++ b/widgets/misc/e-unicode.c
@@ -15,6 +15,7 @@
#include <unicode.h>
#include <iconv.h>
#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
#include "e-unicode.h"
#include "e-font.h"
@@ -214,7 +215,33 @@ e_utf8_from_gtk_string_sized (GtkWidget *widget, const gchar *string, gint bytes
g_return_val_if_fail (widget, NULL);
ic = e_iconv_from_gdk_font (widget->style->font);
- if (ic == (iconv_t) -1) return NULL;
+ if (ic == (iconv_t) -1) {
+ XFontStruct *xfs;
+ /* If iconv is missing we assume either iso-10646 or iso-8859-1 */
+ xfs = GDK_FONT_XFONT (widget->style->font);
+ if (widget->style->font->type == GDK_FONT_FONTSET || ((xfs->min_byte1 != 0) || (xfs->max_byte1 != 0))) {
+ gint i;
+ guchar * ib, * ob, * new;
+ /* iso-10646 */
+ ib = string;
+ new = ob = g_new (unsigned char, bytes * 6 + 1);
+ for (i = 0; i < (bytes - 1); i += 2) {
+ ob += g_unichar_to_utf8 (ib[i] * 256 + ib[i + 1], ob);
+ }
+ *ob = '\0';
+ return new;
+ } else {
+ gint i;
+ /* iso-8859-1 */
+ ib = string;
+ new = ob = g_new (unsigned char, bytes * 2 + 1);
+ for (i = 0; i < (bytes); i ++) {
+ ob += g_unichar_to_utf8 (ib[i], ob);
+ }
+ *ob = '\0';
+ return new;
+ }
+ }
ib = string;
ibl = bytes;
@@ -265,7 +292,30 @@ e_utf8_to_gtk_string_sized (GtkWidget *widget, const gchar *string, gint bytes)
g_return_val_if_fail (widget, NULL);
ic = e_iconv_to_gdk_font (widget->style->font);
- if (ic == (iconv_t) -1) return NULL;
+ if (ic == (iconv_t) -1) {
+ XFontStruct *xfs;
+ gboolean twobyte;
+ gint len;
+ const gchar *u;
+ unicode_char_t uc;
+ /* If iconv is missing we assume either iso-10646 or iso-8859-1 */
+ xfs = GDK_FONT_XFONT (widget->style->font);
+ twobyte = (widget->style->font->type == GDK_FONT_FONTSET || ((xfs->min_byte1 != 0) || (xfs->max_byte1 != 0)));
+
+ new = g_new (unsigned char, bytes * 4 + 1);
+ u = string;
+ len = 0;
+
+ while ((u) && (u - string < bytes)) {
+ u = unicode_get_utf8 (u, &uc);
+ if (twobyte) {
+ new[len++] = (uc & 0xff00) >> 8;
+ }
+ new[len++] = uc & 0xff;
+ }
+ new[len] = '\0';
+ return new;
+ }
ib = string;
ibl = bytes;