]> Pileus Git - ~andy/gtk/commitdiff
Add private backend data to events, and handle it when copying/freeing
authorRichard Hult <richard@imendio.com>
Tue, 6 May 2008 21:00:06 +0000 (21:00 +0000)
committerRichard Hult <rhult@src.gnome.org>
Tue, 6 May 2008 21:00:06 +0000 (21:00 +0000)
2008-05-06  Richard Hult  <richard@imendio.com>

* gdk/gdkevents.c: (gdk_event_copy), (gdk_event_free):
* gdk/gdkinternals.h: Add private backend data to events, and
handle it when copying/freeing events. Currently only needed in
the quartz backend.

* gdk/directfb/gdkevents-directfb.c:
* gdk/quartz/gdkevents-quartz.c:
* gdk/win32/gdkevents-win32.c:
* gdk/x11/gdkevents-x11.c: (_gdk_windowing_event_data_copy)
(_gdk_windowing_event_data_free): Add stubs for X11, win32 and
directfb. Implement for quartz. Part of fixing bug #473822.

svn path=/trunk/; revision=20078

ChangeLog
gdk/directfb/gdkevents-directfb.c
gdk/gdkevents.c
gdk/gdkinternals.h
gdk/quartz/gdkevents-quartz.c
gdk/win32/gdkevents-win32.c
gdk/x11/gdkevents-x11.c

index 63630e6ded07b71cf0b27d9c1d1131f971cffb17..1181d1b88f2fa8709cbe54a033194773daaa71e0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-05-06  Richard Hult  <richard@imendio.com>
+
+       * gdk/gdkevents.c: (gdk_event_copy), (gdk_event_free):
+       * gdk/gdkinternals.h: Add private backend data to events, and
+       handle it when copying/freeing events. Currently only needed in
+       the quartz backend.
+
+       * gdk/directfb/gdkevents-directfb.c:
+       * gdk/quartz/gdkevents-quartz.c:
+       * gdk/win32/gdkevents-win32.c:
+       * gdk/x11/gdkevents-x11.c: (_gdk_windowing_event_data_copy)
+       (_gdk_windowing_event_data_free): Add stubs for X11, win32 and
+       directfb. Implement for quartz. Part of fixing bug #473822.
+
 2008-05-05  Richard Hult  <richard@imendio.com>
 
        * gdk/quartz/gdkmain-quartz.c (_gdk_windowing_init): Initalize
index 490d17f1dec9f19ed445fe1ceabc895e290d70c5..8a61942669bbe35933e03861b51f7b2a75ace187 100644 (file)
@@ -961,5 +961,16 @@ gdk_net_wm_supports (GdkAtom property)
    return FALSE;
 }
 
+void
+_gdk_windowing_event_data_copy (GdkEvent *dst,
+                                GdkEvent *src)
+{
+}
+
+void
+_gdk_windowing_event_data_free (GdkEvent *event)
+{
+}
+
 #define __GDK_EVENTS_X11_C__
 #include "gdkaliasdef.c"
index b7b49b140a79f728a0763bc8184886f95897b575..6967f7df709f8854faf8dd0f5e4ca22b629853e6 100644 (file)
@@ -420,6 +420,9 @@ gdk_event_copy (const GdkEvent *event)
     default:
       break;
     }
+
+  if (gdk_event_is_allocated (event))
+    _gdk_windowing_event_data_copy (new_event, event);
   
   return new_event;
 }
@@ -485,6 +488,8 @@ gdk_event_free (GdkEvent *event)
       break;
     }
 
+  _gdk_windowing_event_data_free (event);
+
   g_hash_table_remove (event_hash, event);
   g_slice_free (GdkEventPrivate, (GdkEventPrivate*) event);
 }
index a52bef1d94cb509e2bdc69ab4f8b73f337329275..0e9111647e46f1736ea48fce1165f5e4fee3c3f3 100644 (file)
@@ -166,6 +166,7 @@ struct _GdkEventPrivate
   GdkEvent   event;
   guint      flags;
   GdkScreen *screen;
+  gpointer   windowing_data;
 };
 
 extern GdkEventFunc   _gdk_event_func;    /* Callback for events */
@@ -188,6 +189,10 @@ GList*  _gdk_event_queue_append     (GdkDisplay *display,
 void _gdk_event_button_generate     (GdkDisplay *display,
                                     GdkEvent   *event);
 
+void _gdk_windowing_event_data_copy (GdkEvent   *dst,
+                                     GdkEvent   *src);
+void _gdk_windowing_event_data_free (GdkEvent   *event);
+
 void gdk_synthesize_window_state (GdkWindow     *window,
                                   GdkWindowState unset_flags,
                                   GdkWindowState set_flags);
index 61a42bff8e257de48e843e4bdc25fac4ebb5920e..73815fe90fd3f6d2adbbf322084e3c81d59ee7fe 100644 (file)
@@ -1554,10 +1554,15 @@ create_key_event (GdkWindow    *window,
                   GdkEventType  type)
 {
   GdkEvent *event;
+  GdkEventPrivate *priv;
   gchar buf[7];
   gunichar c = 0;
 
   event = gdk_event_new (type);
+
+  priv = (GdkEventPrivate *) event;
+  priv->windowing_data = [nsevent retain];
+
   event->key.window = window;
   event->key.time = get_time_from_ns_event (nsevent);
   event->key.state = get_keyboard_modifiers_from_ns_event (nsevent);
@@ -2038,3 +2043,29 @@ gdk_screen_get_setting (GdkScreen   *screen,
 
   return FALSE;
 }
+
+void
+_gdk_windowing_event_data_copy (GdkEvent *dst,
+                                GdkEvent *src)
+{
+  GdkEventPrivate *priv_dst = (GdkEventPrivate *) dst;
+  GdkEventPrivate *priv_src = (GdkEventPrivate *) src;
+
+  if (priv_src->windowing_data)
+    {
+      priv_dst->windowing_data = priv_src->windowing_data;
+      [(NSEvent *)priv_dst->windowing_data retain];
+    }
+}
+
+void
+_gdk_windowing_event_data_free (GdkEvent *event)
+{
+  GdkEventPrivate *priv = (GdkEventPrivate *) event;
+
+  if (priv->windowing_data)
+    {
+      [(NSEvent *)priv->windowing_data release];
+      priv->windowing_data = NULL;
+    }
+}
index 3f4fdd554755b62e1af0e072dcbf6b0f2eb07ac0..389295d9ecf7c3ee0de776db198b05d345433d7e 100644 (file)
@@ -3652,3 +3652,14 @@ gdk_net_wm_supports (GdkAtom property)
 {
   return FALSE;
 }
+
+void
+_gdk_windowing_event_data_copy (GdkEvent *dst,
+                                GdkEvent *src)
+{
+}
+
+void
+_gdk_windowing_event_data_free (GdkEvent *event)
+{
+}
index a537ffc75a65936479e32dc29fe2f87141adbc52..75e963ec77a29b2b9b9c6843e89af15833350aa2 100644 (file)
@@ -3085,5 +3085,16 @@ gdk_xsettings_watch_cb (Window   window,
   return True;
 }
 
+void
+_gdk_windowing_event_data_copy (GdkEvent *dst,
+                                GdkEvent *src)
+{
+}
+
+void
+_gdk_windowing_event_data_free (GdkEvent *event)
+{
+}
+
 #define __GDK_EVENTS_X11_C__
 #include "gdkaliasdef.c"