From 06af1a3cc9920780c7edeba34677fc66b18ff5eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Thu, 18 Nov 2021 12:44:25 +0100 Subject: [PATCH] Add a command line option to list supported types Make it work without a display connection. --- fastiv-io.c | 22 ++++++++++++++++++++++ fastiv-io.h | 2 ++ fastiv.c | 25 ++++++++++++++++++------- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/fastiv-io.c b/fastiv-io.c index 82c3229..e1bb60a 100644 --- a/fastiv-io.c +++ b/fastiv-io.c @@ -78,6 +78,28 @@ const char *fastiv_io_supported_media_types[] = { NULL }; +char ** +fastiv_io_all_supported_media_types(void) +{ + GPtrArray *types = g_ptr_array_new(); + for (const char **p = fastiv_io_supported_media_types; *p; p++) + g_ptr_array_add(types, g_strdup(*p)); + +#ifdef HAVE_GDKPIXBUF + GSList *formats = gdk_pixbuf_get_formats(); + for (GSList *iter = formats; iter; iter = iter->next) { + gchar **subtypes = gdk_pixbuf_format_get_mime_types(iter->data); + for (gchar **p = subtypes; *p; p++) + g_ptr_array_add(types, *p); + g_free(subtypes); + } + g_slist_free(formats); +#endif // HAVE_GDKPIXBUF + + g_ptr_array_add(types, NULL); + return (char **) g_ptr_array_free(types, FALSE); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #define FASTIV_IO_ERROR fastiv_io_error_quark() diff --git a/fastiv-io.h b/fastiv-io.h index 6275bc2..5a90e91 100644 --- a/fastiv-io.h +++ b/fastiv-io.h @@ -22,6 +22,8 @@ extern const char *fastiv_io_supported_media_types[]; +char **fastiv_io_all_supported_media_types(void); + cairo_surface_t *fastiv_io_open(const gchar *path, GError **error); cairo_surface_t *fastiv_io_open_from_data( const char *data, size_t len, const gchar *path, GError **error); diff --git a/fastiv.c b/fastiv.c index 7162a53..70210b1 100644 --- a/fastiv.c +++ b/fastiv.c @@ -396,24 +396,33 @@ on_button_press_browser(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event) int main(int argc, char *argv[]) { - gboolean show_version = FALSE; + gboolean show_version = FALSE, show_supported_media_types = FALSE; gchar **path_args = NULL; const GOptionEntry options[] = { {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &path_args, NULL, "[FILE | DIRECTORY]"}, + {"list-supported-media-types", 0, G_OPTION_FLAG_IN_MAIN, + G_OPTION_ARG_NONE, &show_supported_media_types, + "Output supported media types and exit", NULL}, {"version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, - &show_version, "output version information and exit", NULL}, + &show_version, "Output version information and exit", NULL}, {}, }; GError *error = NULL; - if (!gtk_init_with_args( - &argc, &argv, " - fast image viewer", options, NULL, &error)) - exit_fatal("%s", error->message); + gboolean initialized = gtk_init_with_args( + &argc, &argv, " - fast image viewer", options, NULL, &error); if (show_version) { printf(PROJECT_NAME " " PROJECT_VERSION "\n"); return 0; } + if (show_supported_media_types) { + for (char **types = fastiv_io_all_supported_media_types(); *types; ) + g_print("%s\n", *types++); + return 0; + } + if (!initialized) + exit_fatal("%s", error->message); // NOTE: Firefox and Eye of GNOME both interpret multiple arguments // in a special way. This is problematic, because one-element lists @@ -506,8 +515,10 @@ main(int argc, char *argv[]) G_CALLBACK(on_key_press), NULL); gtk_container_add(GTK_CONTAINER(g.window), g.stack); - // TODO(p): Also milk gdk-pixbuf, if linked in, needs to be done in runtime. - g.supported_globs = extract_mime_globs(fastiv_io_supported_media_types); + char **types = fastiv_io_all_supported_media_types(); + g.supported_globs = extract_mime_globs((const char **) types); + g_strfreev(types); + g.files = g_ptr_array_new_full(16, g_free); gchar *cwd = g_get_current_dir();