diff --git a/ChangeLog b/ChangeLog index fff6d2da1c..4cc4b0079f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2006-11-28 Behdad Esfahbod + + Remove the broken Thai input method and add a functional Thai and Lao + input method by Theppitak Karoonboonyanan. (#81031) + + * modules/input/imthai.c: + * modules/input/gtkimcontextthai.c: + * modules/input/gtkimcontextthai.h: + * modules/input/thai-charprop.c: + * modules/input/thai-charprop.h: + Added. + + * modules/input/imthai-broken.c: + Removed. + + * modules/input/Makefile.am: + Updated. + 2006-11-27 Christian Persch * gtk/gtkstatusicon.c: Notify when the screen changes. Bug #379793. diff --git a/modules/input/Makefile.am b/modules/input/Makefile.am index d4a2088c5d..a7c5165a7c 100644 --- a/modules/input/Makefile.am +++ b/modules/input/Makefile.am @@ -58,9 +58,14 @@ im_ti_et_la_LDFLAGS = -rpath $(moduledir) -avoid-version -module $(no_undefined) im_ti_et_la_SOURCES = imti-et.c im_ti_et_la_LIBADD = $(LDADDS) -im_thai_broken_la_LDFLAGS = -rpath $(moduledir) -avoid-version -module $(no_undefined) -im_thai_broken_la_SOURCES = imthai-broken.c -im_thai_broken_la_LIBADD = $(LDADDS) +im_thai_la_LDFLAGS = -rpath $(moduledir) -avoid-version -module $(no_undefined) +im_thai_la_SOURCES = \ + thai-charprop.c \ + thai-charprop.h \ + gtkimcontextthai.c \ + gtkimcontextthai.h \ + imthai.c +im_thai_la_LIBADD = $(LDADDS) im_viqr_la_LDFLAGS = -rpath $(moduledir) -avoid-version -module $(no_undefined) im_viqr_la_SOURCES = imviqr.c @@ -123,7 +128,7 @@ module_LTLIBRARIES = \ im-cyrillic-translit.la \ im-inuktitut.la \ im-ipa.la \ - im-thai-broken.la \ + im-thai.la \ im-ti-er.la \ im-ti-et.la \ im-viqr.la \ diff --git a/modules/input/gtkimcontextthai.c b/modules/input/gtkimcontextthai.c new file mode 100644 index 0000000000..b1a0c5dc45 --- /dev/null +++ b/modules/input/gtkimcontextthai.c @@ -0,0 +1,345 @@ +/* GTK - The GIMP Toolkit + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Theppitak Karoonboonyanan + * + */ + +#include + +#include +#include +#include "gtkimcontextthai.h" +#include "thai-charprop.h" + +static void gtk_im_context_thai_class_init (GtkIMContextThaiClass *class); +static void gtk_im_context_thai_init (GtkIMContextThai *im_context_thai); +static gboolean gtk_im_context_thai_filter_keypress (GtkIMContext *context, + GdkEventKey *key); + +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK +static void forget_previous_chars (GtkIMContextThai *context_thai); +static void remember_previous_char (GtkIMContextThai *context_thai, + gunichar new_char); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + +static GObjectClass *parent_class; + +GType gtk_type_im_context_thai = 0; + +void +gtk_im_context_thai_register_type (GTypeModule *type_module) +{ + static const GTypeInfo im_context_thai_info = + { + sizeof (GtkIMContextThaiClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) gtk_im_context_thai_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkIMContextThai), + 0, + (GInstanceInitFunc) gtk_im_context_thai_init, + }; + + gtk_type_im_context_thai = + g_type_module_register_type (type_module, + GTK_TYPE_IM_CONTEXT, + "GtkIMContextThai", + &im_context_thai_info, 0); +} + +static void +gtk_im_context_thai_class_init (GtkIMContextThaiClass *class) +{ + GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS (class); + + parent_class = g_type_class_peek_parent (class); + + im_context_class->filter_keypress = gtk_im_context_thai_filter_keypress; +} + +static void +gtk_im_context_thai_init (GtkIMContextThai *context_thai) +{ +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + forget_previous_chars (context_thai); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + context_thai->isc_mode = ISC_BASICCHECK; +} + +GtkIMContext * +gtk_im_context_thai_new (void) +{ + GtkIMContextThai *result; + + result = GTK_IM_CONTEXT_THAI (g_object_new (GTK_TYPE_IM_CONTEXT_THAI, NULL)); + + return GTK_IM_CONTEXT (result); +} + +GtkIMContextThaiISCMode +gtk_im_context_thai_get_isc_mode (GtkIMContextThai *context_thai) +{ + return context_thai->isc_mode; +} + +GtkIMContextThaiISCMode +gtk_im_context_thai_set_isc_mode (GtkIMContextThai *context_thai, + GtkIMContextThaiISCMode mode) +{ + GtkIMContextThaiISCMode prev_mode = context_thai->isc_mode; + context_thai->isc_mode = mode; + return prev_mode; +} + +static gboolean +is_context_lost_key(guint keyval) +{ + return ((keyval & 0xFF00) == 0xFF00) && + (keyval == GDK_BackSpace || + keyval == GDK_Tab || + keyval == GDK_Linefeed || + keyval == GDK_Clear || + keyval == GDK_Return || + keyval == GDK_Pause || + keyval == GDK_Scroll_Lock || + keyval == GDK_Sys_Req || + keyval == GDK_Escape || + keyval == GDK_Delete || + (GDK_Home <= keyval && keyval <= GDK_Begin) || /* IsCursorkey */ + (GDK_KP_Space <= keyval && keyval <= GDK_KP_Equal) || /* IsKeypadKey */ + (GDK_Select <= keyval && keyval <= GDK_Break) || /* IsMiscFunctionKey */ + (GDK_F1 <= keyval && keyval <= GDK_F35)); /* IsFunctionKey */ +} + +static gboolean +is_context_intact_key(guint keyval) +{ + return (((keyval & 0xFF00) == 0xFF00) && + ((GDK_Shift_L <= keyval && keyval <= GDK_Hyper_R) || /* IsModifierKey */ + (keyval == GDK_Mode_switch) || + (keyval == GDK_Num_Lock))) || + (((keyval & 0xFE00) == 0xFE00) && + (GDK_ISO_Lock <= keyval && keyval <= GDK_ISO_Last_Group_Lock)); +} + +static gboolean +thai_is_accept (gunichar new_char, gunichar prev_char, gint isc_mode) +{ + switch (isc_mode) + { + case ISC_PASSTHROUGH: + return TRUE; + + case ISC_BASICCHECK: + return TAC_compose_input (prev_char, new_char) != 'R'; + + case ISC_STRICT: + { + int op = TAC_compose_input (prev_char, new_char); + return op != 'R' && op != 'S'; + } + + default: + return FALSE; + } +} + +#define thai_is_composible(n,p) (TAC_compose_input ((p), (n)) == 'C') + +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK +static void +forget_previous_chars (GtkIMContextThai *context_thai) +{ + memset (context_thai->char_buff, 0, sizeof (context_thai->char_buff)); +} + +static void +remember_previous_char (GtkIMContextThai *context_thai, gunichar new_char) +{ + memmove (context_thai->char_buff + 1, context_thai->char_buff, + (GTK_IM_CONTEXT_THAI_BUFF_SIZE - 1) * sizeof (context_thai->char_buff[0])); + context_thai->char_buff[0] = new_char; +} +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + +static gunichar +get_previous_char (GtkIMContextThai *context_thai, gint offset) +{ + gchar *surrounding; + gint cursor_index; + + if (gtk_im_context_get_surrounding ((GtkIMContext *)context_thai, + &surrounding, &cursor_index)) + { + gunichar prev_char; + gchar *p, *q; + + prev_char = 0; + p = surrounding + cursor_index; + for (q = p; offset < 0 && q > surrounding; ++offset) + q = g_utf8_prev_char (q); + if (offset == 0) + { + prev_char = g_utf8_get_char_validated (q, p - q); + if (prev_char < 0) + prev_char = 0; + } + g_free (surrounding); + return prev_char; + } +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + else + { + offset = -offset - 1; + if (0 <= offset && offset < GTK_IM_CONTEXT_THAI_BUFF_SIZE) + return context_thai->char_buff[offset]; + } +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + + return 0; +} + +static gboolean +gtk_im_context_thai_commit_chars (GtkIMContextThai *context_thai, + gunichar *s, gsize len) +{ + gchar *utf8; + + utf8 = g_ucs4_to_utf8 (s, len, NULL, NULL, NULL); + if (!utf8) + return FALSE; + + g_signal_emit_by_name (context_thai, "commit", utf8); + + g_free (utf8); + return TRUE; +} + +static gboolean +accept_input (GtkIMContextThai *context_thai, gunichar new_char) +{ +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + remember_previous_char (context_thai, new_char); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + + return gtk_im_context_thai_commit_chars (context_thai, &new_char, 1); +} + +static gboolean +reorder_input (GtkIMContextThai *context_thai, + gunichar prev_char, gunichar new_char) +{ + gunichar buf[2]; + + if (!gtk_im_context_delete_surrounding (GTK_IM_CONTEXT (context_thai), -1, 1)) + return FALSE; + +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + forget_previous_chars (context_thai); + remember_previous_char (context_thai, new_char); + remember_previous_char (context_thai, prev_char); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + + buf[0] = new_char; + buf[1] = prev_char; + return gtk_im_context_thai_commit_chars (context_thai, buf, 2); +} + +static gboolean +replace_input (GtkIMContextThai *context_thai, gunichar new_char) +{ + if (!gtk_im_context_delete_surrounding (GTK_IM_CONTEXT (context_thai), -1, 1)) + return FALSE; + +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + forget_previous_chars (context_thai); + remember_previous_char (context_thai, new_char); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + + return gtk_im_context_thai_commit_chars (context_thai, &new_char, 1); +} + +static gboolean +gtk_im_context_thai_filter_keypress (GtkIMContext *context, + GdkEventKey *event) +{ + GtkIMContextThai *context_thai = GTK_IM_CONTEXT_THAI (context); + gunichar prev_char, new_char; + gboolean is_reject; + GtkIMContextThaiISCMode isc_mode; + + if (event->type != GDK_KEY_PRESS) + return FALSE; + + if (event->state & (GDK_MODIFIER_MASK & ~GDK_SHIFT_MASK) || + is_context_lost_key (event->keyval)) + { +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + forget_previous_chars (context_thai); +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + return FALSE; + } + if (event->keyval == 0 || is_context_intact_key (event->keyval)) + { + return FALSE; + } + + prev_char = get_previous_char (context_thai, -1); + if (!prev_char) + prev_char = ' '; + new_char = gdk_keyval_to_unicode (event->keyval); + is_reject = TRUE; + isc_mode = gtk_im_context_thai_get_isc_mode (context_thai); + if (thai_is_accept (new_char, prev_char, isc_mode)) + { + accept_input (context_thai, new_char); + is_reject = FALSE; + } + else + { + gunichar context_char; + + /* rejected, trying to correct */ + context_char = get_previous_char (context_thai, -2); + if (context_char) + { + if (thai_is_composible (new_char, context_char)) + { + if (thai_is_composible (prev_char, new_char)) + is_reject = !reorder_input (context_thai, prev_char, new_char); + else if (thai_is_composible (prev_char, context_char)) + is_reject = !replace_input (context_thai, new_char); + else if ((TAC_char_class (prev_char) == FV1 + || TAC_char_class (prev_char) == AM) + && TAC_char_class (new_char) == TONE) + is_reject = !reorder_input (context_thai, prev_char, new_char); + } + else if (thai_is_accept (new_char, context_char, isc_mode)) + is_reject = !replace_input (context_thai, new_char); + } + } + if (is_reject) + { + /* reject character */ + gdk_beep (); + } + return TRUE; +} + diff --git a/modules/input/gtkimcontextthai.h b/modules/input/gtkimcontextthai.h new file mode 100644 index 0000000000..8c4049739e --- /dev/null +++ b/modules/input/gtkimcontextthai.h @@ -0,0 +1,82 @@ +/* GTK - The GIMP Toolkit + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Theppitak Karoonboonyanan + * + */ + +#ifndef __GTK_IM_CONTEXT_THAI_H__ +#define __GTK_IM_CONTEXT_THAI_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern GType gtk_type_im_context_thai; + +#define GTK_TYPE_IM_CONTEXT_THAI gtk_type_im_context_thai +#define GTK_IM_CONTEXT_THAI(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_IM_CONTEXT_THAI, GtkIMContextThai)) +#define GTK_IM_CONTEXT_THAI_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_IM_CONTEXT_THAI, GtkIMContextThaiClass)) +#define GTK_IS_IM_CONTEXT_THAI(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_IM_CONTEXT_THAI)) +#define GTK_IS_IM_CONTEXT_THAI_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IM_CONTEXT_THAI)) +#define GTK_IM_CONTEXT_THAI_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_IM_CONTEXT_THAI, GtkIMContextThaiClass)) + + +typedef struct _GtkIMContextThai GtkIMContextThai; +typedef struct _GtkIMContextThaiClass GtkIMContextThaiClass; + +typedef enum +{ + ISC_PASSTHROUGH, + ISC_BASICCHECK, + ISC_STRICT +} GtkIMContextThaiISCMode; +#define GTK_IM_CONTEXT_THAI_BUFF_SIZE 2 + +struct _GtkIMContextThai +{ + GtkIMContext object; + +#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK + gunichar char_buff[GTK_IM_CONTEXT_THAI_BUFF_SIZE]; +#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */ + GtkIMContextThaiISCMode isc_mode; +}; + +struct _GtkIMContextThaiClass +{ + GtkIMContextClass parent_class; +}; + +void gtk_im_context_thai_register_type (GTypeModule *type_module); +GtkIMContext *gtk_im_context_thai_new (void); + +GtkIMContextThaiISCMode + gtk_im_context_thai_get_isc_mode (GtkIMContextThai *context_thai); + +GtkIMContextThaiISCMode + gtk_im_context_thai_set_isc_mode (GtkIMContextThai *context_thai, + GtkIMContextThaiISCMode mode); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GTK_IM_CONTEXT_THAI_H__ */ diff --git a/modules/input/imthai-broken.c b/modules/input/imthai-broken.c deleted file mode 100644 index 56c870f7e1..0000000000 --- a/modules/input/imthai-broken.c +++ /dev/null @@ -1,214 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 2000 Red Hat Software - * Copyright (C) 2000 SuSE Linux Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Original author: Owen Taylor - * - * Modified for Thai (Broken) - Robert Brady - * - */ - -#include -#include - -#include - -#include "gtk/gtkintl.h" -#include "gtk/gtkimcontextsimple.h" -#include "gtk/gtkimmodule.h" - -GType type_thai_broken = 0; - -static void thai_broken_class_init (GtkIMContextSimpleClass *class); -static void thai_broken_init (GtkIMContextSimple *im_context); - -static void -thai_broken_register_type (GTypeModule *module) -{ - static const GTypeInfo object_info = - { - sizeof (GtkIMContextSimpleClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) thai_broken_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkIMContextSimple), - 0, - (GInstanceInitFunc) thai_broken_init, - }; - - type_thai_broken = - g_type_module_register_type (module, - GTK_TYPE_IM_CONTEXT_SIMPLE, - "GtkIMContextThaiBroken", - &object_info, 0); -} - -static guint16 thai_broken_compose_seqs[] = { - 0xa0, 0, 0, 0, 0, 0x0e00, - 0xa1, 0, 0, 0, 0, 0x0e01, - 0xa2, 0, 0, 0, 0, 0x0e02, - 0xa3, 0, 0, 0, 0, 0x0e03, - 0xa4, 0, 0, 0, 0, 0x0e04, - 0xa5, 0, 0, 0, 0, 0x0e05, - 0xa6, 0, 0, 0, 0, 0x0e06, - 0xa7, 0, 0, 0, 0, 0x0e07, - 0xa8, 0, 0, 0, 0, 0x0e08, - 0xa9, 0, 0, 0, 0, 0x0e09, - 0xaa, 0, 0, 0, 0, 0x0e0a, - 0xab, 0, 0, 0, 0, 0x0e0b, - 0xac, 0, 0, 0, 0, 0x0e0c, - 0xad, 0, 0, 0, 0, 0x0e0d, - 0xae, 0, 0, 0, 0, 0x0e0e, - 0xaf, 0, 0, 0, 0, 0x0e0f, - 0xb0, 0, 0, 0, 0, 0x0e10, - 0xb1, 0, 0, 0, 0, 0x0e11, - 0xb2, 0, 0, 0, 0, 0x0e12, - 0xb3, 0, 0, 0, 0, 0x0e13, - 0xb4, 0, 0, 0, 0, 0x0e14, - 0xb5, 0, 0, 0, 0, 0x0e15, - 0xb6, 0, 0, 0, 0, 0x0e16, - 0xb7, 0, 0, 0, 0, 0x0e17, - 0xb8, 0, 0, 0, 0, 0x0e18, - 0xb9, 0, 0, 0, 0, 0x0e19, - 0xba, 0, 0, 0, 0, 0x0e1a, - 0xbb, 0, 0, 0, 0, 0x0e1b, - 0xbc, 0, 0, 0, 0, 0x0e1c, - 0xbd, 0, 0, 0, 0, 0x0e1d, - 0xbe, 0, 0, 0, 0, 0x0e1e, - 0xbf, 0, 0, 0, 0, 0x0e1f, - 0xc0, 0, 0, 0, 0, 0x0e20, - 0xc1, 0, 0, 0, 0, 0x0e21, - 0xc2, 0, 0, 0, 0, 0x0e22, - 0xc3, 0, 0, 0, 0, 0x0e23, - 0xc4, 0, 0, 0, 0, 0x0e24, - 0xc5, 0, 0, 0, 0, 0x0e25, - 0xc6, 0, 0, 0, 0, 0x0e26, - 0xc7, 0, 0, 0, 0, 0x0e27, - 0xc8, 0, 0, 0, 0, 0x0e28, - 0xc9, 0, 0, 0, 0, 0x0e29, - 0xca, 0, 0, 0, 0, 0x0e2a, - 0xcb, 0, 0, 0, 0, 0x0e2b, - 0xcc, 0, 0, 0, 0, 0x0e2c, - 0xcd, 0, 0, 0, 0, 0x0e2d, - 0xce, 0, 0, 0, 0, 0x0e2e, - 0xcf, 0, 0, 0, 0, 0x0e2f, - 0xd0, 0, 0, 0, 0, 0x0e30, - 0xd1, 0, 0, 0, 0, 0x0e31, - 0xd2, 0, 0, 0, 0, 0x0e32, - 0xd3, 0, 0, 0, 0, 0x0e33, - 0xd4, 0, 0, 0, 0, 0x0e34, - 0xd5, 0, 0, 0, 0, 0x0e35, - 0xd6, 0, 0, 0, 0, 0x0e36, - 0xd7, 0, 0, 0, 0, 0x0e37, - 0xd8, 0, 0, 0, 0, 0x0e38, - 0xd9, 0, 0, 0, 0, 0x0e39, - 0xda, 0, 0, 0, 0, 0x0e3a, - 0xdb, 0, 0, 0, 0, 0x0e3b, - 0xdc, 0, 0, 0, 0, 0x0e3c, - 0xdd, 0, 0, 0, 0, 0x0e3d, - 0xde, 0, 0, 0, 0, 0x0e3e, - 0xdf, 0, 0, 0, 0, 0x0e3f, - 0xe0, 0, 0, 0, 0, 0x0e40, - 0xe1, 0, 0, 0, 0, 0x0e41, - 0xe2, 0, 0, 0, 0, 0x0e42, - 0xe3, 0, 0, 0, 0, 0x0e43, - 0xe4, 0, 0, 0, 0, 0x0e44, - 0xe5, 0, 0, 0, 0, 0x0e45, - 0xe6, 0, 0, 0, 0, 0x0e46, - 0xe7, 0, 0, 0, 0, 0x0e47, - 0xe8, 0, 0, 0, 0, 0x0e48, - 0xe9, 0, 0, 0, 0, 0x0e49, - 0xea, 0, 0, 0, 0, 0x0e4a, - 0xeb, 0, 0, 0, 0, 0x0e4b, - 0xec, 0, 0, 0, 0, 0x0e4c, - 0xed, 0, 0, 0, 0, 0x0e4d, - 0xee, 0, 0, 0, 0, 0x0e4e, - 0xef, 0, 0, 0, 0, 0x0e4f, - 0xf0, 0, 0, 0, 0, 0x0e50, - 0xf1, 0, 0, 0, 0, 0x0e51, - 0xf2, 0, 0, 0, 0, 0x0e52, - 0xf3, 0, 0, 0, 0, 0x0e53, - 0xf4, 0, 0, 0, 0, 0x0e54, - 0xf5, 0, 0, 0, 0, 0x0e55, - 0xf6, 0, 0, 0, 0, 0x0e56, - 0xf7, 0, 0, 0, 0, 0x0e57, - 0xf8, 0, 0, 0, 0, 0x0e58, - 0xf9, 0, 0, 0, 0, 0x0e59, - 0xfa, 0, 0, 0, 0, 0x0e5a, - 0xfb, 0, 0, 0, 0, 0x0e5b, - 0xfc, 0, 0, 0, 0, 0x0e5c, - 0xfd, 0, 0, 0, 0, 0x0e5d, - 0xfe, 0, 0, 0, 0, 0x0e5e, - 0xff, 0, 0, 0, 0, 0x0e5f, -}; - -static void -thai_broken_class_init (GtkIMContextSimpleClass *class) -{ -} - -static void -thai_broken_init (GtkIMContextSimple *im_context) -{ - gtk_im_context_simple_add_table (im_context, - thai_broken_compose_seqs, - 4, - G_N_ELEMENTS (thai_broken_compose_seqs) / (4 + 2)); -} - -static const GtkIMContextInfo thai_broken_info = { - "thai_broken", /* ID */ - N_("Thai (Broken)"), /* Human readable name */ - GETTEXT_PACKAGE, /* Translation domain */ - GTK_LOCALEDIR, /* Dir for bindtextdomain (not strictly needed for "gtk+") */ - "" /* Languages for which this module is the default */ -}; - -static const GtkIMContextInfo *info_list[] = { - &thai_broken_info -}; - -void -im_module_init (GTypeModule *module) -{ - thai_broken_register_type (module); -} - -void -im_module_exit (void) -{ -} - -void -im_module_list (const GtkIMContextInfo ***contexts, - int *n_contexts) -{ - *contexts = info_list; - *n_contexts = G_N_ELEMENTS (info_list); -} - -GtkIMContext * -im_module_create (const gchar *context_id) -{ - if (strcmp (context_id, "thai_broken") == 0) - return g_object_new (type_thai_broken, NULL); - else - return NULL; -} diff --git a/modules/input/imthai.c b/modules/input/imthai.c new file mode 100644 index 0000000000..45bceb7063 --- /dev/null +++ b/modules/input/imthai.c @@ -0,0 +1,71 @@ +/* GTK - The GIMP Toolkit + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Theppitak Karoonboonyanan + * + */ + +#include +#include + +#include + +#include "gtk/gtkintl.h" +#include "gtk/gtkimmodule.h" +#include "gtkimcontextthai.h" + +GType type_thai = 0; + +static const GtkIMContextInfo thai_info = { + "thai", /* ID */ + N_("Thai-Lao"), /* Human readable name */ + "gtk+", /* Translation domain */ + GTK_LOCALEDIR, /* Dir for bindtextdomain (not strictly needed for "gtk+") */ + "lo:th" /* Languages for which this module is the default */ +}; + +static const GtkIMContextInfo *info_list[] = { + &thai_info +}; + +void +im_module_init (GTypeModule *module) +{ + gtk_im_context_thai_register_type (module); +} + +void +im_module_exit (void) +{ +} + +void +im_module_list (const GtkIMContextInfo ***contexts, + int *n_contexts) +{ + *contexts = info_list; + *n_contexts = G_N_ELEMENTS (info_list); +} + +GtkIMContext * +im_module_create (const gchar *context_id) +{ + if (strcmp (context_id, "thai") == 0) + return gtk_im_context_thai_new (); + else + return NULL; +} diff --git a/modules/input/thai-charprop.c b/modules/input/thai-charprop.c new file mode 100644 index 0000000000..a9f7a05673 --- /dev/null +++ b/modules/input/thai-charprop.c @@ -0,0 +1,138 @@ +#include "thai-charprop.h" + +const gshort thai_char_type[256] = { + /* 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, A, B, C, D, E, F */ + + /* CL1 */ + /*00*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + /*10*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + + /* Lao zone: [U+0E80..U+0EDF] */ + /*20*/ _ND, _NC, _NC, _ND, _NC, _ND, _ND, _NC, + _NC, _ND, _NC, _ND, _ND, _NC, _ND, _ND, + /*30*/ _ND, _ND, _ND, _ND, _NC, _NC, _NC, _NC, + _ND, _NC, _NC, _UC, _NC, _UC, _NC, _UC, + /*40*/ _ND, _NC, _UC, _NC, _ND, _NC, _ND, _NC, + _ND, _ND, _NC, _NC, _ND, _NC, _NC, _ND, + /*50*/ _ND, _AV, _ND, _AM, _AV, _AV, _AV, _AV, + _BV, _BV, _ND, _AV, _BD, _NC, _ND, _ND, + /*60*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _AD, + _TN, _TN, _TN, _TN, _AD, _AD, _ND, _ND, + /*70*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _NC, _NC, _ND, _ND, + + /* CL2 */ + /*80*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + /*90*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + + /* Thai zone: [U+0E00..U+0E5F] */ + /*A0*/ _ND, _NC, _NC, _NC, _NC, _NC, _NC, _NC, + _NC, _NC, _NC, _NC, _NC, _SC, _BC, _BC, + /*B0*/ _SC, _NC, _NC, _NC, _NC, _NC, _NC, _NC, + _NC, _NC, _NC, _UC, _NC, _UC, _NC, _UC, + /*C0*/ _NC, _NC, _NC, _NC, _ND, _NC, _ND, _NC, + _NC, _NC, _NC, _NC, _UC, _NC, _NC, _ND, + /*D0*/ _ND, _AV, _ND, _AM, _AV, _AV, _AV, _AV, + _BV, _BV, _BD, _ND, _ND, _ND, _ND, _ND, + /*E0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _AD, + _TN, _TN, _TN, _TN, _AD, _AD, _AD, _ND, + /*F0*/ _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, + _ND, _ND, _ND, _ND, _ND, _ND, _ND, _ND, +}; + +const gshort thai_TAC_char_class[256] = { + /* 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, A, B, C, D, E, F */ + + /* CL1 */ + /*00*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + /*10*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + + /* Lao zone: [U+0E80..U+0EDF] */ + /*20*/ NON,CONS,CONS, NON,CONS, NON, NON,CONS, + CONS, NON,CONS, NON, NON,CONS, NON, NON, + /*30*/ NON, NON, NON, NON,CONS,CONS,CONS,CONS, + NON,CONS,CONS,CONS,CONS,CONS,CONS,CONS, + /*40*/ NON,CONS,CONS,CONS, NON,CONS, NON,CONS, + NON, NON,CONS,CONS, NON,CONS,CONS, NON, + /*50*/ FV1, AV2, FV1, AM, AV1, AV3, AV2, AV3, + BV1, BV2, NON, AV2,BCON, FV3, NON, NON, + /*60*/ LV, LV, LV, LV, LV, NON, NON, NON, + TONE,TONE,TONE,TONE, AD1, AD4, NON, NON, + /*70*/ NON, NON, NON, NON, NON, NON, NON, NON, + NON, NON, NON, NON,CONS,CONS, NON,CTRL, + + /* CL2 */ + /*80*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + /*90*/ CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL,CTRL, + + /* Thai zone: [U+0E00..U+0E5F] */ + /*A0*/ NON,CONS,CONS,CONS,CONS,CONS,CONS,CONS, + CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS, + /*B0*/ CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS, + CONS,CONS,CONS,CONS,CONS,CONS,CONS,CONS, + /*C0*/ CONS,CONS,CONS,CONS, FV3,CONS, FV3,CONS, + CONS,CONS,CONS,CONS,CONS,CONS,CONS, NON, + /*D0*/ FV1, AV2, FV1, AM, AV1, AV3, AV2, AV3, + BV1, BV2, BD, NON, NON, NON, NON, NON, + /*E0*/ LV, LV, LV, LV, LV, FV2, NON, AD2, + TONE,TONE,TONE,TONE, AD1, AD4, AD3, NON, + /*F0*/ NON, NON, NON, NON, NON, NON, NON, NON, + NON, NON, NON, NON, NON, NON, NON,CTRL, +}; + +const gchar thai_TAC_compose_input[20][20] = { + /* row: Cn-1, column: Cn */ + /*CTRL NON CONS LV FV1 FV2 FV3 AM BV1 BV2 + * BD TONE AD1 AD2 AD3 AD4 AV1 AV2 AV3 BCON*/ +/*CTRL*/{'X','A','A','A','A','A','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*NON */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*CONS*/{'X','A','A','A','A','S','A','C','C','C', + 'C','C','C','C','C','C','C','C','C','C'}, +/*LV */{'X','S','A','S','S','S','S','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*FV1 */{'X','A','A','A','A','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*FV2 */{'X','A','A','A','A','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*FV3 */{'X','A','A','A','S','A','S','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*AM */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*BV1 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','C','R','R','C','R','R','R','R'}, +/*BV2 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','R','R','R','R','R','R','R','R'}, +/*BD */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*TONE*/{'X','A','A','A','A','A','A','C','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*AD1 */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*AD2 */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*AD3 */{'X','A','A','A','S','S','A','R','R','R', + 'R','R','R','R','R','R','R','R','R','R'}, +/*AD4 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','R','R','R','R','R','R','R','R'}, +/*AV1 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','C','R','R','C','R','R','R','R'}, +/*AV2 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','R','R','R','R','R','R','R','R'}, +/*AV3 */{'X','A','A','A','S','S','A','R','R','R', + 'R','C','R','C','R','R','R','R','R','R'}, +/*BCON*/{'X','A','A','A','A','S','A','C','C','C', + 'R','C','R','R','R','C','C','C','C','R'}, +}; + diff --git a/modules/input/thai-charprop.h b/modules/input/thai-charprop.h new file mode 100644 index 0000000000..38aec4c2c7 --- /dev/null +++ b/modules/input/thai-charprop.h @@ -0,0 +1,98 @@ +/* Pango + * thai-charprop.h: + * + * Copyright (C) 1999 Red Hat Software + * Author: Owen Taylor + * + * Software and Language Engineering Laboratory, NECTEC + * Author: Theppitak Karoonboonyanan + * + * Copyright (c) 1996-2000 by Sun Microsystems, Inc. + * Author: Chookij Vanatham + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __THAI_CHARPROP_H__ +#define __THAI_CHARPROP_H__ + +#include + +#define isthai(wc) (0x0E00 <= (wc) && (wc) < 0x0E60) +#define islao(wc) (0x0E80 <= (wc) && (wc) < 0x0EE0) +/* ucs2tis() + * Lao: [0x0E80..0x0EDF] -> [0x20..0x7F] + * Thai: [0x0E00..0x0E5F] -> [0xA0..0xFF] + */ +#define ucs2tis(wc) (((wc) - 0x0E00 + 0x20)^0x80) + +/* Define TACTIS character classes */ +#define CTRL 0 +#define NON 1 +#define CONS 2 +#define LV 3 +#define FV1 4 +#define FV2 5 +#define FV3 6 +#define AM 7 +#define BV1 8 +#define BV2 9 +#define BD 10 +#define TONE 11 +#define AD1 12 +#define AD2 13 +#define AD3 14 +#define AD4 15 +#define AV1 16 +#define AV2 17 +#define AV3 18 +#define BCON 19 + +#define _ND 0 +#define _NC 1 +#define _UC (1<<1) +#define _BC (1<<2) +#define _SC (1<<3) +#define _AV (1<<4) +#define _BV (1<<5) +#define _TN (1<<6) +#define _AD (1<<7) +#define _BD (1<<8) +#define _AM (1<<9) + +#define NoTailCons _NC +#define UpTailCons _UC +#define BotTailCons _BC +#define SpltTailCons _SC +#define Cons (NoTailCons|UpTailCons|BotTailCons|SpltTailCons) +#define AboveVowel _AV +#define BelowVowel _BV +#define Tone _TN +#define AboveDiac _AD +#define BelowDiac _BD +#define SaraAm _AM + +#define is_char_type(wc, mask) (thai_char_type[ucs2tis ((wc))] & (mask)) +#define TAC_char_class(wc) \ + (isthai(wc)||islao(wc) ? thai_TAC_char_class[ucs2tis (wc)] : NON) +#define TAC_compose_input(wc1,wc2) \ + thai_TAC_compose_input[TAC_char_class(wc1)][TAC_char_class(wc2)] + +extern const gshort thai_char_type[256]; +extern const gshort thai_TAC_char_class[256]; +extern const gchar thai_TAC_compose_input[20][20]; + +#endif /* __THAI_CHARPROP_H__ */