From 120df3b8b7092f9800a2ebf42cb4b698ef1f7269 Mon Sep 17 00:00:00 2001 From: Elliot Lee Date: Tue, 10 Mar 1998 21:57:05 +0000 Subject: [PATCH] DnD bugfixes (hopefully :). Rasters code is still buggy, methinks - try the dnd in testgtk --- gdk/gdk.c | 13 ++++++++++++- gdk/gdkdnd.c | 5 +++++ gdk/gdkglobals.c | 2 +- gdk/gdkprivate.h | 1 + gdk/x11/gdkdnd-x11.c | 5 +++++ gdk/x11/gdkglobals-x11.c | 2 +- gdk/x11/gdkmain-x11.c | 13 ++++++++++++- 7 files changed, 37 insertions(+), 4 deletions(-) diff --git a/gdk/gdk.c b/gdk/gdk.c index 16d43da2bf..1bffc2a285 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -2069,7 +2069,10 @@ gdk_event_translate (GdkEvent *event, /* XXX there has to be a better way to do this, perhaps with XTranslateCoordinates or XQueryTree - I don't know how, and this sort of works */ - static Window lastwin = None, curwin = None, twin; + static Window lastwin = None, curwin = None; +#if 0 + Window twin; +#endif Window childwin = gdk_root_window; int x, y, ox, oy; @@ -2083,6 +2086,13 @@ gdk_event_translate (GdkEvent *event, curwin = gdk_root_window; ox = x = xevent->xmotion.x_root; oy = y = xevent->xmotion.y_root; +#if 1 + curwin = gdk_window_xid_at_coords(xevent->xmotion.x_root, + xevent->xmotion.y_root, + gdk_dnd.c->xids); + XTranslateCoordinates(gdk_display, gdk_root_window, curwin, + x, y, &x, &y, &childwin); +#else while(childwin != None) { ox = x; oy = y; @@ -2095,6 +2105,7 @@ gdk_event_translate (GdkEvent *event, x, y, &x, &y, &twin); } } +#endif GDK_NOTE (DND, g_print("Drag is now in window %#lx, lastwin was %#lx, ddc = %#lx\n", curwin, lastwin, gdk_dnd.dnd_drag_curwin)); diff --git a/gdk/gdkdnd.c b/gdk/gdkdnd.c index 28900bbf5d..0b1c256b8b 100644 --- a/gdk/gdkdnd.c +++ b/gdk/gdkdnd.c @@ -26,6 +26,8 @@ gdk_dnd_set_drag_cursors(GdkCursor *default_cursor, GdkCursor *goahead_cursor) gdk_window_unref(gdk_dnd.c->drag_pm_ok); } gdk_dnd.c->drag_pm_default = gdk_dnd.c->drag_pm_ok = NULL; + g_list_free(gdk_dnd.c->xids); + gdk_dnd.c->xids = NULL; } gdk_dnd_display_drag_cursor(-1, -1, gdk_dnd.dnd_drag_target?TRUE:FALSE, @@ -41,6 +43,7 @@ gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin, { g_return_if_fail(default_pixmapwin != NULL); + g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL; if(gdk_dnd.c->drag_pm_default) gdk_window_unref(gdk_dnd.c->drag_pm_default); if(gdk_dnd.c->drag_pm_ok) @@ -51,9 +54,11 @@ gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin, gdk_window_ref(default_pixmapwin); gdk_dnd.c->drag_pm_default = default_pixmapwin; gdk_dnd.c->default_hotspot = *default_hotspot; + gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, ((GdkWindowPrivate *)default_pixmapwin)->xwindow); if(goahead_pixmapwin) { gdk_window_ref(goahead_pixmapwin); + gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, ((GdkWindowPrivate *)goahead_pixmapwin)->xwindow); gdk_dnd.c->drag_pm_ok = goahead_pixmapwin; gdk_dnd.c->ok_hotspot = *goahead_hotspot; } diff --git a/gdk/gdkglobals.c b/gdk/gdkglobals.c index e6644bb600..edfd89fd85 100644 --- a/gdk/gdkglobals.c +++ b/gdk/gdkglobals.c @@ -34,7 +34,7 @@ Atom gdk_wm_protocols; Atom gdk_wm_window_protocols[2]; Atom gdk_selection_property; GdkDndCursorInfo gdk_dnd_cursorinfo = {None, None, NULL, NULL, - {0,0}, {0,0}}; + {0,0}, {0,0}, NULL}; GdkDndGlobals gdk_dnd = {None,None,None, None,None,None, None, diff --git a/gdk/gdkprivate.h b/gdk/gdkprivate.h index 481811ef0c..65e9e7200f 100644 --- a/gdk/gdkprivate.h +++ b/gdk/gdkprivate.h @@ -146,6 +146,7 @@ struct _GdkDndCursorInfo { Cursor gdk_cursor_dragdefault, gdk_cursor_dragok; GdkWindow *drag_pm_default, *drag_pm_ok; GdkPoint default_hotspot, ok_hotspot; + GList *xids; }; typedef struct _GdkDndCursorInfo GdkDndCursorInfo; diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 28900bbf5d..0b1c256b8b 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -26,6 +26,8 @@ gdk_dnd_set_drag_cursors(GdkCursor *default_cursor, GdkCursor *goahead_cursor) gdk_window_unref(gdk_dnd.c->drag_pm_ok); } gdk_dnd.c->drag_pm_default = gdk_dnd.c->drag_pm_ok = NULL; + g_list_free(gdk_dnd.c->xids); + gdk_dnd.c->xids = NULL; } gdk_dnd_display_drag_cursor(-1, -1, gdk_dnd.dnd_drag_target?TRUE:FALSE, @@ -41,6 +43,7 @@ gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin, { g_return_if_fail(default_pixmapwin != NULL); + g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL; if(gdk_dnd.c->drag_pm_default) gdk_window_unref(gdk_dnd.c->drag_pm_default); if(gdk_dnd.c->drag_pm_ok) @@ -51,9 +54,11 @@ gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin, gdk_window_ref(default_pixmapwin); gdk_dnd.c->drag_pm_default = default_pixmapwin; gdk_dnd.c->default_hotspot = *default_hotspot; + gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, ((GdkWindowPrivate *)default_pixmapwin)->xwindow); if(goahead_pixmapwin) { gdk_window_ref(goahead_pixmapwin); + gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, ((GdkWindowPrivate *)goahead_pixmapwin)->xwindow); gdk_dnd.c->drag_pm_ok = goahead_pixmapwin; gdk_dnd.c->ok_hotspot = *goahead_hotspot; } diff --git a/gdk/x11/gdkglobals-x11.c b/gdk/x11/gdkglobals-x11.c index e6644bb600..edfd89fd85 100644 --- a/gdk/x11/gdkglobals-x11.c +++ b/gdk/x11/gdkglobals-x11.c @@ -34,7 +34,7 @@ Atom gdk_wm_protocols; Atom gdk_wm_window_protocols[2]; Atom gdk_selection_property; GdkDndCursorInfo gdk_dnd_cursorinfo = {None, None, NULL, NULL, - {0,0}, {0,0}}; + {0,0}, {0,0}, NULL}; GdkDndGlobals gdk_dnd = {None,None,None, None,None,None, None, diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 16d43da2bf..1bffc2a285 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -2069,7 +2069,10 @@ gdk_event_translate (GdkEvent *event, /* XXX there has to be a better way to do this, perhaps with XTranslateCoordinates or XQueryTree - I don't know how, and this sort of works */ - static Window lastwin = None, curwin = None, twin; + static Window lastwin = None, curwin = None; +#if 0 + Window twin; +#endif Window childwin = gdk_root_window; int x, y, ox, oy; @@ -2083,6 +2086,13 @@ gdk_event_translate (GdkEvent *event, curwin = gdk_root_window; ox = x = xevent->xmotion.x_root; oy = y = xevent->xmotion.y_root; +#if 1 + curwin = gdk_window_xid_at_coords(xevent->xmotion.x_root, + xevent->xmotion.y_root, + gdk_dnd.c->xids); + XTranslateCoordinates(gdk_display, gdk_root_window, curwin, + x, y, &x, &y, &childwin); +#else while(childwin != None) { ox = x; oy = y; @@ -2095,6 +2105,7 @@ gdk_event_translate (GdkEvent *event, x, y, &x, &y, &twin); } } +#endif GDK_NOTE (DND, g_print("Drag is now in window %#lx, lastwin was %#lx, ddc = %#lx\n", curwin, lastwin, gdk_dnd.dnd_drag_curwin));