commit 7f27e795c6f2478bc184295a9c24fa772306d198
Author: Jonathan Dowland <jon+github@alcopop.org>
AuthorDate: Tue May 2 18:11:17 2017 +0100
Commit: Simon Howard <fraggle+github@gmail.com>
CommitDate: Tue May 2 13:11:17 2017 -0400
textscreen: zenity chooser file filter tweaks (#909)
Adjust the pattern passed to zenity to be case-insensitive
(e.g., if the input pattern was "wad", generate "[Ww][Aa][Dd]").
This means the chooser will show the following, which would otherwise
be hidden:
* TEST2.WAD
* test3.WAD
---
textscreen/txt_fileselect.c | 59 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 53 insertions(+), 6 deletions(-)
diff --git a/textscreen/txt_fileselect.c b/textscreen/txt_fileselect.c
index 7c40cb33..371a4065 100644
--- a/textscreen/txt_fileselect.c
+++ b/textscreen/txt_fileselect.c
@@ -512,6 +512,45 @@ int TXT_CanSelectFiles(void)
return ZenityAvailable();
}
+//
+// ExpandExtension
+// given an extension (like wad)
+// return a pointer to a string that is a case-insensitive
+// pattern representation (like [Ww][Aa][Dd])
+//
+static char *ExpandExtension(char *orig)
+{
+ int oldlen, newlen, i;
+ char *c, *newext = NULL;
+
+ oldlen = strlen(orig);
+ newlen = oldlen * 4; // pathological case: 'w' => '[Ww]'
+ newext = malloc(newlen+1);
+
+ if (newext == NULL)
+ {
+ return NULL;
+ }
+
+ c = newext;
+ for (i = 0; i < oldlen; ++i)
+ {
+ if (isalpha(orig[i]))
+ {
+ *c++ = '[';
+ *c++ = tolower(orig[i]);
+ *c++ = toupper(orig[i]);
+ *c++ = ']';
+ }
+ else
+ {
+ *c++ = orig[i];
+ }
+ }
+ *c = '\0';
+ return newext;
+}
+
char *TXT_SelectFile(char *window_title, char **extensions)
{
unsigned int i;
@@ -525,7 +564,7 @@ char *TXT_SelectFile(char *window_title, char **extensions)
return NULL;
}
- argv = calloc(4 + NumExtensions(extensions), sizeof(char *));
+ argv = calloc(5 + NumExtensions(extensions), sizeof(char *));
argv[0] = ZENITY_BINARY;
argv[1] = "--file-selection";
argc = 2;
@@ -547,12 +586,20 @@ char *TXT_SelectFile(char *window_title, char **extensions)
{
for (i = 0; extensions[i] != NULL; ++i)
{
- len = 30 + strlen(extensions[i]) * 2;
- argv[argc] = malloc(len);
- TXT_snprintf(argv[argc], len, "--file-filter=.%s | *.%s",
- extensions[i], extensions[i]);
- ++argc;
+ char * newext = ExpandExtension(extensions[i]);
+ if (newext)
+ {
+ len = 30 + strlen(extensions[i]) + strlen(newext);
+ argv[argc] = malloc(len);
+ TXT_snprintf(argv[argc], len, "--file-filter=.%s | *.%s",
+ extensions[i], newext);
+ ++argc;
+ free(newext);
+ }
}
+
+ argv[argc] = strdup("--file-filter=*.* | *.*");
+ ++argc;
}
argv[argc] = NULL;