]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0720: GTK4: no support for browsefilter v9.2.0720
authorFoxe Chen <chen.foxe@gmail.com>
Wed, 24 Jun 2026 18:29:23 +0000 (18:29 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 24 Jun 2026 18:29:23 +0000 (18:29 +0000)
Problem:  GTK4: no support for browsefilter
Solution: Add browsefilter support (Foxe Chen)

closes: #20612

Signed-off-by: Foxe Chen <chen.foxe@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/gui_gtk.c
src/gui_gtk4.c
src/version.c

index 84eae6d41b86e99bd65ec0c6a670300a385a054e..13eaf70a7344ab46754fda5a24c4af5766ca5f08 100644 (file)
@@ -1270,32 +1270,35 @@ gui_mch_browse(int saving,
 
        gfilter = gtk_file_filter_new();
        patt = alloc(STRLEN(filter));
-       while (p != NULL && *p != NUL)
+       if (patt != NULL)
        {
-           if (*p == '\n' || *p == ';' || *p == '\t')
+           while (p != NULL && *p != NUL)
            {
-               STRNCPY(patt, filter, i);
-               patt[i] = '\0';
-               if (*p == '\t')
-                   gtk_file_filter_set_name(gfilter, (gchar *)patt);
-               else
+               if (*p == '\n' || *p == ';' || *p == '\t')
                {
-                   gtk_file_filter_add_pattern(gfilter, (gchar *)patt);
-                   if (*p == '\n')
+                   STRNCPY(patt, filter, i);
+                   patt[i] = '\0';
+                   if (*p == '\t')
+                       gtk_file_filter_set_name(gfilter, (gchar *)patt);
+                   else
                    {
-                       gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc),
-                                                                    gfilter);
-                       if (*(p + 1) != NUL)
-                           gfilter = gtk_file_filter_new();
+                       gtk_file_filter_add_pattern(gfilter, (gchar *)patt);
+                       if (*p == '\n')
+                       {
+                           gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc),
+                                   gfilter);
+                           if (*(p + 1) != NUL)
+                               gfilter = gtk_file_filter_new();
+                       }
                    }
+                   filter = ++p;
+                   i = 0;
+               }
+               else
+               {
+                   p++;
+                   i++;
                }
-               filter = ++p;
-               i = 0;
-           }
-           else
-           {
-               p++;
-               i++;
            }
        }
        vim_free(patt);
index b5f1f93b406a2a8541bc84b35df15fb8c360d576..a193233a90171078c858571e26ac4a5a2391630f 100644 (file)
@@ -4805,12 +4805,13 @@ gui_mch_browse(int saving,
        char_u *dflt,
        char_u *ext UNUSED,
        char_u *initdir,
-       char_u *filter UNUSED)
+       char_u *filter)
 {
-    GtkFileDialog      *dlg;
-    FileDialogData     fdd;
-    char_u             dirbuf[MAXPATHL];
-    char_u             *result = NULL;
+    GtkFileDialog   *dlg;
+    FileDialogData  fdd;
+    char_u         dirbuf[MAXPATHL];
+    char_u         *result = NULL;
+    GListStore     *filters;
 
     title = CONVERT_TO_UTF8(title);
 
@@ -4833,6 +4834,53 @@ gui_mch_browse(int saving,
        g_object_unref(dir);
     }
 
+    // Add file filters
+    filters = g_list_store_new(GTK_TYPE_FILE_FILTER);
+    if (filter != NULL && *filter != NUL)
+    {
+       int             i = 0;
+       char_u          *patt;
+       char_u          *p = filter;
+       GtkFileFilter   *gfilter;
+
+       gfilter = gtk_file_filter_new();
+       patt = alloc(STRLEN(filter));
+       if (patt != NULL)
+       {
+           while (p != NULL && *p != NUL)
+           {
+               if (*p == '\n' || *p == ';' || *p == '\t')
+               {
+                   STRNCPY(patt, filter, i);
+                   patt[i] = '\0';
+                   if (*p == '\t')
+                       gtk_file_filter_set_name(gfilter, (gchar *)patt);
+                   else
+                   {
+                       gtk_file_filter_add_pattern(gfilter, (gchar *)patt);
+                       if (*p == '\n')
+                       {
+                           g_list_store_append(filters, gfilter);
+                           g_object_unref(gfilter);
+                           if (*(p + 1) != NUL)
+                               gfilter = gtk_file_filter_new();
+                       }
+                   }
+                   filter = ++p;
+                   i = 0;
+               }
+               else
+               {
+                   p++;
+                   i++;
+               }
+           }
+       }
+       vim_free(patt);
+    }
+    gtk_file_dialog_set_filters(dlg, G_LIST_MODEL(filters));
+    g_object_unref(filters);
+
     if (saving && dflt != NULL && *dflt != NUL)
        gtk_file_dialog_set_initial_name(dlg, (const char *)dflt);
 
index 8d517c22f80999ae5289355dee981d77c43146a8..77fdc87d8851e9c2b4ba919c0cfb81063475b42f 100644 (file)
@@ -759,6 +759,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    720,
 /**/
     719,
 /**/