summaryrefslogtreecommitdiff
path: root/modules/input/gtkimcontextthai.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/input/gtkimcontextthai.c')
-rw-r--r--modules/input/gtkimcontextthai.c347
1 files changed, 0 insertions, 347 deletions
diff --git a/modules/input/gtkimcontextthai.c b/modules/input/gtkimcontextthai.c
deleted file mode 100644
index 3c8aa752df..0000000000
--- a/modules/input/gtkimcontextthai.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/* 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, see <http://www.gnu.org/licenses/>.
- *
- * Author: Theppitak Karoonboonyanan <thep@linux.thai.net>
- *
- */
-
-#include <string.h>
-
-#include <gdk/gdkkeysyms.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)
-{
- 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_KEY_BackSpace ||
- keyval == GDK_KEY_Tab ||
- keyval == GDK_KEY_Linefeed ||
- keyval == GDK_KEY_Clear ||
- keyval == GDK_KEY_Return ||
- keyval == GDK_KEY_Pause ||
- keyval == GDK_KEY_Scroll_Lock ||
- keyval == GDK_KEY_Sys_Req ||
- keyval == GDK_KEY_Escape ||
- keyval == GDK_KEY_Delete ||
- (GDK_KEY_Home <= keyval && keyval <= GDK_KEY_Begin) || /* IsCursorkey */
- (GDK_KEY_KP_Space <= keyval && keyval <= GDK_KEY_KP_Delete) || /* IsKeypadKey, non-chars only */
- (GDK_KEY_Select <= keyval && keyval <= GDK_KEY_Break) || /* IsMiscFunctionKey */
- (GDK_KEY_F1 <= keyval && keyval <= GDK_KEY_F35)); /* IsFunctionKey */
-}
-
-static gboolean
-is_context_intact_key(guint keyval)
-{
- return (((keyval & 0xFF00) == 0xFF00) &&
- ((GDK_KEY_Shift_L <= keyval && keyval <= GDK_KEY_Hyper_R) || /* IsModifierKey */
- (keyval == GDK_KEY_Mode_switch) ||
- (keyval == GDK_KEY_Num_Lock))) ||
- (((keyval & 0xFE00) == 0xFE00) &&
- (GDK_KEY_ISO_Lock <= keyval && keyval <= GDK_KEY_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 == (gunichar)-1 || prev_char == (gunichar)-2)
- 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;
- GdkModifierType state;
- guint keyval;
-
- if (gdk_event_get_event_type ((GdkEvent *) event) != GDK_KEY_PRESS ||
- !gdk_event_get_state ((GdkEvent *) event, &state) ||
- !gdk_event_get_keyval ((GdkEvent *) event, &keyval))
- return FALSE;
-
- if (state & (GDK_MODIFIER_MASK
- & ~(GDK_SHIFT_MASK | GDK_LOCK_MASK | GDK_MOD2_MASK)) ||
- is_context_lost_key (keyval))
- {
-#ifndef GTK_IM_CONTEXT_THAI_NO_FALLBACK
- forget_previous_chars (context_thai);
-#endif /* !GTK_IM_CONTEXT_THAI_NO_FALLBACK */
- return FALSE;
- }
- if (keyval == 0 || is_context_intact_key (keyval))
- {
- return FALSE;
- }
-
- prev_char = get_previous_char (context_thai, -1);
- if (!prev_char)
- prev_char = ' ';
- new_char = gdk_keyval_to_unicode (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_display_beep (gdk_event_get_display ((GdkEvent*)event));
- }
- return TRUE;
-}
-