GHashTableIter iter;
gunichar *sequence;
char *value;
+ GString *output;
+
+ output = g_string_new ("");
g_hash_table_iter_init (&iter, parser->sequences);
while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value))
static guint16 keysyms[MAX_COMPOSE_LEN + 1];
int i;
int n_compose = 0;
- gunichar output_char;
- char buf[8] = { 0, };
gboolean remove_sequence = FALSE;
if (value[0] == '\0')
n_compose++;
}
- if (gtk_check_algorithmically (keysyms, n_compose, &output_char))
+ if (gtk_check_algorithmically (keysyms, n_compose, output))
{
- g_unichar_to_utf8 (output_char, buf);
- if (strcmp (value, buf) == 0)
+ if (strcmp (value, output->str) == 0)
remove_sequence = TRUE;
}
if (remove_sequence)
g_hash_table_iter_remove (&iter);
}
+
+ g_string_free (output, TRUE);
}
static void
gboolean
gtk_check_algorithmically (const guint16 *compose_buffer,
int n_compose,
- gunichar *output_char)
+ GString *output)
{
int i;
combination_buffer = alloca (sizeof (gunichar) * (n_compose + 1));
- if (output_char)
- *output_char = 0;
+ g_string_set_size (output, 0);
for (i = 0; i < n_compose && IS_DEAD_KEY (compose_buffer[i]); i++)
;
combination_utf8 = g_ucs4_to_utf8 (combination_buffer, -1, NULL, NULL, NULL);
nfc = g_utf8_normalize (combination_utf8, -1, G_NORMALIZE_NFC);
- if (output_char)
- *output_char = g_utf8_get_char (nfc);
+ g_string_assign (output, nfc);
g_free (combination_utf8);
g_free (nfc);
int i;
gboolean compose_finish;
gboolean compose_match;
- gunichar output_char;
guint keyval, state;
while (priv->compose_buffer[n_compose] != 0 && n_compose < priv->compose_buffer_len)
G_UNLOCK (global_tables);
- g_string_free (output, TRUE);
-
if (success)
- return TRUE;
+ {
+ g_string_free (output, TRUE);
+ return TRUE;
+ }
- if (gtk_check_algorithmically (priv->compose_buffer, n_compose, &output_char))
+ if (gtk_check_algorithmically (priv->compose_buffer, n_compose, output))
{
if (!priv->in_compose_sequence)
{
g_signal_emit_by_name (context_simple, "preedit-start");
}
- if (output_char)
- gtk_im_context_simple_commit_char (context_simple, output_char);
+ if (output->len > 0)
+ gtk_im_context_simple_commit_string (context_simple, output->str);
else
g_signal_emit_by_name (context_simple, "preedit-changed");
+ g_string_free (output, TRUE);
+
return TRUE;
}
+ g_string_free (output, TRUE);
+
/* If we get here, no Compose sequence matched.
* Only beep if we were in a sequence before.
*/
{
guint16 buffer[8] = { 0, };
gboolean ret;
- gunichar ch;
+ GString *output;
+
+ output = g_string_new ("");
buffer[0] = GDK_KEY_a;
buffer[1] = GDK_KEY_b;
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_false (ret);
- g_assert_true (ch == 0);
+ g_assert_cmpstr (output->str, ==, "");
buffer[0] = GDK_KEY_dead_abovering;
buffer[1] = GDK_KEY_A;
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_true (ret);
- g_assert_true (ch == 0xc5);
+ g_assert_cmpstr (output->str, ==, "Å");
buffer[0] = GDK_KEY_A;
buffer[1] = GDK_KEY_dead_abovering;
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_false (ret);
- g_assert_true (ch == 0);
+ g_assert_cmpstr (output->str, ==, "");
buffer[0] = GDK_KEY_dead_dasia;
buffer[1] = GDK_KEY_dead_perispomeni;
buffer[2] = GDK_KEY_Greek_alpha;
- ret = gtk_check_algorithmically (buffer, 3, &ch);
+ ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_true (ret);
- g_assert_true (ch == 0x1f07);
+ g_assert_cmpstr (output->str, ==, "ἇ");
buffer[0] = GDK_KEY_dead_perispomeni;
buffer[1] = GDK_KEY_dead_dasia;
buffer[2] = GDK_KEY_Greek_alpha;
- ret = gtk_check_algorithmically (buffer, 3, &ch);
+ ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_true (ret);
- g_assert_true (ch == 0x1f07);
+ g_assert_cmpstr (output->str, ==, "ἇ");
buffer[0] = GDK_KEY_dead_acute;
buffer[1] = GDK_KEY_dead_cedilla;
buffer[2] = GDK_KEY_c;
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_true (ret);
- g_assert_cmphex (ch, ==, 0);
+ g_assert_cmpstr (output->str, ==, "");
- ret = gtk_check_algorithmically (buffer, 3, &ch);
+ ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_true (ret);
- g_assert_cmphex (ch, ==, 0x1e09);
+ g_assert_cmpstr (output->str, ==, "ḉ");
buffer[0] = GDK_KEY_dead_cedilla;
buffer[1] = GDK_KEY_dead_acute;
buffer[2] = GDK_KEY_c;
- ret = gtk_check_algorithmically (buffer, 3, &ch);
+ ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_true (ret);
- g_assert_cmphex (ch, ==, 0x1e09);
+ g_assert_cmpstr (output->str, ==, "ḉ");
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_true (ret);
buffer[0] = GDK_KEY_dead_acute;
buffer[1] = GDK_KEY_dead_cedilla;
buffer[2] = GDK_KEY_dead_grave;
- ret = gtk_check_algorithmically (buffer, 3, &ch);
+ ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_false (ret);
buffer[0] = GDK_KEY_dead_diaeresis;
buffer[1] = GDK_KEY_a;
- ret = gtk_check_algorithmically (buffer, 2, &ch);
+ ret = gtk_check_algorithmically (buffer, 2, output);
g_assert_true (ret);
- g_assert_cmphex (ch, ==, 0xe4);
+ g_assert_cmpstr (output->str, ==, "ä");
+
+ g_string_free (output, TRUE);
}
int