static void shooter_ensure_modules (void) { static GimpModuleDB *module_db = NULL; if (! module_db) { gchar *config = gimp_config_build_plug_in_path ("modules"); gchar *path = gimp_config_path_expand (config, TRUE, NULL); module_db = gimp_module_db_new (FALSE); gimp_module_db_load (module_db, path); g_free (path); g_free (config); } }
static void gimp_ensure_modules (void) { static GimpModuleDB *module_db = NULL; if (! module_db) { gchar *load_inhibit = gimp_get_module_load_inhibit (); gchar *module_path = gimp_gimprc_query ("module-path"); module_db = gimp_module_db_new (FALSE); gimp_module_db_set_load_inhibit (module_db, load_inhibit); gimp_module_db_load (module_db, module_path); g_free (module_path); g_free (load_inhibit); } }
/** * gimp_module_db_refresh: * @db: A #GimpModuleDB. * @module_path: A #G_SEARCHPATH_SEPARATOR delimited list of directories * to load modules from. * * Does the same as gimp_module_db_load(), plus removes all #GimpModule * instances whose modules have been deleted from disk. * * Note that the #GimpModule's will just be removed from the internal * list and not freed as this is not possible with #GTypeModule * instances which actually implement types. **/ void gimp_module_db_refresh (GimpModuleDB *db, const gchar *module_path) { GList *kill_list = NULL; g_return_if_fail (GIMP_IS_MODULE_DB (db)); g_return_if_fail (module_path != NULL); /* remove modules we don't have on disk anymore */ g_list_foreach (db->modules, gimp_module_db_module_on_disk_func, &kill_list); g_list_foreach (kill_list, gimp_module_db_module_remove_func, db); g_list_free (kill_list); /* walk filesystem and add new things we find */ gimp_module_db_load (db, module_path); }
void gimp_modules_load (Gimp *gimp) { gchar *filename; gchar *path; GScanner *scanner; gchar *module_load_inhibit = NULL; g_return_if_fail (GIMP_IS_GIMP (gimp)); if (gimp->no_interface) return; filename = gimp_personal_rc_file ("modulerc"); if (gimp->be_verbose) g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (filename)); scanner = gimp_scanner_new_file (filename, NULL); g_free (filename); if (scanner) { GTokenType token; GError *error = NULL; #define MODULE_LOAD_INHIBIT 1 g_scanner_scope_add_symbol (scanner, 0, "module-load-inhibit", GINT_TO_POINTER (MODULE_LOAD_INHIBIT)); token = G_TOKEN_LEFT_PAREN; while (g_scanner_peek_next_token (scanner) == token) { token = g_scanner_get_next_token (scanner); switch (token) { case G_TOKEN_LEFT_PAREN: token = G_TOKEN_SYMBOL; break; case G_TOKEN_SYMBOL: if (scanner->value.v_symbol == GINT_TO_POINTER (MODULE_LOAD_INHIBIT)) { token = G_TOKEN_STRING; if (! gimp_scanner_parse_string_no_validate (scanner, &module_load_inhibit)) goto error; } token = G_TOKEN_RIGHT_PAREN; break; case G_TOKEN_RIGHT_PAREN: token = G_TOKEN_LEFT_PAREN; break; default: /* do nothing */ break; } } #undef MODULE_LOAD_INHIBIT if (token != G_TOKEN_LEFT_PAREN) { g_scanner_get_next_token (scanner); g_scanner_unexp_token (scanner, token, NULL, NULL, NULL, _("fatal parse error"), TRUE); } error: if (error) { gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR, "%s", error->message); g_clear_error (&error); } gimp_scanner_destroy (scanner); } if (module_load_inhibit) { gimp_module_db_set_load_inhibit (gimp->module_db, module_load_inhibit); g_free (module_load_inhibit); } path = gimp_config_path_expand (gimp->config->module_path, TRUE, NULL); gimp_module_db_load (gimp->module_db, path); g_free (path); }