[gtk/gtk-3-24: 1/2] Ensure gdk_quartz_drag_source freed on all paths.
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/gtk-3-24: 1/2] Ensure gdk_quartz_drag_source freed on all paths.
- Date: Tue, 4 May 2021 16:17:14 +0000 (UTC)
commit a6c3887736a34b669e7d8176e3e47a8f1f9f1e4a
Author: John Ralls <jralls ceridwen us>
Date: Sun Apr 25 16:53:15 2021 -0700
Ensure gdk_quartz_drag_source freed on all paths.
New release function _gdk_quartz_drag_source_context_destroy_gtk_only
gets called when drag fails to start or is cancelled as well as
when it successfully completes.
gdk/quartz/GdkQuartzNSWindow.c | 3 +--
gdk/quartz/gdkdnd-quartz.c | 8 ++++++++
gdk/quartz/gdkquartzdnd.h | 3 +++
gtk/gtkdnd-quartz.c | 9 ++++++---
4 files changed, 18 insertions(+), 5 deletions(-)
---
diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c
index 005e747d94..f0e57434f4 100644
--- a/gdk/quartz/GdkQuartzNSWindow.c
+++ b/gdk/quartz/GdkQuartzNSWindow.c
@@ -803,8 +803,7 @@ update_context_from_dragging_info (id <NSDraggingInfo> sender)
gdk_event_free (event);
- g_object_unref (_gdk_quartz_drag_source_context);
- _gdk_quartz_drag_source_context = NULL;
+ _gdk_quartz_drag_source_context_destroy_gtk_only ();
}
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
diff --git a/gdk/quartz/gdkdnd-quartz.c b/gdk/quartz/gdkdnd-quartz.c
index a68ee3055e..a16e67187a 100644
--- a/gdk/quartz/gdkdnd-quartz.c
+++ b/gdk/quartz/gdkdnd-quartz.c
@@ -59,6 +59,14 @@ _gdk_quartz_window_drag_begin (GdkWindow *window,
return _gdk_quartz_drag_source_context;
}
+void
+_gdk_quartz_drag_source_context_destroy_gtk_only ()
+{
+ if (_gdk_quartz_drag_source_context)
+ g_object_unref (_gdk_quartz_drag_source_context);
+ _gdk_quartz_drag_source_context = NULL;
+}
+
static gboolean
gdk_quartz_drag_context_drag_motion (GdkDragContext *context,
GdkWindow *dest_window,
diff --git a/gdk/quartz/gdkquartzdnd.h b/gdk/quartz/gdkquartzdnd.h
index bdcc93a12d..c14d99630d 100644
--- a/gdk/quartz/gdkquartzdnd.h
+++ b/gdk/quartz/gdkquartzdnd.h
@@ -51,6 +51,9 @@ id gdk_quartz_drag_context_get_dragging_info_libgtk_only (GdkDragContext
GDK_AVAILABLE_IN_ALL
GdkDragContext *gdk_quartz_drag_source_context_libgtk_only (void);
+GDK_AVAILABLE_IN_3_24
+void _gdk_quartz_drag_source_context_destroy_gtk_only ();
+
G_END_DECLS
#endif /* __GDK_QUARTZ_DRAG_CONTEXT_H__ */
diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
index 959e90d930..3460de6edd 100644
--- a/gtk/gtkdnd-quartz.c
+++ b/gtk/gtkdnd-quartz.c
@@ -1088,8 +1088,10 @@ gtk_drag_begin_idle (gpointer arg)
[types release];
if ((nswindow = get_toplevel_nswindow (info->source_widget)) == NULL)
- return G_SOURCE_REMOVE;
-
+ {
+ _gdk_quartz_drag_source_context_destroy_gtk_only ();
+ return G_SOURCE_REMOVE;
+ }
/* Ref the context. It's unreffed when the drag has been aborted */
g_object_ref (info->context);
@@ -1101,6 +1103,7 @@ gtk_drag_begin_idle (gpointer arg)
if (drag_image == NULL)
{
g_object_unref (info->context);
+ _gdk_quartz_drag_source_context_destroy_gtk_only ();
return G_SOURCE_REMOVE;
}
@@ -1669,7 +1672,7 @@ _gtk_drag_source_handle_event (GtkWidget *widget,
break;
default:
g_assert_not_reached ();
- }
+ }
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]