ref: 7f27e795c6f2478bc184295a9c24fa772306d198
parent: a28f58da05ed501efd913527067d07be85b1cc55
author: Jonathan Dowland <jon+github@alcopop.org>
date: Tue May 2 14:11:17 EDT 2017
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
--- a/textscreen/txt_fileselect.c
+++ b/textscreen/txt_fileselect.c
@@ -512,6 +512,45 @@
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 @@
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 @@
{
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;