Remove the broken Thai input method and add a functional Thai and Lao

2006-11-28  Behdad Esfahbod  <behdad@gnome.org>

        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.
This commit is contained in:
Behdad Esfahbod 2006-11-29 01:14:04 +00:00 committed by Behdad Esfahbod
parent 6282e799d8
commit cbfd2b96b8
8 changed files with 761 additions and 218 deletions

View File

@ -1,3 +1,21 @@
2006-11-28 Behdad Esfahbod <behdad@gnome.org>
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 <chpe@cvs.gnome.org>
* gtk/gtkstatusicon.c: Notify when the screen changes. Bug #379793.

View File

@ -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 \

View File

@ -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 <thep@linux.thai.net>
*
*/
#include <string.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdkkeys.h>
#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;
}

View File

@ -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 <thep@linux.thai.net>
*
*/
#ifndef __GTK_IM_CONTEXT_THAI_H__
#define __GTK_IM_CONTEXT_THAI_H__
#include <gtk/gtkimcontext.h>
#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__ */

View File

@ -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 <otaylor@redhat.com>
*
* Modified for Thai (Broken) - Robert Brady <robert@suse.co.uk>
*
*/
#include <config.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
#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;
}

71
modules/input/imthai.c Normal file
View File

@ -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 <thep@linux.thai.net>
*
*/
#include <config.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
#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;
}

View File

@ -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'},
};

View File

@ -0,0 +1,98 @@
/* Pango
* thai-charprop.h:
*
* Copyright (C) 1999 Red Hat Software
* Author: Owen Taylor <otaylor@redhat.com>
*
* Software and Language Engineering Laboratory, NECTEC
* Author: Theppitak Karoonboonyanan <thep@links.nectec.or.th>
*
* Copyright (c) 1996-2000 by Sun Microsystems, Inc.
* Author: Chookij Vanatham <Chookij.Vanatham@Eng.Sun.COM>
*
* 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 <glib.h>
#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__ */