summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/gtk-demo/application.c1
-rw-r--r--docs/reference/gtk/gtk3-sections.txt1
-rw-r--r--gtk/gtkfilechooserbutton.c6
-rw-r--r--gtk/gtknativedialog.c24
-rw-r--r--gtk/gtknativedialog.h2
-rw-r--r--tests/testgtk.c9
6 files changed, 41 insertions, 2 deletions
diff --git a/demos/gtk-demo/application.c b/demos/gtk-demo/application.c
index 02c12f95a5..6124c3fce1 100644
--- a/demos/gtk-demo/application.c
+++ b/demos/gtk-demo/application.c
@@ -113,6 +113,7 @@ open_response_cb (GtkNativeDialog *dialog,
}
}
+ gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (native));
g_object_unref (native);
}
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index e8ad7578a4..767ad261d5 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -2520,6 +2520,7 @@ GTK_TYPE_NATIVE_DIALOG
GtkNativeDialogClass
gtk_native_dialog_show
gtk_native_dialog_hide
+gtk_native_dialog_destroy
gtk_native_dialog_get_visible
gtk_native_dialog_set_modal
gtk_native_dialog_get_modal
diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c
index 1df73bc4b2..000482ebf8 100644
--- a/gtk/gtkfilechooserbutton.c
+++ b/gtk/gtkfilechooserbutton.c
@@ -1008,7 +1008,11 @@ gtk_file_chooser_button_destroy (GtkWidget *widget)
priv->dialog = NULL;
}
- g_clear_object (&priv->native);
+ if (priv->native)
+ {
+ gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (priv->native));
+ g_clear_object (&priv->native);
+ }
priv->chooser = NULL;
diff --git a/gtk/gtknativedialog.c b/gtk/gtknativedialog.c
index d67047c591..e4fbb675bc 100644
--- a/gtk/gtknativedialog.c
+++ b/gtk/gtknativedialog.c
@@ -361,6 +361,30 @@ gtk_native_dialog_hide (GtkNativeDialog *self)
g_object_notify_by_pspec (G_OBJECT (self), native_props[PROP_VISIBLE]);
}
+/**
+ * gtk_native_dialog_destroy:
+ * @self: a #GtkNativeDialog
+ *
+ * Destroys a dialog.
+ *
+ * When a dialog is destroyed, it will break any references it holds
+ * to other objects. If it is visible it will be hidden and any underlying
+ * window system resources will be destroyed.
+ *
+ * Note that this does not release any reference to the object (as opposed to
+ * destroying a GtkWindow) because there is no reference from the windowing
+ * system to the #GtkNativeDialog.
+ *
+ * Since: 3.20
+ **/
+void
+gtk_native_dialog_destroy (GtkNativeDialog *self)
+{
+ g_return_if_fail (GTK_IS_NATIVE_DIALOG (self));
+
+ g_object_run_dispose (G_OBJECT (self));
+}
+
void
_gtk_native_dialog_emit_response (GtkNativeDialog *self,
int response_id)
diff --git a/gtk/gtknativedialog.h b/gtk/gtknativedialog.h
index 8d5bd60234..de1a6559a5 100644
--- a/gtk/gtknativedialog.h
+++ b/gtk/gtknativedialog.h
@@ -54,6 +54,8 @@ void gtk_native_dialog_show (GtkNativeDialog *self);
GDK_AVAILABLE_IN_3_20
void gtk_native_dialog_hide (GtkNativeDialog *self);
GDK_AVAILABLE_IN_3_20
+void gtk_native_dialog_destroy (GtkNativeDialog *self);
+GDK_AVAILABLE_IN_3_20
gboolean gtk_native_dialog_get_visible (GtkNativeDialog *self);
GDK_AVAILABLE_IN_3_20
void gtk_native_dialog_set_modal (GtkNativeDialog *self,
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 7dec326bcc..d00e7f7cad 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -9660,6 +9660,13 @@ native_filter_changed (GtkWidget *combo,
}
}
+static void
+destroy_native (GtkFileChooserNative *native)
+{
+ gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (native));
+ g_object_unref (native);
+}
+
void
create_native_dialogs (GtkWidget *widget)
{
@@ -9681,7 +9688,7 @@ create_native_dialogs (GtkWidget *widget)
"_accept&native",
"_cancel__native");
- g_signal_connect_swapped (G_OBJECT (window), "destroy", G_CALLBACK (g_object_unref), native);
+ g_signal_connect_swapped (G_OBJECT (window), "destroy", G_CALLBACK (destroy_native), native);
gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (native),
g_get_current_dir (),