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]>

Reply via email to