Also, I don't know if it's a limitation of the XDG portal protocol or an
xdg-desktop-portals implementation quirk, but they reject empty file filters
(not showing the dialog at all, which is bad). It's unlikely to happen because
*usually* a filetype has a corresponding non-empty entry in
*filetype_extensions.conf*, but that's not enforced, and I for example stumbled
upon this with a leftover filetype from a former test run.
I suggest handling this case in this PR as without it it's not possible to use
XDG portals, and with it and a "bad" config (and `GTK_USE_PORTAL=1`) it breaks
selecting a file:
```diff
diff --git a/src/dialogs.c b/src/dialogs.c
index 2919f325b..d1fa65a54 100644
--- a/src/dialogs.c
+++ b/src/dialogs.c
@@ -372,6 +372,7 @@ static GtkWidget *add_file_open_extra_widget(GtkWidget
*dialog)
static GtkFileChooser *create_open_file_dialog(void)
{
GtkFileChooser *dialog;
+ GtkFileFilter *filter;
GtkWidget *viewbtn;
GSList *node;
@@ -408,18 +409,19 @@ static GtkFileChooser *create_open_file_dialog(void)
}
/* add FileFilters(start with "All Files") */
- gtk_file_chooser_add_filter(dialog,
-
filetypes_create_file_filter(filetypes[GEANY_FILETYPES_NONE]));
+ if ((filter =
filetypes_create_file_filter(filetypes[GEANY_FILETYPES_NONE])))
+ gtk_file_chooser_add_filter(dialog, filter);
/* now create meta filter "All Source" */
- gtk_file_chooser_add_filter(dialog,
- filetypes_create_file_filter_all_source());
+ if ((filter = filetypes_create_file_filter_all_source()))
+ gtk_file_chooser_add_filter(dialog, filter);
foreach_slist(node, filetypes_by_title)
{
GeanyFiletype *ft = node->data;
if (G_UNLIKELY(ft->id == GEANY_FILETYPES_NONE))
continue;
- gtk_file_chooser_add_filter(dialog,
filetypes_create_file_filter(ft));
+ if ((filter = filetypes_create_file_filter(ft)))
+ gtk_file_chooser_add_filter(dialog, filter);
}
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
diff --git a/src/filetypes.c b/src/filetypes.c
index b1913e368..883201352 100644
--- a/src/filetypes.c
+++ b/src/filetypes.c
@@ -1187,6 +1187,7 @@ GtkFileFilter
*filetypes_create_file_filter_all_source(void)
{
GtkFileFilter *new_filter;
guint i, j;
+ guint n_patterns = 0;
new_filter = gtk_file_filter_new();
gtk_file_filter_set_name(new_filter, _("All Source"));
@@ -1200,7 +1201,16 @@ GtkFileFilter
*filetypes_create_file_filter_all_source(void)
{
gtk_file_filter_add_pattern(new_filter,
filetypes[i]->pattern[j]);
}
+ n_patterns += j;
}
+
+ /* very unlikely case where there is *no* patterns at all */
+ if (n_patterns == 0)
+ {
+ g_object_unref(new_filter);
+ new_filter = NULL;
+ }
+
return new_filter;
}
@@ -1213,6 +1223,13 @@ GtkFileFilter *filetypes_create_file_filter(const
GeanyFiletype *ft)
g_return_val_if_fail(ft != NULL, NULL);
+ /* unlikely case where the ft has no patterns */
+ if (! ft->pattern[0])
+ {
+ g_debug("Not creating filter for filetype %s that has no
pattern", ft->name);
+ return NULL;
+ }
+
new_filter = gtk_file_filter_new();
title = ft->id == GEANY_FILETYPES_NONE ? _("All files") : ft->title;
gtk_file_filter_set_name(new_filter, title);
```
PS: I can add a commit with this here if you prefer
--
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany/pull/3861#issuecomment-2156810444
You are receiving this because you are subscribed to this thread.
Message ID: <geany/geany/pull/3861/[email protected]>