int dt_lib_load_modules() { darktable.lib->plugins = NULL; GList *res = NULL; dt_lib_module_t *module; char plugindir[PATH_MAX] = { 0 }, plugin_name[256]; const gchar *d_name; dt_loc_get_plugindir(plugindir, sizeof(plugindir)); g_strlcat(plugindir, "/plugins/lighttable", sizeof(plugindir)); GDir *dir = g_dir_open(plugindir, 0, NULL); if(!dir) return 1; const int name_offset = strlen(SHARED_MODULE_PREFIX), name_end = strlen(SHARED_MODULE_PREFIX) + strlen(SHARED_MODULE_SUFFIX); while((d_name = g_dir_read_name(dir))) { // get lib*.(so|dll) if(!g_str_has_prefix(d_name, SHARED_MODULE_PREFIX)) continue; if(!g_str_has_suffix(d_name, SHARED_MODULE_SUFFIX)) continue; strncpy(plugin_name, d_name + name_offset, strlen(d_name) - name_end); plugin_name[strlen(d_name) - name_end] = '\0'; module = (dt_lib_module_t *)malloc(sizeof(dt_lib_module_t)); gchar *libname = g_module_build_path(plugindir, (const gchar *)plugin_name); if(dt_lib_load_module(module, libname, plugin_name)) { free(module); continue; } // TODO: init presets g_free(libname); res = g_list_insert_sorted(res, module, dt_lib_sort_plugins); dt_lib_init_presets(module); // Calling the keyboard shortcut initialization callback if present // do not init accelerators if there is no gui if(darktable.gui) { if(module->init_key_accels) module->init_key_accels(module); module->gui_init(module); g_object_ref_sink(module->widget); } } g_dir_close(dir); darktable.lib->plugins = res; return 0; }
int dt_lib_load_modules () { darktable.lib->plugins = NULL; GList *res = NULL; dt_lib_module_t *module; char plugindir[1024], plugin_name[256]; const gchar *d_name; dt_loc_get_plugindir(plugindir, 1024); g_strlcat(plugindir, "/plugins/lighttable", 1024); GDir *dir = g_dir_open(plugindir, 0, NULL); if(!dir) return 1; while((d_name = g_dir_read_name(dir))) { // get lib*.so if(strncmp(d_name, "lib", 3)) continue; if(strncmp(d_name + strlen(d_name) - 3, ".so", 3)) continue; strncpy(plugin_name, d_name+3, strlen(d_name)-6); plugin_name[strlen(d_name)-6] = '\0'; module = (dt_lib_module_t *)malloc(sizeof(dt_lib_module_t)); gchar *libname = g_module_build_path(plugindir, (const gchar *)plugin_name); if(dt_lib_load_module(module, libname, plugin_name)) { free(module); continue; } // TODO: init presets g_free(libname); res = g_list_insert_sorted(res, module, dt_lib_sort_plugins); init_presets(module); // Calling the keyboard shortcut initialization callback if present if(module->init_key_accels) module->init_key_accels(module); } g_dir_close(dir); darktable.lib->plugins = res; return 0; }