From 4ee2d1b6ba41519d6bc7d9f21f8dbc7afe638965 Mon Sep 17 00:00:00 2001 From: Richard Hult Date: Tue, 6 May 2008 21:00:06 +0000 Subject: [PATCH] Add private backend data to events, and handle it when copying/freeing 2008-05-06 Richard Hult * 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 | 14 ++++++++++++++ gdk/directfb/gdkevents-directfb.c | 11 +++++++++++ gdk/gdkevents.c | 5 +++++ gdk/gdkinternals.h | 5 +++++ gdk/quartz/gdkevents-quartz.c | 31 +++++++++++++++++++++++++++++++ gdk/win32/gdkevents-win32.c | 11 +++++++++++ gdk/x11/gdkevents-x11.c | 11 +++++++++++ 7 files changed, 88 insertions(+) diff --git a/ChangeLog b/ChangeLog index 63630e6ded..1181d1b88f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-05-06 Richard Hult + + * 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 * gdk/quartz/gdkmain-quartz.c (_gdk_windowing_init): Initalize diff --git a/gdk/directfb/gdkevents-directfb.c b/gdk/directfb/gdkevents-directfb.c index 490d17f1de..8a61942669 100644 --- a/gdk/directfb/gdkevents-directfb.c +++ b/gdk/directfb/gdkevents-directfb.c @@ -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" diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index b7b49b140a..6967f7df70 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -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); } diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index a52bef1d94..0e9111647e 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -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); diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 61a42bff8e..73815fe90f 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -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; + } +} diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 3f4fdd5547..389295d9ec 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -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) +{ +} diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index a537ffc75a..75e963ec77 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -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"