summaryrefslogtreecommitdiff
path: root/gtk/gtkimcontextsimple.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2006-03-14 16:42:59 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2006-03-14 16:42:59 +0000
commit98569f6e65b0f6501737b124af952e898546e9b2 (patch)
tree95508c262cbf2cad165a3dab5ea25616633bc4a1 /gtk/gtkimcontextsimple.c
parent25696b3575bccfc397c2354f0a9032d6c9a809d4 (diff)
downloadgtk+-98569f6e65b0f6501737b124af952e898546e9b2.tar.gz
Make return and release work again to commit a hex sequence. Additionally,
2006-03-14 Matthias Clasen <mclasen@redhat.com> * gtk/gtkimcontextsimple.c: Make return and release work again to commit a hex sequence. Additionally, make escape reset the im context when in a hex sequence. (#334423, Behdad Esfahbod)
Diffstat (limited to 'gtk/gtkimcontextsimple.c')
-rw-r--r--gtk/gtkimcontextsimple.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
index 2d07ac2176..08f74b4bb7 100644
--- a/gtk/gtkimcontextsimple.c
+++ b/gtk/gtkimcontextsimple.c
@@ -1034,11 +1034,11 @@ gtk_im_context_simple_commit_char (GtkIMContext *context,
if (context_simple->tentative_match || context_simple->in_hex_sequence)
{
+ context_simple->in_hex_sequence = FALSE;
context_simple->tentative_match = 0;
context_simple->tentative_match_len = 0;
g_signal_emit_by_name (context_simple, "preedit_changed");
}
- context_simple->in_hex_sequence = FALSE;
g_signal_emit_by_name (context, "commit", &buf);
}
@@ -1320,8 +1320,9 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
int n_compose = 0;
gboolean have_hex_mods;
gboolean is_hex_start;
- gboolean is_space;
+ gboolean is_hex_end;
gboolean is_backspace;
+ gboolean is_escape;
guint hex_keyval;
int i;
@@ -1373,8 +1374,13 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
else
have_hex_mods = (event->state & (HEX_MOD_MASK)) == HEX_MOD_MASK;
is_hex_start = event->keyval == GDK_U;
- is_space = event->keyval == GDK_space || event->keyval == GDK_KP_Space;
+ is_hex_end = (event->keyval == GDK_space ||
+ event->keyval == GDK_KP_Space ||
+ event->keyval == GDK_Return ||
+ event->keyval == GDK_ISO_Enter ||
+ event->keyval == GDK_KP_Enter);
is_backspace = event->keyval == GDK_BackSpace;
+ is_escape = event->keyval == GDK_Escape;
hex_keyval = canonical_hex_keyval (event);
/* If we are already in a non-hex sequence, or
@@ -1385,14 +1391,16 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
(n_compose > 0 && !context_simple->in_hex_sequence) ||
(n_compose == 0 && !context_simple->in_hex_sequence && !is_hex_start) ||
(context_simple->in_hex_sequence && !hex_keyval &&
- !is_hex_start && !is_space && !is_backspace))
+ !is_hex_start && !is_hex_end && !is_escape && !is_backspace))
{
if (event->state & (gtk_accelerator_get_default_mod_mask () & ~GDK_SHIFT_MASK) ||
(context_simple->in_hex_sequence && context_simple->modifiers_dropped &&
(event->keyval == GDK_Return ||
event->keyval == GDK_ISO_Enter ||
event->keyval == GDK_KP_Enter)))
- return FALSE;
+ {
+ return FALSE;
+ }
}
/* Handle backspace */
@@ -1414,6 +1422,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
return TRUE;
}
+ /* Check for hex sequence restart */
if (context_simple->in_hex_sequence && have_hex_mods && is_hex_start)
{
if (context_simple->tentative_match &&
@@ -1433,7 +1442,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
context_simple->compose_buffer[0] = 0;
}
}
-
+
/* Check for hex sequence start */
if (!context_simple->in_hex_sequence && have_hex_mods && is_hex_start)
{
@@ -1452,7 +1461,13 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
{
if (hex_keyval)
context_simple->compose_buffer[n_compose++] = hex_keyval;
- else if (!is_space)
+ else if (is_escape)
+ {
+ gtk_im_context_simple_reset (context);
+
+ return TRUE;
+ }
+ else if (!is_hex_end)
{
/* non-hex character in hex sequence */
gdk_display_beep (gdk_drawable_get_display (event->window));
@@ -1470,8 +1485,8 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
/* If the modifiers are still held down, consider the sequence again */
if (have_hex_mods)
{
- /* space ends the sequence, and we eat the space */
- if (n_compose > 0 && is_space)
+ /* space or return ends the sequence, and we eat the key */
+ if (n_compose > 0 && is_hex_end)
{
if (context_simple->tentative_match &&
g_unichar_validate (context_simple->tentative_match))
@@ -1524,11 +1539,11 @@ gtk_im_context_simple_reset (GtkIMContext *context)
if (context_simple->tentative_match || context_simple->in_hex_sequence)
{
+ context_simple->in_hex_sequence = FALSE;
context_simple->tentative_match = 0;
context_simple->tentative_match_len = 0;
g_signal_emit_by_name (context_simple, "preedit_changed");
}
- context_simple->in_hex_sequence = FALSE;
}
static void