composetable: Support non-FHS paths for Compose tables

On platforms like NixOS, the libX11 installation prefix may differ from /usr/share,
breaking the hardcoded placeholders. Let’s re-use the X11 path definition from imcontextsimple.
This commit is contained in:
Jan Tojnar 2022-10-20 12:59:17 +02:00
parent 4bb79decf3
commit 94a096ec4c
3 changed files with 28 additions and 17 deletions

View File

@ -284,6 +284,20 @@ fail:
static void parser_parse_file (GtkComposeParser *parser, static void parser_parse_file (GtkComposeParser *parser,
const char *path); const char *path);
char *
gtk_compose_table_get_x11_compose_file_dir (void)
{
char * compose_file_dir;
#if defined (X11_DATA_PREFIX)
compose_file_dir = g_strdup (X11_DATA_PREFIX "/share/X11/locale");
#else
compose_file_dir = g_build_filename (_gtk_get_datadir (), "X11", "locale", NULL);
#endif
return compose_file_dir;
}
/* Substitute %H, %L and %S */ /* Substitute %H, %L and %S */
static char * static char *
handle_substitutions (const char *start, handle_substitutions (const char *start,
@ -305,6 +319,9 @@ handle_substitutions (const char *start,
} }
else else
{ {
char *x11_compose_file_dir;
char *path;
switch (p[1]) switch (p[1])
{ {
case 'H': case 'H':
@ -313,11 +330,17 @@ handle_substitutions (const char *start,
break; break;
case 'L': case 'L':
p++; p++;
g_string_append_printf (s, "/usr/share/X11/locale/%s/Compose", locale_name); x11_compose_file_dir = gtk_compose_table_get_x11_compose_file_dir ();
path = g_build_filename (x11_compose_file_dir, locale_name, "Compose", NULL);
g_string_append (s, path);
g_free (path);
g_free (x11_compose_file_dir);
break; break;
case 'S': case 'S':
p++; p++;
g_string_append (s, "/usr/share/X11/locale"); x11_compose_file_dir = gtk_compose_table_get_x11_compose_file_dir ();
g_string_append (s, x11_compose_file_dir);
g_free (x11_compose_file_dir);
break; break;
default: ; default: ;
/* do nothing, next iteration handles p[1] */ /* do nothing, next iteration handles p[1] */

View File

@ -93,6 +93,8 @@ guint32 gtk_compose_table_data_hash (const guint16 *data,
int max_seq_len, int max_seq_len,
int n_seqs); int n_seqs);
char * gtk_compose_table_get_x11_compose_file_dir (void);
G_END_DECLS G_END_DECLS
#endif /* __GTK_COMPOSETABLE_H__ */ #endif /* __GTK_COMPOSETABLE_H__ */

View File

@ -180,20 +180,6 @@ gtk_im_context_simple_class_init (GtkIMContextSimpleClass *class)
init_compose_table_async (NULL, NULL, NULL); init_compose_table_async (NULL, NULL, NULL);
} }
static char *
get_x11_compose_file_dir (void)
{
char * compose_file_dir;
#if defined (X11_DATA_PREFIX)
compose_file_dir = g_strdup (X11_DATA_PREFIX "/share/X11/locale");
#else
compose_file_dir = g_build_filename (_gtk_get_datadir (), "X11", "locale", NULL);
#endif
return compose_file_dir;
}
static int static int
gtk_compose_table_find (gconstpointer data1, gtk_compose_table_find (gconstpointer data1,
gconstpointer data2) gconstpointer data2)
@ -321,7 +307,7 @@ gtk_im_context_simple_init_compose_table (void)
{ {
if (g_ascii_strncasecmp (*lang, *sys_lang, strlen (*sys_lang)) == 0) if (g_ascii_strncasecmp (*lang, *sys_lang, strlen (*sys_lang)) == 0)
{ {
char *x11_compose_file_dir = get_x11_compose_file_dir (); char *x11_compose_file_dir = gtk_compose_table_get_x11_compose_file_dir ();
path = g_build_filename (x11_compose_file_dir, *lang, "Compose", NULL); path = g_build_filename (x11_compose_file_dir, *lang, "Compose", NULL);
g_free (x11_compose_file_dir); g_free (x11_compose_file_dir);
break; break;