static void append_engine(gchar * dlname) { gchar * can; gchar * err; (void) dlerror(); void * hand = dlopen(dlname,RTLD_NOW); err = dlerror(); if (!hand || err) { g_warning(err); if (hand) dlclose(hand); return; } can = canonize_name(dlname); if (engine_is_unique(can)) { layout_settings_proc lay; lay = dlsym(hand,"layout_engine_settings"); if ((err=dlerror())) g_warning(err); if (lay) { get_meta_info_proc meta; EngineData * d = malloc(sizeof(EngineData)); GtkTreeIter i; const gchar * format = "<b>%s</b> (%s)\n" "<i><small>%s</small></i>"; meta = dlsym(hand,"get_meta_info"); if ((err=dlerror())) g_warning(err); d->meta.description=g_strdup("No Description"); d->meta.version=g_strdup("0.0"); d->meta.last_compat=g_strdup("0.0"); d->meta.icon=gtk_widget_render_icon(EngineCombo,GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_LARGE_TOOLBAR,"themeengine"); if (meta) meta(&(d->meta)); else g_warning("Engine %s has no meta info, please update it, using defaults.",dlname); d->dlname = dlname; d->canname = can; d->vbox = gtk_vbox_new(FALSE,2); g_object_ref(d->vbox); lay(d->vbox); EngineList = g_slist_append(EngineList,d); gtk_list_store_append(EngineModel,&i); gtk_list_store_set(EngineModel,&i,ENGINE_COL_DLNAME,d->dlname,ENGINE_COL_NAME,d->canname, ENGINE_COL_VER,d->meta.version,ENGINE_COL_LAST_COMPAT,d->meta.last_compat, ENGINE_COL_ICON,d->meta.icon,ENGINE_COL_MARKUP, g_markup_printf_escaped(format,d->canname,d->meta.version,d->meta.description), -1); //gtk_combo_box_prepend_text(GTK_COMBO_BOX(EngineCombo),d->canname); } } dlclose(hand); }
static void append_engine(gchar * dlname) { gchar * can; gchar * err; (void) dlerror(); void * hand = dlopen(dlname,RTLD_NOW); err = dlerror(); if (!hand || err) { g_warning("%s", err); if (hand) dlclose(hand); return; } can = canonize_name(dlname); if (engine_is_unique(can)) { layout_settings_proc lay; lay = dlsym(hand,"layout_engine_settings"); if ((err=dlerror())) g_warning("%s", err); if (lay) { get_meta_info_proc meta; EngineData * d = g_malloc0(sizeof(EngineData)); GtkTreeIter i; const gchar * format = "<b>%s</b> (%s)\n" "<i><small>%s</small></i>"; meta = dlsym(hand,"get_meta_info"); if ((err=dlerror())) g_warning("%s", err); d->meta.description=g_strdup("No Description"); d->meta.version=g_strdup("0.0"); d->meta.last_compat=g_strdup("0.0"); d->meta.icon=gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), "image-missing",24, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); if (meta) meta(&(d->meta)); else g_warning("Engine %s has no meta info, please update it, using defaults.",dlname); d->dlname = dlname; d->canname = can; d->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,2); g_object_ref(d->vbox); lay(d->vbox); EngineList = g_slist_append(EngineList,d); gtk_list_store_append(EngineModel,&i); gtk_list_store_set(EngineModel,&i,ENGINE_COL_DLNAME,d->dlname,ENGINE_COL_NAME,d->canname, ENGINE_COL_VER,d->meta.version,ENGINE_COL_LAST_COMPAT,d->meta.last_compat, ENGINE_COL_ICON,d->meta.icon,ENGINE_COL_MARKUP, g_markup_printf_escaped(format,d->canname,d->meta.version,d->meta.description), -1); /* gtk_combo_box_prepend_text(GTK_COMBO_BOX(EngineCombo),d->canname); */ } } dlclose(hand); }