foxygit / doom Log in
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;