summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--caja/caja-engrampa.c123
1 files changed, 67 insertions, 56 deletions
diff --git a/caja/caja-engrampa.c b/caja/caja-engrampa.c
index 2229df2..269fe7c 100644
--- a/caja/caja-engrampa.c
+++ b/caja/caja-engrampa.c
@@ -140,63 +140,66 @@ add_callback (CajaMenuItem *item,
}
-static char *mime_types[] = {
- "application/x-7z-compressed",
- "application/x-7z-compressed-tar",
- "application/x-ace",
- "application/x-alz",
- "application/x-ar",
- "application/x-arj",
- "application/x-bzip",
- "application/x-bzip-compressed-tar",
- "application/x-bzip1",
- "application/x-bzip1-compressed-tar",
- "application/vnd.ms-cab-compressed",
- "application/x-cbr",
- "application/x-cbz",
- "application/x-cd-image",
- "application/x-compress",
- "application/x-compressed-tar",
- "application/x-cpio",
- "application/x-deb",
- "application/x-ear",
- "application/x-ms-dos-executable",
- "application/x-gtar",
- "application/x-gzip",
- "application/x-gzpostscript",
- "application/x-java-archive",
- "application/x-lha",
- "application/x-lhz",
- "application/x-lzip",
- "application/x-lzip-compressed-tar",
- "application/x-lzma",
- "application/x-lzma-compressed-tar",
- "application/x-lzop",
- "application/x-lzop-compressed-tar",
- "application/x-ms-wim",
- "application/x-rar",
- "application/x-rar-compressed",
- "application/x-rpm",
- "application/x-rzip",
- "application/x-tar",
- "application/x-tarz",
- "application/x-stuffit",
- "application/x-war",
- "application/x-xz",
- "application/x-xz-compressed-tar",
- "application/x-zip",
- "application/x-zip-compressed",
- "application/x-zoo",
- "application/zip",
- "multipart/x-zip",
- NULL
+static struct {
+ char *mime_type;
+ gboolean is_compressed;
+} archive_mime_types[] = {
+ { "application/x-7z-compressed", TRUE },
+ { "application/x-7z-compressed-tar", TRUE },
+ { "application/x-ace", TRUE },
+ { "application/x-alz", TRUE },
+ { "application/x-ar", TRUE },
+ { "application/x-arj", TRUE },
+ { "application/x-bzip", TRUE },
+ { "application/x-bzip-compressed-tar", TRUE },
+ { "application/x-bzip1", TRUE },
+ { "application/x-bzip1-compressed-tar", TRUE },
+ { "application/vnd.ms-cab-compressed", TRUE },
+ { "application/x-cbr", TRUE },
+ { "application/x-cbz", TRUE },
+ { "application/x-cd-image", FALSE },
+ { "application/x-compress", TRUE },
+ { "application/x-compressed-tar", TRUE },
+ { "application/x-cpio", TRUE },
+ { "application/x-deb", TRUE },
+ { "application/x-ear", TRUE },
+ { "application/x-ms-dos-executable", FALSE },
+ { "application/x-gtar", FALSE },
+ { "application/x-gzip", TRUE },
+ { "application/x-gzpostscript", TRUE },
+ { "application/x-java-archive", TRUE },
+ { "application/x-lha", TRUE },
+ { "application/x-lhz", TRUE },
+ { "application/x-lzip", TRUE },
+ { "application/x-lzip-compressed-tar", TRUE },
+ { "application/x-lzma", TRUE },
+ { "application/x-lzma-compressed-tar", TRUE },
+ { "application/x-lzop", TRUE },
+ { "application/x-lzop-compressed-tar", TRUE },
+ { "application/x-ms-wim", TRUE },
+ { "application/x-rar", TRUE },
+ { "application/x-rar-compressed", TRUE },
+ { "application/x-rpm", TRUE },
+ { "application/x-rzip", TRUE },
+ { "application/x-tar", FALSE },
+ { "application/x-tarz", TRUE },
+ { "application/x-stuffit", TRUE },
+ { "application/x-war", TRUE },
+ { "application/x-xz", TRUE },
+ { "application/x-xz-compressed-tar", TRUE },
+ { "application/x-zip", TRUE },
+ { "application/x-zip-compressed", TRUE },
+ { "application/x-zoo", TRUE },
+ { "application/zip", TRUE },
+ { "multipart/x-zip", TRUE },
+ { NULL, FALSE }
};
-typedef struct
-{
+typedef struct {
gboolean is_archive;
gboolean is_derived_archive;
+ gboolean is_compressed_archive;
} FileMimeInfo;
@@ -208,9 +211,10 @@ get_file_mime_info (CajaFileInfo *file)
file_mime_info.is_archive = FALSE;
file_mime_info.is_derived_archive = FALSE;
+ file_mime_info.is_compressed_archive = FALSE;
- for (i = 0; mime_types[i] != NULL; i++)
- if (caja_file_info_is_mime_type (file, mime_types[i])) {
+ for (i = 0; archive_mime_types[i].mime_type != NULL; i++)
+ if (caja_file_info_is_mime_type (file, archive_mime_types[i].mime_type)) {
char *mime_type;
char *content_type_mime_file;
char *content_type_mime_compare;
@@ -218,9 +222,10 @@ get_file_mime_info (CajaFileInfo *file)
mime_type = caja_file_info_get_mime_type (file);
content_type_mime_file = g_content_type_from_mime_type (mime_type);
- content_type_mime_compare = g_content_type_from_mime_type (mime_types[i]);
+ content_type_mime_compare = g_content_type_from_mime_type (archive_mime_types[i].mime_type);
file_mime_info.is_archive = TRUE;
+ file_mime_info.is_compressed_archive = archive_mime_types[i].is_compressed;
if ((content_type_mime_file != NULL) && (content_type_mime_compare != NULL))
file_mime_info.is_derived_archive = ! g_content_type_equals (content_type_mime_file, content_type_mime_compare);
@@ -272,8 +277,10 @@ caja_fr_get_file_items (CajaMenuProvider *provider,
gboolean one_item;
gboolean one_archive = FALSE;
gboolean one_derived_archive = FALSE;
+ gboolean one_compressed_archive = FALSE;
gboolean all_archives = TRUE;
gboolean all_archives_derived = TRUE;
+ gboolean all_archives_compressed = TRUE;
if (files == NULL)
return NULL;
@@ -290,6 +297,9 @@ caja_fr_get_file_items (CajaMenuProvider *provider,
if (all_archives && ! file_mime_info.is_archive)
all_archives = FALSE;
+ if (all_archives_compressed && file_mime_info.is_archive && ! file_mime_info.is_compressed_archive)
+ all_archives_compressed = FALSE;
+
if (all_archives_derived && file_mime_info.is_archive && ! file_mime_info.is_derived_archive)
all_archives_derived = FALSE;
@@ -306,6 +316,7 @@ caja_fr_get_file_items (CajaMenuProvider *provider,
one_item = (files != NULL) && (files->next == NULL);
one_archive = one_item && all_archives;
one_derived_archive = one_archive && all_archives_derived;
+ one_compressed_archive = one_archive && all_archives_compressed;
if (all_archives && can_write) {
CajaMenuItem *item;
@@ -346,7 +357,7 @@ caja_fr_get_file_items (CajaMenuProvider *provider,
}
- if (! one_archive || one_derived_archive) {
+ if (! one_compressed_archive || one_derived_archive) {
CajaMenuItem *item;
item = caja_menu_item_new ("CajaFr::add",