[100934] trunk/dports/gnome/gtk2

cal at macports.org cal at macports.org
Tue Jan 1 10:39:05 PST 2013


Revision: 100934
          https://trac.macports.org/changeset/100934
Author:   cal at macports.org
Date:     2013-01-01 10:39:05 -0800 (Tue, 01 Jan 2013)
Log Message:
-----------
gtk2: fix regression resulting in easily reproducible crashes when using +quartz, closes #37330

You can probably revert this commit when updating gtk2.

Modified Paths:
--------------
    trunk/dports/gnome/gtk2/Portfile

Added Paths:
-----------
    trunk/dports/gnome/gtk2/files/gtkclipboard-quartz.patch

Modified: trunk/dports/gnome/gtk2/Portfile
===================================================================
--- trunk/dports/gnome/gtk2/Portfile	2013-01-01 16:39:52 UTC (rev 100933)
+++ trunk/dports/gnome/gtk2/Portfile	2013-01-01 18:39:05 UTC (rev 100934)
@@ -7,6 +7,7 @@
 
 name                gtk2
 version             2.24.14
+revision            1
 set branch          [join [lrange [split ${version} .] 0 1] .]
 categories          gnome x11
 license             LGPL-2+
@@ -33,7 +34,7 @@
 checksums           rmd160  80df2a4351f757d86c16ed19333a944a8214c8d6 \
                     sha256  8bd1b8b511a3004e8972badf467ce829e6855cdff15540b9344dc934c68008ac
 
-patchfiles          patch-gtk-builder-convert.diff patch-aliases.diff
+patchfiles          patch-gtk-builder-convert.diff patch-aliases.diff gtkclipboard-quartz.patch
 
 depends_build       port:pkgconfig \
                     port:perl5

Added: trunk/dports/gnome/gtk2/files/gtkclipboard-quartz.patch
===================================================================
--- trunk/dports/gnome/gtk2/files/gtkclipboard-quartz.patch	                        (rev 0)
+++ trunk/dports/gnome/gtk2/files/gtkclipboard-quartz.patch	2013-01-01 18:39:05 UTC (rev 100934)
@@ -0,0 +1,153 @@
+From 4a8df7a33c298d22bf78b947d0e861fc03ec70e1 Mon Sep 17 00:00:00 2001
+From: Michael Natterer <mitch at lanedo.com>
+Date: Fri, 07 Dec 2012 11:19:52 +0000
+Subject: quartz: fix crash in the recent clipboard "fix", and really fix it
+
+We must not release the GtkClipboardOwner in pasteboardChangedOwner
+becaue we don't own a reference to ourselves (NSPasteboard does).
+Instead, release the owner right after setting it, transferring
+ownership to NSPasteboard
+
+Also, fix repeated setting of the same owner by keeping the
+owner around in GtkCLipboard, and re-use it if "user_data"
+doesn't change. To avoid clipboard_unset()ting our own contents
+in the process, add an ugly "setting_same_owner" boolean to
+GtkClipboardOwner, set it during re-setting the same owner,
+and avoid calling clipboard_unset() from pasteboardChangedOwner
+if it's TRUE.
+---
+(limited to 'gtk/gtkclipboard-quartz.c')
+
+diff --git gtk/gtkclipboard-quartz.c gtk/gtkclipboard-quartz.c
+index 743f037..14b0974 100644
+--- gtk/gtkclipboard-quartz.c
++++ gtk/gtkclipboard-quartz.c
+@@ -39,6 +39,14 @@ enum {
+   LAST_SIGNAL
+ };
+ 
++ at interface GtkClipboardOwner : NSObject {
++  GtkClipboard *clipboard;
++  @public
++  gboolean setting_same_owner;
++}
++
++ at end
++
+ typedef struct _GtkClipboardClass GtkClipboardClass;
+ 
+ struct _GtkClipboard 
+@@ -46,6 +54,7 @@ struct _GtkClipboard
+   GObject parent_instance;
+ 
+   NSPasteboard *pasteboard;
++  GtkClipboardOwner *owner;
+   NSInteger change_count;
+ 
+   GdkAtom selection;
+@@ -88,12 +96,6 @@ static GtkClipboard *clipboard_peek       (GdkDisplay       *display,
+ 					   GdkAtom           selection,
+ 					   gboolean          only_if_exists);
+ 
+- at interface GtkClipboardOwner : NSObject {
+-  GtkClipboard *clipboard;
+-}
+-
+- at end
+-
+ @implementation GtkClipboardOwner
+ -(void)pasteboard:(NSPasteboard *)sender provideDataForType:(NSString *)type
+ {
+@@ -132,9 +135,8 @@ static GtkClipboard *clipboard_peek       (GdkDisplay       *display,
+  */
+ - (void)pasteboardChangedOwner:(NSPasteboard *)sender
+ {
+-  clipboard_unset (clipboard);
+-
+-  [self release];
++  if (! setting_same_owner)
++    clipboard_unset (clipboard);
+ }
+ 
+ - (id)initWithClipboard:(GtkClipboard *)aClipboard
+@@ -144,6 +146,7 @@ static GtkClipboard *clipboard_peek       (GdkDisplay       *display,
+   if (self) 
+     {
+       clipboard = aClipboard;
++      setting_same_owner = FALSE;
+     }
+ 
+   return self;
+@@ -334,10 +337,6 @@ gtk_clipboard_set_contents (GtkClipboard         *clipboard,
+   NSSet *types;
+   NSAutoreleasePool *pool;
+ 
+-  pool = [[NSAutoreleasePool alloc] init];
+-
+-  owner = [[GtkClipboardOwner alloc] initWithClipboard:clipboard];
+-
+   if (!(clipboard->have_owner && have_owner) ||
+       clipboard->user_data != user_data)
+     {
+@@ -352,26 +351,44 @@ gtk_clipboard_set_contents (GtkClipboard         *clipboard,
+               clipboard->user_data != user_data)
+             {
+               (*clear_func) (clipboard, user_data);
+-              [pool release];
+               return FALSE;
+             }
+           else
+             {
+-              [pool release];
+               return TRUE;
+             }
+         }
+     }
+ 
++  pool = [[NSAutoreleasePool alloc] init];
++
++  types = _gtk_quartz_target_entries_to_pasteboard_types (targets, n_targets);
++
+   /*  call declareTypes before setting the clipboard members because
+    *  declareTypes might clear the clipboard
+    */
+-  types = _gtk_quartz_target_entries_to_pasteboard_types (targets, n_targets);
+-  clipboard->change_count = [clipboard->pasteboard declareTypes: [types allObjects]
+-                                                          owner: owner];
++  if (user_data && user_data == clipboard->user_data)
++    {
++      owner = [clipboard->owner retain];
++
++      owner->setting_same_owner = TRUE;
++      clipboard->change_count = [clipboard->pasteboard declareTypes: [types allObjects]
++                                                              owner: owner];
++      owner->setting_same_owner = FALSE;
++    }
++  else
++    {
++      owner = [[GtkClipboardOwner alloc] initWithClipboard:clipboard];
++
++      clipboard->change_count = [clipboard->pasteboard declareTypes: [types allObjects]
++                                                              owner: owner];
++    }
++
++  [owner release];
+   [types release];
+   [pool release];
+ 
++  clipboard->owner = owner;
+   clipboard->user_data = user_data;
+   clipboard->have_owner = have_owner;
+   if (have_owner)
+@@ -460,7 +477,8 @@ clipboard_unset (GtkClipboard *clipboard)
+   clipboard->n_storable_targets = -1;
+   g_free (clipboard->storable_targets);
+   clipboard->storable_targets = NULL;
+-      
++
++  clipboard->owner = NULL;
+   clipboard->get_func = NULL;
+   clipboard->clear_func = NULL;
+   clipboard->user_data = NULL;
+--
+cgit v0.9.0.2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20130101/0a4c7232/attachment.html>


More information about the macports-changes mailing list