X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fqueryimmodules.c;h=f4e561de449d94e7dec7153d3aae49662a0960e5;hb=563eb60666d9f72c38d7542b0ab37841e6aac488;hp=aa45cf958410c07c27cebad6df87cd81fc704e1d;hpb=d9eb9ba9d6b1967c8243aecbd043cebe52198819;p=~andy%2Fgtk diff --git a/gtk/queryimmodules.c b/gtk/queryimmodules.c index aa45cf958..f4e561de4 100644 --- a/gtk/queryimmodules.c +++ b/gtk/queryimmodules.c @@ -1,7 +1,7 @@ /* GTK+ * querymodules.c: * - * Copyright (C) 2000 Red Hat Software + * Copyright (C) 2000-2010 Red Hat Software * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -10,53 +10,89 @@ * * 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" #include -#include +#include #include #include #ifdef HAVE_UNISTD_H #include #endif -#include -#ifdef G_OS_WIN32 -#define SOEXT ".dll" +#ifdef USE_LA_MODULES +#define SOEXT ".la" #else -#define SOEXT ".so" +#define SOEXT ("." G_MODULE_SUFFIX) +#endif + +#include "gtk/gtkimcontextinfo.h" +#include "gtk/gtkversion.h" + +#define GDK_DISABLE_DEPRECATION_WARNINGS + +#include "gtk/deprecated/gtkrc.h" + +static void +escape_string (GString *contents, const char *str) +{ + while (TRUE) + { + char c = *str++; + + switch (c) + { + case '\0': + goto done; + case '\n': + g_string_append (contents, "\\n"); + break; + case '\"': + g_string_append (contents, "\\\""); + break; +#ifdef G_OS_WIN32 + /* Replace backslashes in path with forward slashes, so that + * it reads in without problems. + */ + case '\\': + g_string_append (contents, "/"); + break; #endif + default: + g_string_append_c (contents, c); + } + } -#include -#include "gtk/gtkrc.h" -#include "gtk/gtkimmodule.h" + done:; +} -void -print_escaped (const char *str) +static void +print_escaped (GString *contents, const char *str) { - char *tmp = g_strescape (str, NULL); - printf ("\"%s\" ", tmp); - g_free (tmp); + g_string_append_c (contents, '"'); + escape_string (contents, str); + g_string_append_c (contents, '"'); + g_string_append_c (contents, ' '); } -gboolean -query_module (const char *dir, const char *name) +static gboolean +query_module (const char *dir, const char *name, GString *contents) { void (*list) (const GtkIMContextInfo ***contexts, - guint *n_contexts); - void (*init) (GTypeModule *type_module); - void (*exit) (void); - GtkIMContext *(*create) (const gchar *context_id); + guint *n_contexts); + + gpointer list_ptr; + gpointer init_ptr; + gpointer exit_ptr; + gpointer create_ptr; GModule *module; gchar *path; @@ -66,45 +102,47 @@ query_module (const char *dir, const char *name) path = g_strdup (name); else path = g_build_filename (dir, name, NULL); - + module = g_module_open (path, 0); if (!module) { - fprintf(stderr, "Cannot load module %s: %s\n", path, g_module_error()); + g_fprintf (stderr, "Cannot load module %s: %s\n", path, g_module_error()); error = TRUE; } - + if (module && - g_module_symbol (module, "im_module_list", (gpointer)&list) && - g_module_symbol (module, "im_module_init", (gpointer)&init) && - g_module_symbol (module, "im_module_exit", (gpointer)&exit) && - g_module_symbol (module, "im_module_create", (gpointer)&create)) + g_module_symbol (module, "im_module_list", &list_ptr) && + g_module_symbol (module, "im_module_init", &init_ptr) && + g_module_symbol (module, "im_module_exit", &exit_ptr) && + g_module_symbol (module, "im_module_create", &create_ptr)) { const GtkIMContextInfo **contexts; guint n_contexts; int i; - print_escaped (path); - fputs ("\n", stdout); + list = list_ptr; + + print_escaped (contents, path); + g_string_append_c (contents, '\n'); (*list) (&contexts, &n_contexts); - for (i=0; icontext_id); - print_escaped (contexts[i]->context_name); - print_escaped (contexts[i]->domain); - print_escaped (contexts[i]->domain_dirname); - print_escaped (contexts[i]->default_locales); - fputs ("\n", stdout); - } - fputs ("\n", stdout); + for (i = 0; i < n_contexts; i++) + { + print_escaped (contents, contexts[i]->context_id); + print_escaped (contents, contexts[i]->context_name); + print_escaped (contents, contexts[i]->domain); + print_escaped (contents, contexts[i]->domain_dirname); + print_escaped (contents, contexts[i]->default_locales); + g_string_append_c (contents, '\n'); + } + g_string_append_c (contents, '\n'); } else { - fprintf (stderr, "%s does not export GTK+ IM module API: %s\n", path, - g_module_error()); + g_fprintf (stderr, "%s does not export GTK+ IM module API: %s\n", path, + g_module_error ()); error = TRUE; } @@ -113,7 +151,7 @@ query_module (const char *dir, const char *name) g_module_close (module); return error; -} +} int main (int argc, char **argv) { @@ -121,49 +159,86 @@ int main (int argc, char **argv) int i; char *path; gboolean error = FALSE; + gchar *cache_file = NULL; + gint first_file = 1; + GString *contents; - printf ("# GTK+ Input Method Modules file\n" - "# Automatically generated file, do not edit\n" - "#\n"); + if (argc > 1 && strcmp (argv[1], "--update-cache") == 0) + { + cache_file = gtk_rc_get_im_module_file (); + first_file = 2; + } - if (argc == 1) /* No arguments given */ + contents = g_string_new (""); + g_string_append_printf (contents, + "# GTK+ Input Method Modules file\n" + "# Automatically generated file, do not edit\n" + "# Created by %s from gtk+-%d.%d.%d\n" + "#\n", + argv[0], + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + + if (argc == first_file) /* No file arguments given */ { char **dirs; int i; + GHashTable *dirs_done; path = gtk_rc_get_im_module_path (); - printf ("# ModulesPath = %s\n#\n", path); + g_string_append_printf (contents, "# ModulesPath = %s\n#\n", path); dirs = pango_split_file_list (path); + dirs_done = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + + for (i = 0; dirs[i]; i++) + if (!g_hash_table_lookup (dirs_done, dirs[i])) + { + GDir *dir = g_dir_open (dirs[i], 0, NULL); + if (dir) + { + const char *dent; + + while ((dent = g_dir_read_name (dir))) + { + if (g_str_has_suffix (dent, SOEXT)) + error |= query_module (dirs[i], dent, contents); + } - for (i=0; dirs[i]; i++) - { - GDir *dir = g_dir_open (dirs[i], 0, NULL); - if (dir) - { - char *dent; - - while ((dent = g_dir_read_name (dir))) - { - int len = strlen (dent); - if (len > 3 && strcmp (dent + len - strlen (SOEXT), SOEXT) == 0) - error |= query_module (dirs[i], dent); - } - - g_dir_close (dir); - } - } + g_dir_close (dir); + } + + g_hash_table_insert (dirs_done, dirs[i], GUINT_TO_POINTER (TRUE)); + } + + g_hash_table_destroy (dirs_done); } else { cwd = g_get_current_dir (); - - for (i=1; istr, -1, &err)) + { + g_fprintf (stderr, "%s\n", err->message); + error = 1; + } + } + else + g_print ("%s\n", contents->str); + } + return error ? 1 : 0; }