diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 14:32:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 14:32:59 +0000 |
commit | adb934701975f6b0214475d1a8d0d1ce727b9d4d (patch) | |
tree | 5688c745d10b64c8856586864ec416a6bdae881d /build-aux/osx/build/modulesets/patches/gtk+ | |
parent | Initial commit. (diff) | |
download | gedit-adb934701975f6b0214475d1a8d0d1ce727b9d4d.tar.xz gedit-adb934701975f6b0214475d1a8d0d1ce727b9d4d.zip |
Adding upstream version 3.38.1.upstream/3.38.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'build-aux/osx/build/modulesets/patches/gtk+')
3 files changed, 318 insertions, 0 deletions
diff --git a/build-aux/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch b/build-aux/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch new file mode 100644 index 0000000..b0a1ef5 --- /dev/null +++ b/build-aux/osx/build/modulesets/patches/gtk+/0006-Bug-658722-Drag-and-Drop-sometimes-stops-working.patch @@ -0,0 +1,274 @@ +From dcd9ab00c64a1df63fd5fa58c2ca25efd9b3e09e Mon Sep 17 00:00:00 2001 +From: John Ralls <jralls@ceridwen.us> +Date: Sat, 24 Sep 2011 18:14:09 -0700 +Subject: [PATCH 06/15] Bug 658722 - Drag and Drop sometimes stops working + +First, rather than assuming that there's already an event queued up if +_gdk_quartz_drag_source_context isn't NULL, assume that it just didn't get +cleaned up the last time it ran and abort it. + +This naturally requires implementing gdk_quartz_drag_abort(), so remove the +code from [GdkQuartzNSWindow draggedImage:endedAt:operation:] and move it to +gdkdnd_quartz.c as static void gdk_quartz_drag_end(). Implement both +gdk_quartz_drag_drop() and gdk_quartz_drag_abort() by calling +gdk_quartz_drag_end(). + +Next, try to get rid of the memory cycle between gtk_drag_source_info.context +and _gdk_quartz_drag_source_context (which carries the GtkQuartzDragSourceInfo +struct as qdata). Replace gtk_drag_source_clear_info() by using a +g_object_set_qdata_full() for context in gtk_drag_get_source_context, calling +gtk_drag_source_info_destroy() as the destructor. This eliminates the need to +queue a cleanup idle event. I use g_object_run_dispose() on +_gtk_quartz_drag_source_context to force the deletion of the info stored as +qdata, which in turn unrefs the info->context pointer. Ordinarily this gets +fired off from draggedImage:endedAt:operation:, meaning that the special +dragging CFRunLoop is complete and NSEvents are again flowing, so queuing a +cleanup event isn't necessary. The advantage is that it can also be run from +gdk_drag_abort, so if Gdk thinks there's a drag but CF doesn't all of the +memory still gets cleaned up. +--- + gdk/quartz/GdkQuartzWindow.c | 16 +------- + gdk/quartz/gdkdnd-quartz.c | 35 +++++++++++++-- + gtk/gtkdnd-quartz.c | 96 ++++++++++++++++------------------------- + 3 files changed, 69 insertions(+), 78 deletions(-) + +diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c +index dcd7250..20ed80e 100644 +--- a/gdk/quartz/GdkQuartzWindow.c ++++ b/gdk/quartz/GdkQuartzWindow.c +@@ -560,21 +560,7 @@ update_context_from_dragging_info (id <NSDraggingInfo> sender) + + - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation + { +- GdkEvent event; +- +- g_assert (_gdk_quartz_drag_source_context != NULL); +- +- event.dnd.type = GDK_DROP_FINISHED; +- event.dnd.window = g_object_ref ([[self contentView] gdkWindow]); +- event.dnd.send_event = FALSE; +- event.dnd.context = _gdk_quartz_drag_source_context; +- +- (*_gdk_event_func) (&event, _gdk_event_data); +- +- g_object_unref (event.dnd.window); +- +- g_object_unref (_gdk_quartz_drag_source_context); +- _gdk_quartz_drag_source_context = NULL; ++ gdk_drag_drop (_gdk_quartz_drag_source_context, (guint32)g_get_real_time()); + } + + @end +diff --git a/gdk/quartz/gdkdnd-quartz.c b/gdk/quartz/gdkdnd-quartz.c +index bb70b71..143a8ed 100644 +--- a/gdk/quartz/gdkdnd-quartz.c ++++ b/gdk/quartz/gdkdnd-quartz.c +@@ -111,11 +111,20 @@ GdkDragContext * + gdk_drag_begin (GdkWindow *window, + GList *targets) + { +- g_assert (_gdk_quartz_drag_source_context == NULL); ++ if (_gdk_quartz_drag_source_context != NULL) ++ { ++ /* Something is amiss with the existing drag, so log a message ++ and abort it */ ++ g_warning ("Drag begun with existing context; aborting the preexisting drag"); ++ gdk_drag_abort (_gdk_quartz_drag_source_context, ++ (guint32)g_get_real_time ()); ++ } ++ + + /* Create fake context */ + _gdk_quartz_drag_source_context = gdk_drag_context_new (); + _gdk_quartz_drag_source_context->is_source = TRUE; ++ _gdk_quartz_drag_source_context->source_window = window; + + return _gdk_quartz_drag_source_context; + } +@@ -155,20 +164,36 @@ gdk_drag_find_window_for_screen (GdkDragContext *context, + /* FIXME: Implement */ + } + ++static void ++gdk_quartz_drag_end (GdkDragContext *context) ++{ ++ GdkEvent event; ++ ++ g_assert (context != NULL); ++ event.dnd.type = GDK_DROP_FINISHED; ++ event.dnd.window = g_object_ref (context->source_window); ++ event.dnd.send_event = FALSE; ++ event.dnd.context = context; ++ ++ (*_gdk_event_func) (&event, _gdk_event_data); ++ ++ g_object_run_dispose (_gdk_quartz_drag_source_context); ++ _gdk_quartz_drag_source_context = NULL; ++} ++ + void + gdk_drag_drop (GdkDragContext *context, + guint32 time) + { +- /* FIXME: Implement */ ++ gdk_quartz_drag_end (context); + } + + void + gdk_drag_abort (GdkDragContext *context, + guint32 time) + { +- g_return_if_fail (context != NULL); +- +- /* FIXME: Implement */ ++ g_warning ("Gdk-quartz-drag-drop, aborting\n"); ++ gdk_quartz_drag_end (context); + } + + void +diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c +index 5688568..be92a22 100644 +--- a/gtk/gtkdnd-quartz.c ++++ b/gtk/gtkdnd-quartz.c +@@ -269,6 +269,39 @@ gtk_drag_dest_info_destroy (gpointer data) + g_free (info); + } + ++static void ++gtk_drag_source_info_destroy (GtkDragSourceInfo *info) ++{ ++ NSPasteboard *pasteboard; ++ NSAutoreleasePool *pool; ++ ++ if (info->icon_pixbuf) ++ g_object_unref (info->icon_pixbuf); ++ ++ g_signal_emit_by_name (info->widget, "drag-end", ++ info->context); ++ ++ if (info->source_widget) ++ g_object_unref (info->source_widget); ++ ++ if (info->widget) ++ g_object_unref (info->widget); ++ ++ gtk_target_list_unref (info->target_list); ++ ++ pool = [[NSAutoreleasePool alloc] init]; ++ ++ /* Empty the pasteboard, so that it will not accidentally access ++ * info->context after it has been destroyed. ++ */ ++ pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard]; ++ [pasteboard declareTypes: nil owner: nil]; ++ ++ [pool release]; ++ ++ g_free (info); ++} ++ + static GtkDragDestInfo * + gtk_drag_get_dest_info (GdkDragContext *context, + gboolean create) +@@ -308,18 +341,14 @@ gtk_drag_get_source_info (GdkDragContext *context, + { + info = g_new0 (GtkDragSourceInfo, 1); + info->context = context; +- g_object_set_qdata (G_OBJECT (context), dest_info_quark, info); ++ g_object_ref (info->context); ++ g_object_set_qdata_full (G_OBJECT (context), dest_info_quark, ++ info, gtk_drag_source_info_destroy); + } + + return info; + } + +-static void +-gtk_drag_clear_source_info (GdkDragContext *context) +-{ +- g_object_set_qdata (G_OBJECT (context), dest_info_quark, NULL); +-} +- + GtkWidget * + gtk_drag_get_source_widget (GdkDragContext *context) + { +@@ -1089,7 +1118,8 @@ gtk_drag_begin_idle (gpointer arg) + [owner release]; + [types release]; + +- if ((nswindow = get_toplevel_nswindow (info->source_widget)) == NULL) ++ if (info->source_widget == NULL ++ || (nswindow = get_toplevel_nswindow (info->source_widget)) == NULL) + return FALSE; + + /* Ref the context. It's unreffed when the drag has been aborted */ +@@ -1108,7 +1138,6 @@ gtk_drag_begin_idle (gpointer arg) + source:nswindow + slideBack:YES]; + +- [info->nsevent release]; + [drag_image release]; + + [pool release]; +@@ -1833,61 +1862,12 @@ gtk_drag_set_default_icon (GdkColormap *colormap, + } + + static void +-gtk_drag_source_info_destroy (GtkDragSourceInfo *info) +-{ +- NSPasteboard *pasteboard; +- NSAutoreleasePool *pool; +- +- if (info->icon_pixbuf) +- g_object_unref (info->icon_pixbuf); +- +- g_signal_emit_by_name (info->widget, "drag-end", +- info->context); +- +- if (info->source_widget) +- g_object_unref (info->source_widget); +- +- if (info->widget) +- g_object_unref (info->widget); +- +- gtk_target_list_unref (info->target_list); +- +- pool = [[NSAutoreleasePool alloc] init]; +- +- /* Empty the pasteboard, so that it will not accidentally access +- * info->context after it has been destroyed. +- */ +- pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard]; +- [pasteboard declareTypes: nil owner: nil]; +- +- [pool release]; +- +- gtk_drag_clear_source_info (info->context); +- g_object_unref (info->context); +- +- g_free (info); +- info = NULL; +-} +- +-static gboolean +-drag_drop_finished_idle_cb (gpointer data) +-{ +- gtk_drag_source_info_destroy (data); +- return FALSE; +-} +- +-static void + gtk_drag_drop_finished (GtkDragSourceInfo *info) + { + if (info->success && info->delete) + g_signal_emit_by_name (info->source_widget, "drag-data-delete", + info->context); + +- /* Workaround for the fact that the NS API blocks until the drag is +- * over. This way the context is still valid when returning from +- * drag_begin, even if it will still be quite useless. See bug #501588. +- */ +- g_idle_add (drag_drop_finished_idle_cb, info); + } + + /************************************************************* diff --git a/build-aux/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch b/build-aux/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch new file mode 100644 index 0000000..5b9153c --- /dev/null +++ b/build-aux/osx/build/modulesets/patches/gtk+/0008-Implement-GtkDragSourceOwner-pasteboardChangedOwner.patch @@ -0,0 +1,39 @@ +From 259563958047ccbf6f61578f2d724fc731218304 Mon Sep 17 00:00:00 2001 +From: John Ralls <jralls@ceridwen.us> +Date: Sun, 25 Sep 2011 12:03:54 -0700 +Subject: [PATCH 08/15] Implement GtkDragSourceOwner pasteboardChangedOwner: + +--- + gtk/gtkdnd-quartz.c | 11 +++++++++++ + 1 files changed, 11 insertions(+), 0 deletions(-) + +diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c +index 084aada..21ce11a 100644 +--- a/gtk/gtkdnd-quartz.c ++++ b/gtk/gtkdnd-quartz.c +@@ -149,6 +149,8 @@ struct _GtkDragFindData + guint target_info; + GtkSelectionData selection_data; + ++ g_return_if_fail(info->source_widget != NULL); ++ g_return_if_fail(info->target_list != NULL); + selection_data.selection = GDK_NONE; + selection_data.data = NULL; + selection_data.length = -1; +@@ -171,6 +173,15 @@ struct _GtkDragFindData + } + } + ++- (void)pasteboardChangedOwner: (NSPasteboard*)sender ++{ ++ if (!info) return; ++ ++ info->target_list = NULL; ++ info->widget = NULL; ++ info->source_widget = NULL; ++} ++ + - (id)initWithInfo:(GtkDragSourceInfo *)anInfo + { + self = [super init]; + diff --git a/build-aux/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch b/build-aux/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch new file mode 100644 index 0000000..26321b7 --- /dev/null +++ b/build-aux/osx/build/modulesets/patches/gtk+/gtk+-2-m4-creation.patch @@ -0,0 +1,5 @@ +diff -uN gtk+-2.24.21/m4/.bogus gtk+-2.24.21.save/m4/.bogus +--- gtk+-2.24.21/m4/.bogus 2013-10-02 08:01:33.000000000 -0700 ++++ gtk+-2.24.21.save/m4/.bogus 2013-10-02 08:03:40.000000000 -0700 +@@ -0,0 +1 @@ ++A phony file to enable making a patch to create this directory. |