Issue #2237 - export as, select file type (by extention) list problem

In gimp_file_proc_view_get_proc(), when there is no selected
procedure (which can happen, in particular, when searching the
list), return the "automatic" procedure and its corresponding name/
filter, if one exists, instead of bailing.

Additionally, in GimpFileDialog, use a match-all filter when
gimp_file_proc_view_get_proc() returns no filter, avoiding
CRITICALs/segfault.
This commit is contained in:
Ell
2018-10-16 04:28:28 -04:00
parent 7adb6c26e5
commit e26a220a6f
2 changed files with 57 additions and 39 deletions

View File

@ -797,26 +797,32 @@ gimp_file_dialog_proc_changed (GimpFileProcView *view,
GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
GtkFileFilter *filter; GtkFileFilter *filter;
gchar *name; gchar *name;
gchar *label;
dialog->file_proc = gimp_file_proc_view_get_proc (view, &name, &filter); dialog->file_proc = gimp_file_proc_view_get_proc (view, &name, &filter);
if (name) if (name)
{ label = g_strdup_printf (_("Select File _Type (%s)"), name);
gchar *label = g_strdup_printf (_("Select File _Type (%s)"), name); else
label = g_strdup (_("Select File _Type"));
gtk_expander_set_label (GTK_EXPANDER (dialog->proc_expander), label); gtk_expander_set_label (GTK_EXPANDER (dialog->proc_expander), label);
g_free (label); g_free (label);
g_free (name); g_free (name);
}
if (dialog->show_all_files) if (dialog->show_all_files)
g_clear_object (&filter);
if (! filter)
{ {
g_object_unref (filter); filter = g_object_ref_sink (gtk_file_filter_new ());
filter = gtk_file_filter_new ();
gtk_file_filter_add_pattern (filter, "*"); gtk_file_filter_add_pattern (filter, "*");
g_object_ref_sink (filter);
} }
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter); gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
g_object_unref (filter); g_object_unref (filter);
if (gtk_file_chooser_get_action (chooser) == GTK_FILE_CHOOSER_ACTION_SAVE) if (gtk_file_chooser_get_action (chooser) == GTK_FILE_CHOOSER_ACTION_SAVE)

View File

@ -233,47 +233,59 @@ gimp_file_proc_view_get_proc (GimpFileProcView *view,
{ {
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeSelection *selection; GtkTreeSelection *selection;
GimpPlugInProcedure *proc;
GtkTreeIter iter; GtkTreeIter iter;
gboolean has_selection;
g_return_val_if_fail (GIMP_IS_FILE_PROC_VIEW (view), NULL); g_return_val_if_fail (GIMP_IS_FILE_PROC_VIEW (view), NULL);
if (label) *label = NULL;
if (filter) *filter = NULL;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
if (gtk_tree_selection_get_selected (selection, &model, &iter)) has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
{
GimpPlugInProcedure *proc; /* if there's no selected item, we return the "automatic" procedure, which,
* if exists, is the first item.
*/
if (! has_selection)
{
model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
if (! gtk_tree_model_get_iter_first (model, &iter))
return NULL;
}
if (label && filter)
gtk_tree_model_get (model, &iter,
COLUMN_PROC, &proc,
COLUMN_LABEL, label,
COLUMN_FILTER, filter,
-1);
else if (label)
gtk_tree_model_get (model, &iter,
COLUMN_PROC, &proc,
COLUMN_LABEL, label,
-1);
else if (filter)
gtk_tree_model_get (model, &iter,
COLUMN_PROC, &proc,
COLUMN_FILTER, filter,
-1);
else
gtk_tree_model_get (model, &iter, gtk_tree_model_get (model, &iter,
COLUMN_PROC, &proc, COLUMN_PROC, &proc,
-1); -1);
if (proc) if (proc)
{
g_object_unref (proc); g_object_unref (proc);
return proc; /* there's no selected item, and no "automatic" procedure. return NULL.
*/
if (! has_selection)
return NULL;
} }
if (label) if (label)
*label = NULL; {
gtk_tree_model_get (model, &iter,
COLUMN_LABEL, label,
-1);
}
return NULL; if (filter)
{
gtk_tree_model_get (model, &iter,
COLUMN_FILTER, filter,
-1);
}
return proc;
} }
gboolean gboolean