From: Foxe Chen Date: Wed, 24 Jun 2026 18:29:23 +0000 (+0000) Subject: patch 9.2.0720: GTK4: no support for browsefilter X-Git-Tag: v9.2.0720^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03a8a13e93d6c2a96c74bb634289de79ee7e97d3;p=thirdparty%2Fvim.git patch 9.2.0720: GTK4: no support for browsefilter Problem: GTK4: no support for browsefilter Solution: Add browsefilter support (Foxe Chen) closes: #20612 Signed-off-by: Foxe Chen Signed-off-by: Christian Brabandt --- diff --git a/src/gui_gtk.c b/src/gui_gtk.c index 84eae6d41b..13eaf70a73 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -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); diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c index b5f1f93b40..a193233a90 100644 --- a/src/gui_gtk4.c +++ b/src/gui_gtk4.c @@ -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); diff --git a/src/version.c b/src/version.c index 8d517c22f8..77fdc87d88 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 720, /**/ 719, /**/