[gtk+] Deal gracefully with unowned selections



commit b52db73f59dc72dd81a01a323893a738303a775d
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jan 31 19:35:51 2011 -0500

    Deal gracefully with unowned selections
    
    If a selection looses its owner without a replacement, owner is
    None, which we did not handle very well.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=641042

 gdk/gdkevents.c          |    7 +++++--
 gdk/gdkevents.h          |   14 +++++++-------
 gdk/x11/gdkdisplay-x11.c |    7 +++++--
 3 files changed, 17 insertions(+), 11 deletions(-)
---
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index 66a14ec..cf60349 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -568,7 +568,9 @@ gdk_event_copy (const GdkEvent *event)
       break;
 
     case GDK_OWNER_CHANGE:
-      new_event->owner_change.owner = g_object_ref (event->owner_change.owner);
+      new_event->owner_change.owner = event->owner_change.owner;
+      if (new_event->owner_change.owner)
+        g_object_ref (new_event->owner_change.owner);
       break;
 
     default:
@@ -641,7 +643,8 @@ gdk_event_free (GdkEvent *event)
       break;
       
     case GDK_OWNER_CHANGE:
-      g_object_unref (event->owner_change.owner);
+      if (event->owner_change.owner)
+        g_object_unref (event->owner_change.owner);
       break;
 
     default:
diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h
index 4902601..91a5c8e 100644
--- a/gdk/gdkevents.h
+++ b/gdk/gdkevents.h
@@ -819,15 +819,15 @@ struct _GdkEventSelection
 /**
  * GdkEventOwnerChange:
  * @type: the type of the event (%GDK_OWNER_CHANGE).
- * @window: the window which received the event.
+ * @window: the window which received the event
  * @send_event: %TRUE if the event was sent explicitly (e.g. using
- *   <function>XSendEvent</function>).
- * @owner: the new owner of the selection.
- * @reason: the reason for the ownership change as a #GdkOwnerChange value.
- * @selection: the atom identifying the selection.
- * @time: the timestamp of the event.
+ *   <function>XSendEvent</function>)
+ * @owner: the new owner of the selection, or %NULL if there is none
+ * @reason: the reason for the ownership change as a #GdkOwnerChange value
+ * @selection: the atom identifying the selection
+ * @time: the timestamp of the event
  * @selection_time: the time at which the selection ownership was taken
- *   over.
+ *   over
  *
  * Generated when the owner of a selection changes. On X11, this
  * information is only available if the X server supports the XFIXES
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 20735cc..23dd567 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -919,8 +919,11 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
 	  
 	  event->owner_change.type = GDK_OWNER_CHANGE;
 	  event->owner_change.window = window;
-	  event->owner_change.owner = gdk_x11_window_foreign_new_for_display (display,
-                                                                              selection_notify->owner);
+          if (selection_notify->owner != None)
+            event->owner_change.owner = gdk_x11_window_foreign_new_for_display (display,
+                                                                                selection_notify->owner);
+          else
+            event->owner_change.owner = NULL;
 	  event->owner_change.reason = selection_notify->subtype;
 	  event->owner_change.selection = 
 	    gdk_x11_xatom_to_atom_for_display (display, 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]