From 443648028c081c490522e5a9a238733f6fc77e75 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 17 Jan 1998 23:24:09 +0000 Subject: [PATCH] Take putback events into account * gdk/gdk.c (gdk_events_pending): Take putback events into account * gdk/gdk.c (gdk_event_free): Handle dropdataavaible memory allocation correctly. (Incompatible change: client must _not_ fre event->data and event->data_type.) * gdk/gdk.c (gdk_event_translate): Changed DND dragging so that we don't ungrab pointer when we reenter window to prevent extra Enter/Leave effects which had bad effects. Changed drag zone handling to not send uncessary DragEnter events. Fixed EnterNotify/LeaveNotify handling. (Only pay attention to events on window, don't specify these events to XGrabPointer - that isn't valid, and handle reverse the sense of the handling of LeaveNotify.) * gdk/gdkwindow.c (gdk_window_remove_filter): Free removed filter. * gtk/gtk.defs (GdkFont): gdk_font_free => gdk_font_unref * gtk/gtkmain.{c,h} (gtk_events_pending): new function - apps should use this instead of gdk_events_pending. * gtk/gtkvbbox.h: Fixed a duplication in the headers. * gtk/testgtk.c (dnd_drop): Don't free the drop data, it belongs to the event. --- gdk/gdk.c | 214 +++++++++++++++++++++++----------------- gdk/gdkwindow.c | 1 + gdk/x11/gdkmain-x11.c | 214 +++++++++++++++++++++++----------------- gdk/x11/gdkwindow-x11.c | 1 + gtk/gtk.defs | 2 +- gtk/gtkmain.c | 13 ++- gtk/gtkmain.h | 1 + gtk/gtkvbbox.h | 2 +- gtk/testgtk.c | 3 - tests/testgtk.c | 3 - 10 files changed, 259 insertions(+), 195 deletions(-) diff --git a/gdk/gdk.c b/gdk/gdk.c index 4857bcc1f9..e7cc861643 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -602,7 +602,19 @@ gdk_set_locale () gint gdk_events_pending () { - return XPending (gdk_display); + gint result; + GList *tmp_list; + + result = XPending (gdk_display); + + tmp_list = putback_events; + while (tmp_list) + { + result++; + tmp_list = tmp_list->next; + } + + return result; } /* @@ -824,14 +836,30 @@ gdk_event_copy (GdkEvent *event) *new_event = *event; gdk_window_ref (new_event->any.window); - if ((event->any.type == GDK_KEY_PRESS) || - (event->any.type == GDK_KEY_RELEASE)) - new_event->key.string = g_strdup (event->key.string); + switch (event->any.type) + { + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + new_event->key.string = g_strdup (event->key.string); + break; - if (((event->any.type == GDK_ENTER_NOTIFY) || - (event->any.type == GDK_LEAVE_NOTIFY)) && - (event->crossing.subwindow != NULL)) - gdk_window_ref (event->crossing.subwindow); + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + if (event->crossing.subwindow != NULL) + gdk_window_ref (event->crossing.subwindow); + break; + + case GDK_DROP_DATA_AVAIL: + new_event->dropdataavailable.data_type = g_strdup (event->dropdataavailable.data_type); + new_event->dropdataavailable.data = g_malloc (event->dropdataavailable.data_numbytes); + memcpy (new_event->dropdataavailable.data, + event->dropdataavailable.data, + event->dropdataavailable.data_numbytes); + break; + + default: + break; + } return new_event; } @@ -860,17 +888,30 @@ gdk_event_free (GdkEvent *event) g_assert (event_chunk != NULL); g_return_if_fail (event != NULL); - if ((event->any.type == GDK_KEY_PRESS) || - (event->any.type == GDK_KEY_RELEASE)) - g_free (event->key.string); - if (event->any.window) gdk_window_unref (event->any.window); - if (((event->any.type == GDK_ENTER_NOTIFY) || - (event->any.type == GDK_LEAVE_NOTIFY)) && - (event->crossing.subwindow != NULL)) - gdk_window_unref (event->crossing.subwindow); + switch (event->any.type) + { + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + g_free (event->key.string); + break; + + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + if (event->crossing.subwindow != NULL) + gdk_window_unref (event->crossing.subwindow); + break; + + case GDK_DROP_DATA_AVAIL: + g_free (event->dropdataavailable.data_type); + g_free (event->dropdataavailable.data); + break; + + default: + break; + } g_mem_chunk_free (event_chunk, event); } @@ -1583,6 +1624,7 @@ gdk_event_translate (GdkEvent *event, dnd_drag_oldpos = {0,0}; static GdkRectangle dnd_drag_dropzone = {0,0,0,0}; static gint dnd_drag_perhaps = 0; + static gboolean dnd_grabbed = FALSE; static GdkWindowPrivate *real_sw = NULL; static Window dnd_drag_curwin = None, dnd_drag_target = None; @@ -1829,6 +1871,7 @@ gdk_event_translate (GdkEvent *event, gdk_dnd.drag_startwindows = NULL; } gdk_dnd.drag_numwindows = gdk_dnd.drag_really = 0; + dnd_grabbed = FALSE; { /* Set motion mask for first DnD'd window, since it @@ -1891,14 +1934,19 @@ gdk_event_translate (GdkEvent *event, XChangeWindowAttributes(gdk_display, real_sw->xwindow, CWEventMask, &attrs); } + + if (dnd_grabbed) + { + XUngrabPointer(gdk_display, CurrentTime); + dnd_grabbed = FALSE; + } + if(gdk_dnd.drag_really) { GdkPoint foo; foo.x = xevent->xbutton.x_root; foo.y = xevent->xbutton.y_root; - XUngrabPointer(gdk_display, CurrentTime); - if(dnd_drag_target != None) gdk_dnd_drag_end(dnd_drag_target, foo); gdk_dnd.drag_really = 0; @@ -1973,13 +2021,14 @@ gdk_event_translate (GdkEvent *event, oy = y = xevent->xmotion.y_root; while(childwin != None) { - ox = x; oy = y; - curwin = childwin; - XTranslateCoordinates(gdk_display, curwin, curwin, - x, y, &x, &y, &childwin); - if(childwin != None) { - XTranslateCoordinates(gdk_display, curwin, childwin, - x, y, &x, &y, &twin); + ox = x; oy = y; + curwin = childwin; + XTranslateCoordinates(gdk_display, curwin, curwin, + x, y, &x, &y, &childwin); + if(childwin != None) + { + XTranslateCoordinates(gdk_display, curwin, childwin, + x, y, &x, &y, &twin); } } #ifdef DEBUG_DND @@ -2003,8 +2052,7 @@ gdk_event_translate (GdkEvent *event, #endif XChangeActivePointerGrab(gdk_display, ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, + ButtonPressMask | ButtonReleaseMask, gdk_dnd.gdk_cursor_dragdefault, CurrentTime); } @@ -2013,23 +2061,28 @@ gdk_event_translate (GdkEvent *event, && curwin == dnd_drag_curwin) { /* Handle all that dropzone stuff - thanks John ;-) */ - if(dnd_drag_target != None - && IS_IN_ZONE(dnd_drag_oldpos.x, dnd_drag_oldpos.y) - && !IS_IN_ZONE(xevent->xmotion.x_root, - xevent->xmotion.y_root)) + if (dnd_drag_target != None) { - /* We were in the drop zone and moved out */ - dnd_drag_target = None; - gdk_dnd_drag_leave(curwin); - } - else - { - /* We were outside drop zone but in the window - - have to send enter events */ - gdk_dnd_drag_enter(curwin); - dnd_drag_curwin = curwin; - dnd_drag_dropzone.x = dnd_drag_dropzone.y = 0; - dnd_drag_target = None; + gboolean in_zone = IS_IN_ZONE(xevent->xmotion.x_root, + xevent->xmotion.y_root); + gboolean old_in_zone = IS_IN_ZONE(dnd_drag_oldpos.x, + dnd_drag_oldpos.y); + + if (!in_zone && old_in_zone) + { + /* We were in the drop zone and moved out */ + dnd_drag_target = None; + gdk_dnd_drag_leave(curwin); + } + else if (!in_zone && !old_in_zone) + { + /* We were outside drop zone but in the window + - have to send enter events */ + gdk_dnd_drag_enter(curwin); + dnd_drag_curwin = curwin; + dnd_drag_dropzone.x = dnd_drag_dropzone.y = 0; + dnd_drag_target = None; + } } } else dnd_drag_curwin = None; @@ -2094,25 +2147,13 @@ gdk_event_translate (GdkEvent *event, #ifdef DEBUG_DND if(dnd_drag_perhaps) { - g_print("We may[%d] have a drag into %#x = %#x\n", - gdk_dnd.drag_really, - xevent->xcrossing.window, real_sw->xwindow); + g_print("We may[%d] have a drag into %#x = %#x\n", + gdk_dnd.drag_really, + xevent->xcrossing.window, real_sw->xwindow); } #endif - if(dnd_drag_perhaps) { - if(!gdk_dnd.drag_really && xevent->xcrossing.window != real_sw->xwindow) - { - gdk_dnd_drag_addwindow((GdkWindow *) real_sw); - gdk_dnd_drag_begin((GdkWindow *) real_sw); - XGrabPointer(gdk_display, real_sw->xwindow, False, - ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, - GrabModeAsync, GrabModeAsync, gdk_root_window, - gdk_dnd.gdk_cursor_dragdefault, CurrentTime); - gdk_dnd.drag_really = 1; - } - else if(gdk_dnd.drag_really && xevent->xcrossing.window == real_sw->xwindow) + if (dnd_drag_perhaps && gdk_dnd.drag_really && + (xevent->xcrossing.window == real_sw->xwindow)) { gdk_dnd.drag_really = 0; #ifdef DEBUG_DND @@ -2121,12 +2162,13 @@ gdk_event_translate (GdkEvent *event, gdk_dnd.drag_numwindows = 0; g_free(gdk_dnd.drag_startwindows); gdk_dnd.drag_startwindows = NULL; - XUngrabPointer(gdk_display, CurrentTime); + /* We don't want to ungrab the pointer here, or we'll + * start getting spurious enter/leave events */ + XChangeActivePointerGrab (gdk_display, 0, None, CurrentTime); } - } - - return_val = window_private && !window_private->destroyed; - break; + + return_val = window_private && !window_private->destroyed; + break; case LeaveNotify: /* Print debugging info. @@ -2180,31 +2222,19 @@ gdk_event_translate (GdkEvent *event, xevent->xcrossing.window, real_sw->xwindow); } #endif - if(dnd_drag_perhaps) { - if(!gdk_dnd.drag_really && xevent->xcrossing.window != real_sw->xwindow) - { - gdk_dnd_drag_addwindow((GdkWindow *) real_sw); - gdk_dnd_drag_begin((GdkWindow *) real_sw); - XGrabPointer(gdk_display, real_sw->xwindow, False, - ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, - GrabModeAsync, GrabModeAsync, gdk_root_window, - gdk_dnd.gdk_cursor_dragdefault, CurrentTime); - gdk_dnd.drag_really = 1; - } - else if(gdk_dnd.drag_really && xevent->xcrossing.window == real_sw->xwindow) - { - gdk_dnd.drag_really = 0; -#ifdef DEBUG_DND - g_print("Ungrabbed\n"); -#endif - gdk_dnd.drag_numwindows = 0; - g_free(gdk_dnd.drag_startwindows); - gdk_dnd.drag_startwindows = NULL; - XUngrabPointer(gdk_display, CurrentTime); - } - } + if (dnd_drag_perhaps && !gdk_dnd.drag_really && + (xevent->xcrossing.window == real_sw->xwindow)) + { + gdk_dnd_drag_addwindow((GdkWindow *) real_sw); + gdk_dnd_drag_begin((GdkWindow *) real_sw); + XGrabPointer(gdk_display, real_sw->xwindow, False, + ButtonMotionMask | + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, gdk_root_window, + gdk_dnd.gdk_cursor_dragdefault, CurrentTime); + dnd_grabbed = TRUE; + gdk_dnd.drag_really = 1; + } return_val = window_private && !window_private->destroyed; break; @@ -2707,8 +2737,8 @@ gdk_event_translate (GdkEvent *event, event->dropdataavailable.data_numbytes); #endif event->dropdataavailable.data = - g_malloc(event->dropdataavailable.data_numbytes); - memcpy(event->dropdataavailable.data, + g_malloc (event->dropdataavailable.data_numbytes); + memcpy (event->dropdataavailable.data, tmp_charptr, event->dropdataavailable.data_numbytes); XFree(tmp_charptr); return_val = TRUE; diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 5b49830f83..f68eb02f90 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -1444,6 +1444,7 @@ gdk_window_remove_filter (GdkWindow *window, { private->filters = g_list_remove_link (private->filters, tmp_list); g_list_free_1 (tmp_list); + g_free (filter); return; } diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 4857bcc1f9..e7cc861643 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -602,7 +602,19 @@ gdk_set_locale () gint gdk_events_pending () { - return XPending (gdk_display); + gint result; + GList *tmp_list; + + result = XPending (gdk_display); + + tmp_list = putback_events; + while (tmp_list) + { + result++; + tmp_list = tmp_list->next; + } + + return result; } /* @@ -824,14 +836,30 @@ gdk_event_copy (GdkEvent *event) *new_event = *event; gdk_window_ref (new_event->any.window); - if ((event->any.type == GDK_KEY_PRESS) || - (event->any.type == GDK_KEY_RELEASE)) - new_event->key.string = g_strdup (event->key.string); + switch (event->any.type) + { + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + new_event->key.string = g_strdup (event->key.string); + break; - if (((event->any.type == GDK_ENTER_NOTIFY) || - (event->any.type == GDK_LEAVE_NOTIFY)) && - (event->crossing.subwindow != NULL)) - gdk_window_ref (event->crossing.subwindow); + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + if (event->crossing.subwindow != NULL) + gdk_window_ref (event->crossing.subwindow); + break; + + case GDK_DROP_DATA_AVAIL: + new_event->dropdataavailable.data_type = g_strdup (event->dropdataavailable.data_type); + new_event->dropdataavailable.data = g_malloc (event->dropdataavailable.data_numbytes); + memcpy (new_event->dropdataavailable.data, + event->dropdataavailable.data, + event->dropdataavailable.data_numbytes); + break; + + default: + break; + } return new_event; } @@ -860,17 +888,30 @@ gdk_event_free (GdkEvent *event) g_assert (event_chunk != NULL); g_return_if_fail (event != NULL); - if ((event->any.type == GDK_KEY_PRESS) || - (event->any.type == GDK_KEY_RELEASE)) - g_free (event->key.string); - if (event->any.window) gdk_window_unref (event->any.window); - if (((event->any.type == GDK_ENTER_NOTIFY) || - (event->any.type == GDK_LEAVE_NOTIFY)) && - (event->crossing.subwindow != NULL)) - gdk_window_unref (event->crossing.subwindow); + switch (event->any.type) + { + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + g_free (event->key.string); + break; + + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + if (event->crossing.subwindow != NULL) + gdk_window_unref (event->crossing.subwindow); + break; + + case GDK_DROP_DATA_AVAIL: + g_free (event->dropdataavailable.data_type); + g_free (event->dropdataavailable.data); + break; + + default: + break; + } g_mem_chunk_free (event_chunk, event); } @@ -1583,6 +1624,7 @@ gdk_event_translate (GdkEvent *event, dnd_drag_oldpos = {0,0}; static GdkRectangle dnd_drag_dropzone = {0,0,0,0}; static gint dnd_drag_perhaps = 0; + static gboolean dnd_grabbed = FALSE; static GdkWindowPrivate *real_sw = NULL; static Window dnd_drag_curwin = None, dnd_drag_target = None; @@ -1829,6 +1871,7 @@ gdk_event_translate (GdkEvent *event, gdk_dnd.drag_startwindows = NULL; } gdk_dnd.drag_numwindows = gdk_dnd.drag_really = 0; + dnd_grabbed = FALSE; { /* Set motion mask for first DnD'd window, since it @@ -1891,14 +1934,19 @@ gdk_event_translate (GdkEvent *event, XChangeWindowAttributes(gdk_display, real_sw->xwindow, CWEventMask, &attrs); } + + if (dnd_grabbed) + { + XUngrabPointer(gdk_display, CurrentTime); + dnd_grabbed = FALSE; + } + if(gdk_dnd.drag_really) { GdkPoint foo; foo.x = xevent->xbutton.x_root; foo.y = xevent->xbutton.y_root; - XUngrabPointer(gdk_display, CurrentTime); - if(dnd_drag_target != None) gdk_dnd_drag_end(dnd_drag_target, foo); gdk_dnd.drag_really = 0; @@ -1973,13 +2021,14 @@ gdk_event_translate (GdkEvent *event, oy = y = xevent->xmotion.y_root; while(childwin != None) { - ox = x; oy = y; - curwin = childwin; - XTranslateCoordinates(gdk_display, curwin, curwin, - x, y, &x, &y, &childwin); - if(childwin != None) { - XTranslateCoordinates(gdk_display, curwin, childwin, - x, y, &x, &y, &twin); + ox = x; oy = y; + curwin = childwin; + XTranslateCoordinates(gdk_display, curwin, curwin, + x, y, &x, &y, &childwin); + if(childwin != None) + { + XTranslateCoordinates(gdk_display, curwin, childwin, + x, y, &x, &y, &twin); } } #ifdef DEBUG_DND @@ -2003,8 +2052,7 @@ gdk_event_translate (GdkEvent *event, #endif XChangeActivePointerGrab(gdk_display, ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, + ButtonPressMask | ButtonReleaseMask, gdk_dnd.gdk_cursor_dragdefault, CurrentTime); } @@ -2013,23 +2061,28 @@ gdk_event_translate (GdkEvent *event, && curwin == dnd_drag_curwin) { /* Handle all that dropzone stuff - thanks John ;-) */ - if(dnd_drag_target != None - && IS_IN_ZONE(dnd_drag_oldpos.x, dnd_drag_oldpos.y) - && !IS_IN_ZONE(xevent->xmotion.x_root, - xevent->xmotion.y_root)) + if (dnd_drag_target != None) { - /* We were in the drop zone and moved out */ - dnd_drag_target = None; - gdk_dnd_drag_leave(curwin); - } - else - { - /* We were outside drop zone but in the window - - have to send enter events */ - gdk_dnd_drag_enter(curwin); - dnd_drag_curwin = curwin; - dnd_drag_dropzone.x = dnd_drag_dropzone.y = 0; - dnd_drag_target = None; + gboolean in_zone = IS_IN_ZONE(xevent->xmotion.x_root, + xevent->xmotion.y_root); + gboolean old_in_zone = IS_IN_ZONE(dnd_drag_oldpos.x, + dnd_drag_oldpos.y); + + if (!in_zone && old_in_zone) + { + /* We were in the drop zone and moved out */ + dnd_drag_target = None; + gdk_dnd_drag_leave(curwin); + } + else if (!in_zone && !old_in_zone) + { + /* We were outside drop zone but in the window + - have to send enter events */ + gdk_dnd_drag_enter(curwin); + dnd_drag_curwin = curwin; + dnd_drag_dropzone.x = dnd_drag_dropzone.y = 0; + dnd_drag_target = None; + } } } else dnd_drag_curwin = None; @@ -2094,25 +2147,13 @@ gdk_event_translate (GdkEvent *event, #ifdef DEBUG_DND if(dnd_drag_perhaps) { - g_print("We may[%d] have a drag into %#x = %#x\n", - gdk_dnd.drag_really, - xevent->xcrossing.window, real_sw->xwindow); + g_print("We may[%d] have a drag into %#x = %#x\n", + gdk_dnd.drag_really, + xevent->xcrossing.window, real_sw->xwindow); } #endif - if(dnd_drag_perhaps) { - if(!gdk_dnd.drag_really && xevent->xcrossing.window != real_sw->xwindow) - { - gdk_dnd_drag_addwindow((GdkWindow *) real_sw); - gdk_dnd_drag_begin((GdkWindow *) real_sw); - XGrabPointer(gdk_display, real_sw->xwindow, False, - ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, - GrabModeAsync, GrabModeAsync, gdk_root_window, - gdk_dnd.gdk_cursor_dragdefault, CurrentTime); - gdk_dnd.drag_really = 1; - } - else if(gdk_dnd.drag_really && xevent->xcrossing.window == real_sw->xwindow) + if (dnd_drag_perhaps && gdk_dnd.drag_really && + (xevent->xcrossing.window == real_sw->xwindow)) { gdk_dnd.drag_really = 0; #ifdef DEBUG_DND @@ -2121,12 +2162,13 @@ gdk_event_translate (GdkEvent *event, gdk_dnd.drag_numwindows = 0; g_free(gdk_dnd.drag_startwindows); gdk_dnd.drag_startwindows = NULL; - XUngrabPointer(gdk_display, CurrentTime); + /* We don't want to ungrab the pointer here, or we'll + * start getting spurious enter/leave events */ + XChangeActivePointerGrab (gdk_display, 0, None, CurrentTime); } - } - - return_val = window_private && !window_private->destroyed; - break; + + return_val = window_private && !window_private->destroyed; + break; case LeaveNotify: /* Print debugging info. @@ -2180,31 +2222,19 @@ gdk_event_translate (GdkEvent *event, xevent->xcrossing.window, real_sw->xwindow); } #endif - if(dnd_drag_perhaps) { - if(!gdk_dnd.drag_really && xevent->xcrossing.window != real_sw->xwindow) - { - gdk_dnd_drag_addwindow((GdkWindow *) real_sw); - gdk_dnd_drag_begin((GdkWindow *) real_sw); - XGrabPointer(gdk_display, real_sw->xwindow, False, - ButtonMotionMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask, - GrabModeAsync, GrabModeAsync, gdk_root_window, - gdk_dnd.gdk_cursor_dragdefault, CurrentTime); - gdk_dnd.drag_really = 1; - } - else if(gdk_dnd.drag_really && xevent->xcrossing.window == real_sw->xwindow) - { - gdk_dnd.drag_really = 0; -#ifdef DEBUG_DND - g_print("Ungrabbed\n"); -#endif - gdk_dnd.drag_numwindows = 0; - g_free(gdk_dnd.drag_startwindows); - gdk_dnd.drag_startwindows = NULL; - XUngrabPointer(gdk_display, CurrentTime); - } - } + if (dnd_drag_perhaps && !gdk_dnd.drag_really && + (xevent->xcrossing.window == real_sw->xwindow)) + { + gdk_dnd_drag_addwindow((GdkWindow *) real_sw); + gdk_dnd_drag_begin((GdkWindow *) real_sw); + XGrabPointer(gdk_display, real_sw->xwindow, False, + ButtonMotionMask | + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, gdk_root_window, + gdk_dnd.gdk_cursor_dragdefault, CurrentTime); + dnd_grabbed = TRUE; + gdk_dnd.drag_really = 1; + } return_val = window_private && !window_private->destroyed; break; @@ -2707,8 +2737,8 @@ gdk_event_translate (GdkEvent *event, event->dropdataavailable.data_numbytes); #endif event->dropdataavailable.data = - g_malloc(event->dropdataavailable.data_numbytes); - memcpy(event->dropdataavailable.data, + g_malloc (event->dropdataavailable.data_numbytes); + memcpy (event->dropdataavailable.data, tmp_charptr, event->dropdataavailable.data_numbytes); XFree(tmp_charptr); return_val = TRUE; diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 5b49830f83..f68eb02f90 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -1444,6 +1444,7 @@ gdk_window_remove_filter (GdkWindow *window, { private->filters = g_list_remove_link (private->filters, tmp_list); g_list_free_1 (tmp_list); + g_free (filter); return; } diff --git a/gtk/gtk.defs b/gtk/gtk.defs index 25d991ee73..3b3fd5aea8 100644 --- a/gtk/gtk.defs +++ b/gtk/gtk.defs @@ -375,7 +375,7 @@ (define-boxed GdkFont gdk_font_ref - gdk_font_free) + gdk_font_unref) (define-boxed GdkWindow gdk_window_ref diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 482712b1a8..342c1a0e68 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -222,9 +222,16 @@ gtk_main_quit () done = TRUE; } -gint gtk_main_iteration () +gint +gtk_events_pending (void) { - return gtk_main_iteration_do(TRUE); + return gdk_events_pending() + (next_event != NULL) ? 1 : 0; +} + +gint +gtk_main_iteration () +{ + return gtk_main_iteration_do (TRUE); } gint @@ -272,7 +279,7 @@ gtk_main_iteration_do (gboolean blocking) */ gtk_handle_timer (); - if(blocking) event = gdk_event_get (); + if (blocking) event = gdk_event_get (); } /* "gdk_event_get" can return FALSE if the timer goes off diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h index 708b2c1d68..9d1edb9436 100644 --- a/gtk/gtkmain.h +++ b/gtk/gtkmain.h @@ -34,6 +34,7 @@ void gtk_init (int *argc, char ***argv); void gtk_exit (gint error_code); gchar* gtk_set_locale (void); +gint gtk_events_pending (void); void gtk_main (void); guint gtk_main_level (void); void gtk_main_quit (void); diff --git a/gtk/gtkvbbox.h b/gtk/gtkvbbox.h index 310553d2ad..414956d2ce 100644 --- a/gtk/gtkvbbox.h +++ b/gtk/gtkvbbox.h @@ -54,7 +54,7 @@ GtkWidget *gtk_vbutton_box_new (void); gint gtk_vbutton_box_get_spacing_default (void); void gtk_vbutton_box_set_spacing_default (gint spacing); -void gtk_vbutton_box_set_spacing_default (gint spacing); +gint gtk_vbutton_box_get_layout_default (void); void gtk_vbutton_box_set_layout_default (gint layout); diff --git a/gtk/testgtk.c b/gtk/testgtk.c index b3bf187cf9..1fef0c4bbf 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -2591,9 +2591,6 @@ dnd_drop (GtkWidget *button, GdkEvent *event) gtk_widget_show(vbox); gtk_grab_add(window); gtk_widget_show(window); - - g_free (event->dropdataavailable.data); - g_free (event->dropdataavailable.data_type); } void diff --git a/tests/testgtk.c b/tests/testgtk.c index b3bf187cf9..1fef0c4bbf 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -2591,9 +2591,6 @@ dnd_drop (GtkWidget *button, GdkEvent *event) gtk_widget_show(vbox); gtk_grab_add(window); gtk_widget_show(window); - - g_free (event->dropdataavailable.data); - g_free (event->dropdataavailable.data_type); } void