From 972819272e9a70e565dbf711239f039cd77e2e6e Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Wed, 15 Sep 2021 16:21:18 +0100 Subject: [PATCH] Fix #299: File Compression and Archiving https://github.com/BestImageViewer/geeqie/issues/299 Create a new file class - Archive. Direct this files of this class to a new plugin to process these files. A folder is created under /tmp and the contents of the archive extracted to that folder. A new Geeqie window is opened, pointing to that folder. --- configure.ac | 1 + doc/docbook/GuideReferenceStandardPlugins.xml | 11 ++++ plugins/Makefile.am | 2 +- plugins/open-archive/Makefile.am | 10 ++++ plugins/open-archive/geeqie-open-archive | 54 ++++++++++++++++++ plugins/open-archive/open-archive.desktop.in | 16 ++++++ src/filefilter.c | 2 + src/icons/Makefile.am | 2 + src/icons/archive_file.png | Bin 0 -> 5983 bytes src/image.c | 3 + src/pixbuf_util.c | 4 ++ src/pixbuf_util.h | 1 + src/preferences.c | 3 +- src/remote.c | 3 + src/typedefs.h | 1 + 15 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 plugins/open-archive/Makefile.am create mode 100755 plugins/open-archive/geeqie-open-archive create mode 100644 plugins/open-archive/open-archive.desktop.in create mode 100644 src/icons/archive_file.png diff --git a/configure.ac b/configure.ac index e815ff6b..ff6d44d7 100644 --- a/configure.ac +++ b/configure.ac @@ -805,6 +805,7 @@ AC_CONFIG_FILES([ plugins/image-crop/Makefile plugins/random-image/Makefile plugins/lens/Makefile + plugins/open-archive/Makefile geeqie.spec ]) diff --git a/doc/docbook/GuideReferenceStandardPlugins.xml b/doc/docbook/GuideReferenceStandardPlugins.xml index bfbde9ae..89ec41ca 100644 --- a/doc/docbook/GuideReferenceStandardPlugins.xml +++ b/doc/docbook/GuideReferenceStandardPlugins.xml @@ -132,4 +132,15 @@ menu. +
+ Open archive file + + Opens an archive file (of the type .zip, .rar, .cbr, .tar.gz) and extracts the contents into a folder in /tmp. A new Geeqie window is opened in that folder. + + + This item is displayed in the + Plugins + menu. + +
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5b63d6c9..d6493926 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = rotate symlink ufraw geocode-parameters export-jpeg tethered-photography camera-import image-crop random-image lens +SUBDIRS = rotate symlink ufraw geocode-parameters export-jpeg tethered-photography camera-import image-crop random-image lens open-archive qq_desktoptemplatedir = $(appdir) qq_desktoptemplate_in_files = template.desktop.in qq_desktoptemplate_DATA = $(qq_desktoptemplate_in_files:.desktop.in=.desktop) diff --git a/plugins/open-archive/Makefile.am b/plugins/open-archive/Makefile.am new file mode 100644 index 00000000..78638316 --- /dev/null +++ b/plugins/open-archive/Makefile.am @@ -0,0 +1,10 @@ +dist_gq_bin_SCRIPTS = geeqie-open-archive + +gq_desktopdir = $(appdir)/applications +gq_desktop_in_files = open-archive.desktop.in +gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +EXTRA_DIST = $(gq_desktop_in_files) +CLEANFILES = $(gq_desktop_DATA) + diff --git a/plugins/open-archive/geeqie-open-archive b/plugins/open-archive/geeqie-open-archive new file mode 100755 index 00000000..d5424331 --- /dev/null +++ b/plugins/open-archive/geeqie-open-archive @@ -0,0 +1,54 @@ +#!/bin/bash + +# Extract the contents of an archive file to a +# temporary folder under /tmp. +# +# Open a new Geeqie window pointing to that folder. + +full_path=$(realpath "$1") +filename=$(basename -- "$1") +extension="${filename#*.}" + +case $extension in + + zip) + if [ $(which unzip > /dev/null; echo $? ) = 0 ] + then + rm --recursive --force "/tmp/geeqie-archive/$full_path" + mkdir --parents "/tmp/geeqie-archive/$full_path" + unzip "$full_path" -d "/tmp/geeqie-archive/$full_path" > /dev/null + geeqie --remote --new-window "/tmp/geeqie-archive/$full_path" + else + zenity --title="Geeqie Open Archive" --info --width=300 --text="Utility unzip is not installed" + fi + ;; + + tar.gz) + if [ $(which tar > /dev/null; echo $? ) = 0 ] + then + rm --recursive --force "/tmp/geeqie-archive/$full_path" + mkdir --parents "/tmp/geeqie-archive/$full_path" + tar --extract --gunzip --directory "/tmp/geeqie-archive/$full_path" --file="$full_path" > /dev/null + geeqie --remote --new-window "/tmp/geeqie-archive/$full_path" + else + zenity --title="Geeqie Open Archive" --info --width=300 --text="Utility tar is not installed" + fi + ;; + + cbr | rar) + if [ $(which unrar > /dev/null; echo $? ) = 0 ] + then + rm --recursive --force rf "/tmp/geeqie-archive/$full_path" + mkdir --parents "/tmp/geeqie-archive/$full_path" + unrar "$full_path" "/tmp/geeqie-archive/$full_path" > /dev/null + geeqie --remote --new-window "/tmp/geeqie-archive/$full_path" + else + zenity --title="Geeqie Open Archive" --info --width=300 --text="Utility unrar is not installed" + fi + ;; + + *) + zenity --title="Geeqie Open Archive" --info --width=300 --text="This is not a known archive file type" + ;; +esac + diff --git a/plugins/open-archive/open-archive.desktop.in b/plugins/open-archive/open-archive.desktop.in new file mode 100644 index 00000000..649199ef --- /dev/null +++ b/plugins/open-archive/open-archive.desktop.in @@ -0,0 +1,16 @@ +[Desktop Entry] +Version=1.0 +Type=Application +_Name=Open archive file + +# call the helper script +Exec=geeqie-open-archive %f + +# Desktop files that are usable only in Geeqie should be marked like this: +Categories=X-Geeqie; +OnlyShowIn=X-Geeqie; + +# It can be made verbose +# X-Geeqie-Verbose=true + +Icon=package-x-generic diff --git a/src/filefilter.c b/src/filefilter.c index d0679116..c0d48424 100644 --- a/src/filefilter.c +++ b/src/filefilter.c @@ -309,6 +309,7 @@ void filter_add_defaults(void) #endif filter_add_if_missing("psd", "Adobe Photoshop Document", ".psd", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE); filter_add_if_missing("apng", "Animated Portable Network Graphic", ".apng", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE); + filter_add_if_missing("zip", "Archive files", ".zip;.rar;.cbr;tar.gz", FORMAT_CLASS_ARCHIVE, FALSE, FALSE, TRUE); } GList *filter_to_list(const gchar *extensions) @@ -489,6 +490,7 @@ FileFormatClass filter_file_get_class(const gchar *name) if (filter_file_class(name, FORMAT_CLASS_VIDEO)) return FORMAT_CLASS_VIDEO; if (filter_file_class(name, FORMAT_CLASS_COLLECTION)) return FORMAT_CLASS_COLLECTION; if (filter_file_class(name, FORMAT_CLASS_DOCUMENT)) return FORMAT_CLASS_DOCUMENT; + if (filter_file_class(name, FORMAT_CLASS_ARCHIVE)) return FORMAT_CLASS_ARCHIVE; return FORMAT_CLASS_UNKNOWN; } diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am index 9f05bf67..7a6f89f5 100644 --- a/src/icons/Makefile.am +++ b/src/icons/Makefile.am @@ -12,6 +12,7 @@ ICONS_INLINE = \ geeqie_logo.png \ scroller.png \ sheet_broken.png \ + archive_file.png \ sheet_metadata.png \ sheet_unknown.png \ sheet_video.png \ @@ -63,6 +64,7 @@ ICONS_INLINE_PAIRS = \ icon_thumb $(srcdir)/icon_thumb.png \ icon_scroller $(srcdir)/scroller.png \ icon_broken $(srcdir)/sheet_broken.png \ + icon_archive $(srcdir)/archive_file.png \ icon_metadata $(srcdir)/sheet_metadata.png \ icon_unknown $(srcdir)/sheet_unknown.png \ icon_video $(srcdir)/sheet_video.png \ diff --git a/src/icons/archive_file.png b/src/icons/archive_file.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee49f41513ca19c80248840657fffb5ae5f2ea9 GIT binary patch literal 5983 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 literal 0 HcmV?d00001 diff --git a/src/image.c b/src/image.c index 30a4bc18..f73762c4 100644 --- a/src/image.c +++ b/src/image.c @@ -902,6 +902,9 @@ static void image_load_done_cb(ImageLoader *il, gpointer data) case FORMAT_CLASS_DOCUMENT: pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF); break; + case FORMAT_CLASS_ARCHIVE: + pixbuf = pixbuf_inline(PIXBUF_INLINE_ARCHIVE); + break; default: pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); } diff --git a/src/pixbuf_util.c b/src/pixbuf_util.c index 842396ee..85f58459 100644 --- a/src/pixbuf_util.c +++ b/src/pixbuf_util.c @@ -114,6 +114,7 @@ static PixbufInline inline_pixbuf_data[] = { { PIXBUF_INLINE_COLLECTION, icon_collection }, { PIXBUF_INLINE_ICON, gqview_icon }, { PIXBUF_INLINE_LOGO, geeqie_logo }, + { PIXBUF_INLINE_ARCHIVE, icon_archive }, { PIXBUF_INLINE_ICON_FLOAT, icon_float }, { PIXBUF_INLINE_ICON_THUMB, icon_thumb }, { PIXBUF_INLINE_ICON_BOOK, icon_book }, @@ -299,6 +300,9 @@ GdkPixbuf *pixbuf_fallback(FileData *fd, gint requested_width, gint requested_he case FORMAT_CLASS_DOCUMENT: pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF); break; + case FORMAT_CLASS_ARCHIVE: + pixbuf = pixbuf_inline(PIXBUF_INLINE_ARCHIVE); + break; default: pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); } diff --git a/src/pixbuf_util.h b/src/pixbuf_util.h index 8aa56846..84508346 100644 --- a/src/pixbuf_util.h +++ b/src/pixbuf_util.h @@ -46,6 +46,7 @@ gboolean pixbuf_scale_aspect(gint req_w, gint req_h, gint old_w, gint old_h, gin #define PIXBUF_INLINE_COLLECTION "collection" #define PIXBUF_INLINE_ICON "icon" #define PIXBUF_INLINE_LOGO "logo" +#define PIXBUF_INLINE_ARCHIVE "archive" #define PIXBUF_INLINE_ICON_FLOAT "icon_float" #define PIXBUF_INLINE_ICON_THUMB "icon_thumb" diff --git a/src/preferences.c b/src/preferences.c index 1a2250d4..47ebd294 100644 --- a/src/preferences.c +++ b/src/preferences.c @@ -119,7 +119,8 @@ gchar *format_class_list[] = { N_("Metadata"), N_("Video"), N_("Collection"), - N_("Document") + N_("Document"), + N_("Archive") }; /* config memory values */ diff --git a/src/remote.c b/src/remote.c index a6b66fab..a10cb6a0 100644 --- a/src/remote.c +++ b/src/remote.c @@ -902,6 +902,9 @@ static void get_filelist(const gchar *text, GIOChannel *channel, gboolean recurs case FORMAT_CLASS_DOCUMENT: out_string = g_string_append(out_string, " Class: Document"); break; + case FORMAT_CLASS_ARCHIVE: + out_string = g_string_append(out_string, " Class: Archive"); + break; case FORMAT_CLASS_UNKNOWN: out_string = g_string_append(out_string, " Class: Unknown"); break; diff --git a/src/typedefs.h b/src/typedefs.h index 10460046..c7387a23 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -154,6 +154,7 @@ typedef enum { FORMAT_CLASS_VIDEO, FORMAT_CLASS_COLLECTION, FORMAT_CLASS_DOCUMENT, + FORMAT_CLASS_ARCHIVE, FILE_FORMAT_CLASSES } FileFormatClass; -- 2.20.1