static GList *editor_mime_types_to_extensions(gchar **mime_types) { /* FIXME: this should be rewritten to use the shared mime database, as soon as we switch to gio */ static const gchar *conv_table[][2] = { {"application/x-ufraw", ".ufraw"}, {"image/*", "*"}, {"image/bmp", ".bmp"}, {"image/gif", ".gif"}, {"image/jpeg", ".jpeg;.jpg"}, {"image/jpg", ".jpg;.jpeg"}, {"image/pcx", ".pcx"}, {"image/png", ".png"}, {"image/svg", ".svg"}, {"image/svg+xml", ".svg"}, {"image/svg+xml-compressed", ".svg"}, {"image/tiff", ".tiff;.tif"}, {"image/x-bmp", ".bmp"}, {"image/x-canon-crw", ".crw"}, {"image/x-canon-cr2", ".cr2"}, {"image/x-cr2", ".cr2"}, {"image/x-dcraw", "%raw"}, {"image/x-epson-erf", "%erf"}, {"image/x-ico", ".ico"}, {"image/x-mrw", ".mrw"}, {"image/x-minolta-mrw", ".mrw"}, {"image/x-MS-bmp", ".bmp"}, {"image/x-nef", ".nef"}, {"image/x-nikon-nef", ".nef"}, {"image/x-orf", ".orf"}, {"image/x-olympus-orf", ".orf"}, {"image/x-pcx", ".pcx"}, {"image/xpm", ".xpm"}, {"image/x-png", ".png"}, {"image/x-portable-anymap", ".pam"}, {"image/x-portable-bitmap", ".pbm"}, {"image/x-portable-graymap", ".pgm"}, {"image/x-portable-pixmap", ".ppm"}, {"image/x-psd", ".psd"}, {"image/x-raf", ".raf"}, {"image/x-fuji-raf", ".raf"}, {"image/x-sgi", ".sgi"}, {"image/x-tga", ".tga"}, {"image/x-xbitmap", ".xbm"}, {"image/x-xcf", ".xcf"}, {"image/x-xpixmap", ".xpm"}, {"image/x-x3f", ".x3f"}, {"application/x-ptoptimizer-script", ".pto"}, {NULL, NULL}}; gint i, j; GList *list = NULL; for (i = 0; mime_types[i]; i++) for (j = 0; conv_table[j][0]; j++) if (strcmp(mime_types[i], conv_table[j][0]) == 0) list = g_list_concat(list, filter_to_list(conv_table[j][1])); return list; }
void filter_rebuild(void) { GList *work; path_list_free(extension_list); extension_list = NULL; work = filter_list; while (work) { FilterEntry *fe; fe = work->data; work = work->next; if (fe->enabled) { GList *ext; ext = filter_to_list(fe->extensions); if (ext) extension_list = g_list_concat(extension_list, ext); } } }
gboolean editor_read_desktop_file(const gchar *path) { GKeyFile *key_file; EditorDescription *editor; gchar *extensions; gchar *type; const gchar *key = filename_from_path(path); gchar **categories, **only_show_in, **not_show_in; gchar *try_exec; GtkTreeIter iter; gboolean category_geeqie = FALSE; if (g_hash_table_lookup(editors, key)) return FALSE; /* the file found earlier wins */ key_file = g_key_file_new(); if (!g_key_file_load_from_file(key_file, path, 0, NULL)) { g_key_file_free(key_file); return FALSE; } type = g_key_file_get_string(key_file, DESKTOP_GROUP, "Type", NULL); if (!type || strcmp(type, "Application") != 0) { /* We only consider desktop entries of Application type */ g_key_file_free(key_file); g_free(type); return FALSE; } g_free(type); editor = g_new0(EditorDescription, 1); editor->key = g_strdup(key); editor->file = g_strdup(path); g_hash_table_insert(editors, editor->key, editor); if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "Hidden", NULL) || g_key_file_get_boolean(key_file, DESKTOP_GROUP, "NoDisplay", NULL)) { editor->hidden = TRUE; } categories = g_key_file_get_string_list(key_file, DESKTOP_GROUP, "Categories", NULL, NULL); if (categories) { gboolean found = FALSE; gint i; for (i = 0; categories[i]; i++) { /* IMHO "Graphics" is exactly the category that we are interested in, so this does not have to be configurable */ if (strcmp(categories[i], "Graphics") == 0) { found = TRUE; } if (strcmp(categories[i], "X-Geeqie") == 0) { found = TRUE; category_geeqie = TRUE; break; } } if (!found) editor->ignored = TRUE; g_strfreev(categories); } else { editor->ignored = TRUE; } only_show_in = g_key_file_get_string_list(key_file, DESKTOP_GROUP, "OnlyShowIn", NULL, NULL); if (only_show_in) { gboolean found = FALSE; gint i; for (i = 0; only_show_in[i]; i++) if (strcmp(only_show_in[i], "X-Geeqie") == 0) { found = TRUE; break; } if (!found) editor->ignored = TRUE; g_strfreev(only_show_in); } not_show_in = g_key_file_get_string_list(key_file, DESKTOP_GROUP, "NotShowIn", NULL, NULL); if (not_show_in) { gboolean found = FALSE; gint i; for (i = 0; not_show_in[i]; i++) if (strcmp(not_show_in[i], "X-Geeqie") == 0) { found = TRUE; break; } if (found) editor->ignored = TRUE; g_strfreev(not_show_in); } try_exec = g_key_file_get_string(key_file, DESKTOP_GROUP, "TryExec", NULL); if (try_exec && !editor->hidden && !editor->ignored) { gchar *try_exec_res = g_find_program_in_path(try_exec); if (!try_exec_res) editor->hidden = TRUE; g_free(try_exec_res); g_free(try_exec); } if (editor->ignored) { /* ignored editors will be deleted, no need to parse the rest */ g_key_file_free(key_file); return TRUE; } editor->name = g_key_file_get_locale_string(key_file, DESKTOP_GROUP, "Name", NULL, NULL); editor->icon = g_key_file_get_string(key_file, DESKTOP_GROUP, "Icon", NULL); /* Icon key can be either a full path (absolute with file name extension) or an icon name (without extension) */ if (editor->icon && !g_path_is_absolute(editor->icon)) { gchar *ext = strrchr(editor->icon, '.'); if (ext && strlen(ext) == 4 && (!strcmp(ext, ".png") || !strcmp(ext, ".xpm") || !strcmp(ext, ".svg"))) { log_printf(_("Desktop file '%s' should not include extension in Icon key: '%s'\n"), editor->file, editor->icon); // drop extension *ext = '\0'; } } if (editor->icon && !register_theme_icon_as_stock(editor->key, editor->icon)) { g_free(editor->icon); editor->icon = NULL; } editor->exec = g_key_file_get_string(key_file, DESKTOP_GROUP, "Exec", NULL); editor->menu_path = g_key_file_get_string(key_file, DESKTOP_GROUP, "X-Geeqie-Menu-Path", NULL); if (!editor->menu_path) editor->menu_path = g_strdup("PluginsMenu"); editor->hotkey = g_key_file_get_string(key_file, DESKTOP_GROUP, "X-Geeqie-Hotkey", NULL); editor->comment = g_key_file_get_string(key_file, DESKTOP_GROUP, "Comment", NULL); extensions = g_key_file_get_string(key_file, DESKTOP_GROUP, "X-Geeqie-File-Extensions", NULL); if (extensions) editor->ext_list = filter_to_list(extensions); else { gchar **mime_types = g_key_file_get_string_list(key_file, DESKTOP_GROUP, "MimeType", NULL, NULL); if (mime_types) { editor->ext_list = editor_mime_types_to_extensions(mime_types); g_strfreev(mime_types); if (!editor->ext_list) editor->hidden = TRUE; } } if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "X-Geeqie-Keep-Fullscreen", NULL)) editor->flags |= EDITOR_KEEP_FS; if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "X-Geeqie-Verbose", NULL)) editor->flags |= EDITOR_VERBOSE; if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "X-Geeqie-Verbose-Multi", NULL)) editor->flags |= EDITOR_VERBOSE_MULTI; if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "X-Geeqie-Filter", NULL)) editor->flags |= EDITOR_DEST; if (g_key_file_get_boolean(key_file, DESKTOP_GROUP, "Terminal", NULL)) editor->flags |= EDITOR_TERMINAL; editor->flags |= editor_command_parse(editor, NULL, FALSE, NULL); if ((editor->flags & EDITOR_NO_PARAM) && !category_geeqie) editor->hidden = TRUE; g_key_file_free(key_file); if (editor->ignored) return TRUE; gtk_list_store_append(desktop_file_list, &iter); gtk_list_store_set(desktop_file_list, &iter, DESKTOP_FILE_COLUMN_KEY, key, DESKTOP_FILE_COLUMN_NAME, editor->name, DESKTOP_FILE_COLUMN_HIDDEN, editor->hidden ? _("yes") : _("no"), DESKTOP_FILE_COLUMN_WRITABLE, access_file(path, W_OK), DESKTOP_FILE_COLUMN_PATH, path, -1); return TRUE; }