set dialog->progress to NULL in destroy() and check for progress being

2008-10-21  Michael Natterer  <mitch@gimp.org>

	* app/widgets/gimpfiledialog.c: set dialog->progress to NULL in
	destroy() and check for progress being NULL in various places so
	we don't crash on API calls after the widget is destroyed.


svn path=/trunk/; revision=27354
This commit is contained in:
Michael Natterer 2008-10-21 19:23:44 +00:00 committed by Michael Natterer
parent 884042f61c
commit ff8e73ad0c
2 changed files with 55 additions and 14 deletions

View File

@ -1,3 +1,9 @@
2008-10-21 Michael Natterer <mitch@gimp.org>
* app/widgets/gimpfiledialog.c: set dialog->progress to NULL in
destroy() and check for progress being NULL in various places so
we don't crash on API calls after the widget is destroyed.
2008-10-21 Sven Neumann <sven@gimp.org>
* app/tools/gimpgegltool.c (gimp_param_spec_duplicate):

View File

@ -63,6 +63,8 @@ struct _GimpFileDialogState
static void gimp_file_dialog_progress_iface_init (GimpProgressInterface *iface);
static void gimp_file_dialog_destroy (GtkObject *object);
static gboolean gimp_file_dialog_delete_event (GtkWidget *widget,
GdkEventAny *event);
static void gimp_file_dialog_response (GtkDialog *dialog,
@ -122,9 +124,12 @@ G_DEFINE_TYPE_WITH_CODE (GimpFileDialog, gimp_file_dialog,
static void
gimp_file_dialog_class_init (GimpFileDialogClass *klass)
{
GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
object_class->destroy = gimp_file_dialog_destroy;
widget_class->delete_event = gimp_file_dialog_delete_event;
dialog_class->response = gimp_file_dialog_response;
@ -148,6 +153,16 @@ gimp_file_dialog_progress_iface_init (GimpProgressInterface *iface)
iface->get_window = gimp_file_dialog_progress_get_window;
}
static void
gimp_file_dialog_destroy (GtkObject *object)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (object);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
dialog->progress = NULL;
}
static gboolean
gimp_file_dialog_delete_event (GtkWidget *widget,
GdkEventAny *event)
@ -165,7 +180,8 @@ gimp_file_dialog_response (GtkDialog *dialog,
{
file_dialog->canceled = TRUE;
if (GIMP_PROGRESS_BOX (file_dialog->progress)->active &&
if (file_dialog->progress &&
GIMP_PROGRESS_BOX (file_dialog->progress)->active &&
GIMP_PROGRESS_BOX (file_dialog->progress)->cancelable)
{
gimp_progress_cancel (GIMP_PROGRESS (dialog));
@ -179,14 +195,17 @@ gimp_file_dialog_progress_start (GimpProgress *progress,
gboolean cancelable)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
GimpProgress *retval;
GimpProgress *retval = NULL;
retval = gimp_progress_start (GIMP_PROGRESS (dialog->progress),
message, cancelable);
gtk_widget_show (dialog->progress);
if (dialog->progress)
{
retval = gimp_progress_start (GIMP_PROGRESS (dialog->progress),
message, cancelable);
gtk_widget_show (dialog->progress);
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
GTK_RESPONSE_CANCEL, cancelable);
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
GTK_RESPONSE_CANCEL, cancelable);
}
return retval;
}
@ -196,8 +215,11 @@ gimp_file_dialog_progress_end (GimpProgress *progress)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
gimp_progress_end (GIMP_PROGRESS (dialog->progress));
gtk_widget_hide (dialog->progress);
if (dialog->progress)
{
gimp_progress_end (GIMP_PROGRESS (dialog->progress));
gtk_widget_hide (dialog->progress);
}
}
static gboolean
@ -205,7 +227,10 @@ gimp_file_dialog_progress_is_active (GimpProgress *progress)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
return gimp_progress_is_active (GIMP_PROGRESS (dialog->progress));
if (dialog->progress)
return gimp_progress_is_active (GIMP_PROGRESS (dialog->progress));
return FALSE;
}
static void
@ -214,7 +239,8 @@ gimp_file_dialog_progress_set_text (GimpProgress *progress,
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
gimp_progress_set_text (GIMP_PROGRESS (dialog->progress), message);
if (dialog->progress)
gimp_progress_set_text (GIMP_PROGRESS (dialog->progress), message);
}
static void
@ -223,7 +249,8 @@ gimp_file_dialog_progress_set_value (GimpProgress *progress,
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
gimp_progress_set_value (GIMP_PROGRESS (dialog->progress), percentage);
if (dialog->progress)
gimp_progress_set_value (GIMP_PROGRESS (dialog->progress), percentage);
}
static gdouble
@ -231,7 +258,10 @@ gimp_file_dialog_progress_get_value (GimpProgress *progress)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
return gimp_progress_get_value (GIMP_PROGRESS (dialog->progress));
if (dialog->progress)
return gimp_progress_get_value (GIMP_PROGRESS (dialog->progress));
return 0.0;
}
static void
@ -239,7 +269,8 @@ gimp_file_dialog_progress_pulse (GimpProgress *progress)
{
GimpFileDialog *dialog = GIMP_FILE_DIALOG (progress);
gimp_progress_pulse (GIMP_PROGRESS (dialog->progress));
if (dialog->progress)
gimp_progress_pulse (GIMP_PROGRESS (dialog->progress));
}
static guint32
@ -369,6 +400,10 @@ gimp_file_dialog_set_sensitive (GimpFileDialog *dialog,
g_return_if_fail (GIMP_IS_FILE_DIALOG (dialog));
/* bail out if we are already destroyed */
if (! dialog->progress)
return;
children =
gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox));