7 /* Nothing much here now, but we have to make a start some time ;-) */
10 gdk_dnd_set_drag_cursors(GdkCursor *default_cursor, GdkCursor *goahead_cursor)
12 gdk_dnd.c->gdk_cursor_dragdefault =
13 ((GdkCursorPrivate *)default_cursor)->xcursor;
14 gdk_dnd.c->gdk_cursor_dragok = ((GdkCursorPrivate *)goahead_cursor)->xcursor;
16 if(gdk_dnd.dnd_grabbed)
18 if(gdk_dnd.c->drag_pm_default)
19 /* We were displaying pixmaps for the drag */
21 gdk_window_hide(gdk_dnd.c->drag_pm_default);
22 gdk_window_unref(gdk_dnd.c->drag_pm_default);
23 if(gdk_dnd.c->drag_pm_ok)
25 gdk_window_hide(gdk_dnd.c->drag_pm_ok);
26 gdk_window_unref(gdk_dnd.c->drag_pm_ok);
28 gdk_dnd.c->drag_pm_default = gdk_dnd.c->drag_pm_ok = NULL;
29 g_list_free(gdk_dnd.c->xids);
30 gdk_dnd.c->xids = NULL;
32 gdk_dnd_display_drag_cursor(-1, -1,
33 gdk_dnd.dnd_drag_target?TRUE:FALSE,
39 gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin,
40 GdkPoint *default_hotspot,
41 GdkWindow *goahead_pixmapwin,
42 GdkPoint *goahead_hotspot)
44 g_return_if_fail(default_pixmapwin != NULL);
46 g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL;
47 if(gdk_dnd.c->drag_pm_default)
49 gdk_window_hide(gdk_dnd.c->drag_pm_default);
50 gdk_window_unref(gdk_dnd.c->drag_pm_default);
52 if(gdk_dnd.c->drag_pm_ok)
54 gdk_window_hide(gdk_dnd.c->drag_pm_ok);
55 gdk_window_unref(gdk_dnd.c->drag_pm_ok);
58 gdk_dnd.c->drag_pm_ok = NULL;
60 gdk_window_ref(default_pixmapwin);
61 gdk_dnd.c->drag_pm_default = default_pixmapwin;
62 gdk_dnd.c->default_hotspot = *default_hotspot;
63 gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_GPOINTER (((GdkWindowPrivate *)default_pixmapwin)->xwindow));
66 gdk_window_ref(goahead_pixmapwin);
67 gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_GPOINTER (((GdkWindowPrivate *)goahead_pixmapwin)->xwindow));
68 gdk_dnd.c->drag_pm_ok = goahead_pixmapwin;
69 gdk_dnd.c->ok_hotspot = *goahead_hotspot;
72 if(gdk_dnd.dnd_grabbed)
74 gdk_dnd_display_drag_cursor(-1, -1,
75 gdk_dnd.dnd_drag_target?TRUE:FALSE,
77 XChangeActivePointerGrab (gdk_display,
81 EnterWindowMask | LeaveWindowMask,
88 gdk_dnd_display_drag_cursor(gint x, gint y, gboolean drag_ok,
91 if(!gdk_dnd.dnd_grabbed)
94 if(gdk_dnd.c->drag_pm_default)
96 /* We're doing pixmaps here... */
97 GdkWindow *mypix, *opix;
103 if(x == -2 && y == -2) /* Hide the cursors */
105 gdk_window_hide(gdk_dnd.c->drag_pm_ok);
106 gdk_window_hide(gdk_dnd.c->drag_pm_default);
107 GDK_NOTE(DND, g_print("Hiding both drag cursors\n"));
111 if(x == -1 && y == -1) /* We're supposed to find it out for ourselves */
112 XQueryPointer(gdk_display, gdk_root_window,
113 &wtmp, &wtmp, &x, &y, &itmp, &itmp, &masktmp);
117 GDK_NOTE(DND, g_print("Switching to drag_ok cursor\n"));
118 mypix = gdk_dnd.c->drag_pm_ok;
119 opix = gdk_dnd.c->drag_pm_default;
120 myhotspot = &gdk_dnd.c->ok_hotspot;
124 GDK_NOTE(DND, g_print("Switching to drag_default cursor\n"));
125 mypix = gdk_dnd.c->drag_pm_default;
126 opix = gdk_dnd.c->drag_pm_ok;
127 myhotspot = &gdk_dnd.c->default_hotspot;
129 gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
132 GDK_NOTE(DND, g_print("Cursors switched, hide & show\n"));
133 gdk_window_hide(opix);
135 gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
138 gdk_window_show(mypix); /* There ought to be a way to know if
139 a window is already mapped etc. */
145 /* Move cursors around */
147 c = gdk_dnd.c->gdk_cursor_dragok;
149 c = gdk_dnd.c->gdk_cursor_dragdefault;
150 XChangeActivePointerGrab (gdk_display,
154 EnterWindowMask | LeaveWindowMask,