summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-07-07 09:46:26 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-07-13 22:02:33 -0400
commitd25557a5ef346e3b1a4dead8f71f19706f151335 (patch)
tree3844a860548c70b1b27fecdcdc80f7504e26b972
parentda3ca6604bb4b25bd0812f9625b73f1a7af1a9d4 (diff)
downloadgtk+-d25557a5ef346e3b1a4dead8f71f19706f151335.tar.gz
Clean up the GtkComposeTable api
Keep the list of composetables private to GtkIMContextSimple, and just have an api that creates new GtkComposeTables, either from a file or from data. Update tests to use the new api.
-rw-r--r--gtk/gtkcomposetable.c88
-rw-r--r--gtk/gtkcomposetable.h8
-rw-r--r--gtk/gtkimcontextsimple.c86
-rw-r--r--testsuite/gtk/composetable.c18
4 files changed, 106 insertions, 94 deletions
diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c
index 7aa9792e3b..3e8b663860 100644
--- a/gtk/gtkcomposetable.c
+++ b/gtk/gtkcomposetable.c
@@ -458,7 +458,7 @@ gtk_compose_data_compare (gpointer a,
/* Implemented from g_str_hash() */
static guint32
-gtk_compose_table_data_hash (gconstpointer v, int length)
+data_hash (gconstpointer v, int length)
{
const guint16 *p, *head;
unsigned char c;
@@ -475,6 +475,24 @@ gtk_compose_table_data_hash (gconstpointer v, int length)
return h;
}
+guint32
+gtk_compose_table_data_hash (const guint16 *data,
+ int max_seq_len,
+ int n_seqs)
+{
+ gsize n_index_stride;
+ gsize length;
+
+ n_index_stride = max_seq_len + 2;
+ if (!g_size_checked_mul (&length, n_index_stride, n_seqs))
+ {
+ g_critical ("Overflow in the compose sequences");
+ return 0;
+ }
+
+ return data_hash (data, length);
+}
+
static char *
gtk_compose_hash_get_cache_path (guint32 hash)
{
@@ -551,15 +569,6 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table,
return contents;
}
-static int
-gtk_compose_table_find (gconstpointer data1,
- gconstpointer data2)
-{
- const GtkComposeTable *compose_table = (const GtkComposeTable *) data1;
- guint32 hash = (guint32) GPOINTER_TO_INT (data2);
- return compose_table->id != hash;
-}
-
static GtkComposeTable *
gtk_compose_table_load_cache (const char *compose_file)
{
@@ -782,6 +791,10 @@ gtk_compose_table_new_with_file (const char *compose_file)
g_assert (compose_file != NULL);
+ compose_table = gtk_compose_table_load_cache (compose_file);
+ if (compose_table != NULL)
+ return compose_table;
+
compose_list = gtk_compose_list_parse_file (compose_file);
if (compose_list == NULL)
return NULL;
@@ -803,39 +816,36 @@ gtk_compose_table_new_with_file (const char *compose_file)
max_compose_len,
n_index_stride,
g_str_hash (compose_file));
+
g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free);
+
+ gtk_compose_table_save_cache (compose_table);
+
return compose_table;
}
-GSList *
-gtk_compose_table_list_add_array (GSList *compose_tables,
- const guint16 *data,
- int max_seq_len,
- int n_seqs)
+GtkComposeTable *
+gtk_compose_table_new_with_data (const guint16 *data,
+ int max_seq_len,
+ int n_seqs)
{
- guint32 hash;
GtkComposeTable *compose_table;
gsize n_index_stride;
gsize length;
int i;
guint16 *gtk_compose_seqs = NULL;
- g_return_val_if_fail (data != NULL, compose_tables);
- g_return_val_if_fail (max_seq_len >= 0, compose_tables);
- g_return_val_if_fail (n_seqs >= 0, compose_tables);
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (max_seq_len >= 0, NULL);
+ g_return_val_if_fail (n_seqs >= 0, NULL);
n_index_stride = max_seq_len + 2;
if (!g_size_checked_mul (&length, n_index_stride, n_seqs))
{
g_critical ("Overflow in the compose sequences");
- return compose_tables;
+ return NULL;
}
- hash = gtk_compose_table_data_hash (data, length);
-
- if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
- return compose_tables;
-
gtk_compose_seqs = g_new0 (guint16, length);
for (i = 0; i < length; i++)
gtk_compose_seqs[i] = data[i];
@@ -844,35 +854,11 @@ gtk_compose_table_list_add_array (GSList *compose_tables,
compose_table->data = gtk_compose_seqs;
compose_table->max_seq_len = max_seq_len;
compose_table->n_seqs = n_seqs;
- compose_table->id = hash;
+ compose_table->id = data_hash (data, length);
compose_table->char_data = NULL;
compose_table->n_chars = 0;
- return g_slist_prepend (compose_tables, compose_table);
-}
-
-GSList *
-gtk_compose_table_list_add_file (GSList *compose_tables,
- const char *compose_file)
-{
- guint32 hash;
- GtkComposeTable *compose_table;
-
- g_return_val_if_fail (compose_file != NULL, compose_tables);
-
- hash = g_str_hash (compose_file);
- if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL)
- return compose_tables;
-
- compose_table = gtk_compose_table_load_cache (compose_file);
- if (compose_table != NULL)
- return g_slist_prepend (compose_tables, compose_table);
-
- if ((compose_table = gtk_compose_table_new_with_file (compose_file)) == NULL)
- return compose_tables;
-
- gtk_compose_table_save_cache (compose_table);
- return g_slist_prepend (compose_tables, compose_table);
+ return compose_table;
}
static int
diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h
index 101aa94359..1f28f83e73 100644
--- a/gtk/gtkcomposetable.h
+++ b/gtk/gtkcomposetable.h
@@ -45,12 +45,9 @@ struct _GtkComposeTableCompact
};
GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file);
-GSList * gtk_compose_table_list_add_array (GSList *compose_tables,
- const guint16 *data,
+GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data,
int max_seq_len,
int n_seqs);
-GSList * gtk_compose_table_list_add_file (GSList *compose_tables,
- const char *compose_file);
gboolean gtk_compose_table_check (const GtkComposeTable *table,
const guint16 *compose_buffer,
@@ -70,6 +67,9 @@ gboolean gtk_check_algorithmically (const guint16
int n_compose,
gunichar *output);
+guint32 gtk_compose_table_data_hash (const guint16 *data,
+ int max_seq_len,
+ int n_seqs);
G_END_DECLS
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
index 2ff3fe03b9..4e160ab048 100644
--- a/gtk/gtkimcontextsimple.c
+++ b/gtk/gtkimcontextsimple.c
@@ -163,6 +163,59 @@ get_x11_compose_file_dir (void)
return compose_file_dir;
}
+static int
+gtk_compose_table_find (gconstpointer data1,
+ gconstpointer data2)
+{
+ const GtkComposeTable *compose_table = (const GtkComposeTable *) data1;
+ guint32 hash = (guint32) GPOINTER_TO_INT (data2);
+ return compose_table->id != hash;
+}
+
+static void
+add_compose_table_from_file (const char *compose_file)
+{
+ guint hash;
+
+ G_LOCK (global_tables);
+
+ hash = g_str_hash (compose_file);
+ if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find))
+ {
+ GtkComposeTable *table;
+
+ table = gtk_compose_table_new_with_file (compose_file);
+
+ if (table)
+ global_tables = g_slist_prepend (global_tables, table);
+ }
+
+ G_UNLOCK (global_tables);
+}
+
+static void
+add_compose_table_from_data (const guint16 *data,
+ int max_seq_len,
+ int n_seqs)
+{
+ guint hash;
+
+ G_LOCK (global_tables);
+
+ hash = gtk_compose_table_data_hash (data, max_seq_len, n_seqs);
+ if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find))
+ {
+ GtkComposeTable *table;
+
+ table = gtk_compose_table_new_with_data (data, max_seq_len, n_seqs);
+
+ if (table)
+ global_tables = g_slist_prepend (global_tables, table);
+ }
+
+ G_UNLOCK (global_tables);
+}
+
static void
gtk_im_context_simple_init_compose_table (void)
{
@@ -178,10 +231,7 @@ gtk_im_context_simple_init_compose_table (void)
path = g_build_filename (g_get_user_config_dir (), "gtk-4.0", "Compose", NULL);
if (g_file_test (path, G_FILE_TEST_EXISTS))
{
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
-
+ add_compose_table_from_file (path);
g_free (path);
return;
}
@@ -194,9 +244,7 @@ gtk_im_context_simple_init_compose_table (void)
path = g_build_filename (home, ".XCompose", NULL);
if (g_file_test (path, G_FILE_TEST_EXISTS))
{
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
+ add_compose_table_from_file (path);
g_free (path);
return;
}
@@ -240,12 +288,9 @@ gtk_im_context_simple_init_compose_table (void)
g_strfreev (langs);
if (path != NULL)
- {
- G_LOCK (global_tables);
- global_tables = gtk_compose_table_list_add_file (global_tables, path);
- G_UNLOCK (global_tables);
- }
- g_clear_pointer (&path, g_free);
+ add_compose_table_from_file (path);
+
+ g_free (path);
}
static void
@@ -1210,14 +1255,11 @@ gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple,
int max_seq_len,
int n_seqs)
{
- g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple));
-
- G_LOCK (global_tables);
+ GtkComposeTable *table;
- global_tables = gtk_compose_table_list_add_array (global_tables,
- data, max_seq_len, n_seqs);
+ g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple));
- G_UNLOCK (global_tables);
+ add_compose_table_from_data (data, max_seq_len, n_seqs);
}
/**
@@ -1233,9 +1275,5 @@ gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple,
{
g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple));
- G_LOCK (global_tables);
-
- global_tables = gtk_compose_table_list_add_file (global_tables, compose_file);
-
- G_UNLOCK (global_tables);
+ add_compose_table_from_file (compose_file);
}
diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c
index ea17e7a6a0..4348dfbea0 100644
--- a/testsuite/gtk/composetable.c
+++ b/testsuite/gtk/composetable.c
@@ -77,12 +77,10 @@ gtk_compose_table_print (GtkComposeTable *table)
static void
generate_output (const char *file)
{
- GSList *tables = NULL;
GtkComposeTable *table;
char *output;
- tables = gtk_compose_table_list_add_file (tables, file);
- table = tables->data;
+ table = gtk_compose_table_new_with_file (file);
output = gtk_compose_table_print (table);
g_print ("%s", output);
@@ -92,7 +90,6 @@ static void
compose_table_compare (gconstpointer data)
{
const char *basename = data;
- GSList *tables = NULL;
GtkComposeTable *table;
char *file;
char *expected;
@@ -103,11 +100,7 @@ compose_table_compare (gconstpointer data)
file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", basename, NULL);
expected = g_strconcat (file, ".expected", NULL);
- tables = gtk_compose_table_list_add_file (tables, file);
-
- g_assert_true (g_slist_length (tables) == 1);
-
- table = tables->data;
+ table = gtk_compose_table_new_with_file (file);
output = gtk_compose_table_print (table);
diff = diff_with_file (expected, output, -1, &error);
@@ -128,7 +121,6 @@ compose_table_compare (gconstpointer data)
static void
compose_table_match (void)
{
- GSList *tables = NULL;
GtkComposeTable *table;
char *file;
guint16 buffer[8] = { 0, };
@@ -139,11 +131,7 @@ compose_table_match (void)
file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "match", NULL);
- tables = gtk_compose_table_list_add_file (tables, file);
-
- g_assert_true (g_slist_length (tables) == 1);
-
- table = tables->data;
+ table = gtk_compose_table_new_with_file (file);
buffer[0] = GDK_KEY_Multi_key;
buffer[1] = 0;