app: fix crash when opening several times an export plug-in.

When running several times an export plug-in while one is still running,
the export file dialog may get destroyed and the second running plug-in
would try to call functions on a destroyed dialog, hence crashing core
GIMP.
This commit is contained in:
Jehan 2021-01-30 01:02:24 +01:00
parent 63d6d770c4
commit ef3d4cddc4
1 changed files with 34 additions and 22 deletions

View File

@ -179,7 +179,19 @@ file_save_dialog_response (GtkWidget *dialog,
case CHECK_URI_OK: case CHECK_URI_OK:
{ {
gboolean xcf_compression = FALSE; GimpImage *image = file_dialog->image;
GimpDisplay *display_to_close = NULL;
gboolean xcf_compression = FALSE;
gboolean is_save_dialog = GIMP_IS_SAVE_DIALOG (dialog);
gboolean close_after_saving = FALSE;
gboolean save_a_copy = FALSE;
if (is_save_dialog)
{
close_after_saving = GIMP_SAVE_DIALOG (dialog)->close_after_saving;
display_to_close = GIMP_DISPLAY (GIMP_SAVE_DIALOG (dialog)->display_to_close);
save_a_copy = GIMP_SAVE_DIALOG (dialog)->save_a_copy;
}
gimp_file_dialog_set_sensitive (file_dialog, FALSE); gimp_file_dialog_set_sensitive (file_dialog, FALSE);
@ -195,14 +207,17 @@ file_save_dialog_response (GtkWidget *dialog,
if (GIMP_IS_EXPORT_DIALOG (dialog)) if (GIMP_IS_EXPORT_DIALOG (dialog))
gtk_widget_hide (dialog); gtk_widget_hide (dialog);
g_signal_connect (dialog, "destroy",
G_CALLBACK (gtk_widget_destroyed),
&dialog);
if (file_save_dialog_save_image (GIMP_PROGRESS (dialog), if (file_save_dialog_save_image (GIMP_PROGRESS (dialog),
gimp, gimp,
file_dialog->image, image,
file, file,
save_proc, save_proc,
GIMP_RUN_INTERACTIVE, GIMP_RUN_INTERACTIVE,
GIMP_IS_SAVE_DIALOG (dialog) && is_save_dialog && ! save_a_copy,
! GIMP_SAVE_DIALOG (dialog)->save_a_copy,
FALSE, FALSE,
GIMP_IS_EXPORT_DIALOG (dialog), GIMP_IS_EXPORT_DIALOG (dialog),
xcf_compression, xcf_compression,
@ -213,51 +228,48 @@ file_save_dialog_response (GtkWidget *dialog,
* save. Lower-level URI management is handled in * save. Lower-level URI management is handled in
* file_save() * file_save()
*/ */
if (GIMP_IS_SAVE_DIALOG (dialog)) if (is_save_dialog)
{ {
if (GIMP_SAVE_DIALOG (dialog)->save_a_copy) if (save_a_copy)
gimp_image_set_save_a_copy_file (file_dialog->image, file); gimp_image_set_save_a_copy_file (image, file);
g_object_set_data_full (G_OBJECT (file_dialog->image->gimp), g_object_set_data_full (G_OBJECT (image->gimp),
GIMP_FILE_SAVE_LAST_FILE_KEY, GIMP_FILE_SAVE_LAST_FILE_KEY,
g_object_ref (file), g_object_ref (file),
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
} }
else else
{ {
g_object_set_data_full (G_OBJECT (file_dialog->image->gimp), g_object_set_data_full (G_OBJECT (image->gimp),
GIMP_FILE_EXPORT_LAST_FILE_KEY, GIMP_FILE_EXPORT_LAST_FILE_KEY,
g_object_ref (file), g_object_ref (file),
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
} }
/* make sure the menus are updated with the keys we've just set */ /* make sure the menus are updated with the keys we've just set */
gimp_image_flush (file_dialog->image); gimp_image_flush (image);
/* Handle close-after-saving */ /* Handle close-after-saving */
if (GIMP_IS_SAVE_DIALOG (dialog) && if (close_after_saving && display_to_close &&
GIMP_SAVE_DIALOG (dialog)->close_after_saving && ! gimp_image_is_dirty (gimp_display_get_image (display_to_close)))
GIMP_SAVE_DIALOG (dialog)->display_to_close)
{ {
GimpDisplay *display = GIMP_DISPLAY (GIMP_SAVE_DIALOG (dialog)->display_to_close); gimp_display_close (display_to_close);
if (! gimp_image_is_dirty (gimp_display_get_image (display)))
{
gimp_display_close (display);
}
} }
gtk_widget_destroy (dialog); if (dialog)
gtk_widget_destroy (dialog);
} }
else else
{ {
gtk_widget_show (dialog); if (dialog)
gtk_widget_show (dialog);
} }
g_object_unref (file); g_object_unref (file);
g_free (basename); g_free (basename);
gimp_file_dialog_set_sensitive (file_dialog, TRUE); if (dialog)
gimp_file_dialog_set_sensitive (file_dialog, TRUE);
} }
break; break;