]> Pileus Git - ~andy/gtk/blob - gdk/x11/gdkdnd-x11.c
A few more GPOINTER_TO_UINT fixes.
[~andy/gtk] / gdk / x11 / gdkdnd-x11.c
1 #include <X11/Xlib.h>
2 #include <X11/Xatom.h>
3 #include <string.h>
4 #include "gdkx.h"
5 #include "gdk.h"
6
7 /* Nothing much here now, but we have to make a start some time ;-) */
8
9 void
10 gdk_dnd_set_drag_cursors(GdkCursor *default_cursor, GdkCursor *goahead_cursor)
11 {
12   gdk_dnd.c->gdk_cursor_dragdefault =
13     ((GdkCursorPrivate *)default_cursor)->xcursor;
14   gdk_dnd.c->gdk_cursor_dragok = ((GdkCursorPrivate *)goahead_cursor)->xcursor;
15
16   if(gdk_dnd.dnd_grabbed)
17     {
18       if(gdk_dnd.c->drag_pm_default)
19         /* We were displaying pixmaps for the drag */
20         {
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)
24             {
25               gdk_window_hide(gdk_dnd.c->drag_pm_ok);
26               gdk_window_unref(gdk_dnd.c->drag_pm_ok);
27             }
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;
31         }
32       gdk_dnd_display_drag_cursor(-1, -1,
33                                   gdk_dnd.dnd_drag_target?TRUE:FALSE,
34                                   TRUE);
35     }
36 }
37
38 void
39 gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin,
40                        GdkPoint *default_hotspot,
41                        GdkWindow *goahead_pixmapwin,
42                        GdkPoint *goahead_hotspot)
43 {
44   g_return_if_fail(default_pixmapwin != NULL);
45
46   g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL;
47   if(gdk_dnd.c->drag_pm_default)
48     {
49       gdk_window_hide(gdk_dnd.c->drag_pm_default);
50       gdk_window_unref(gdk_dnd.c->drag_pm_default);
51     }
52   if(gdk_dnd.c->drag_pm_ok)
53     {
54       gdk_window_hide(gdk_dnd.c->drag_pm_ok);
55       gdk_window_unref(gdk_dnd.c->drag_pm_ok);
56     }
57
58   gdk_dnd.c->drag_pm_ok = NULL;
59
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));
64   if(goahead_pixmapwin)
65     {
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;
70     }
71
72   if(gdk_dnd.dnd_grabbed)
73     {
74       gdk_dnd_display_drag_cursor(-1, -1,
75                                   gdk_dnd.dnd_drag_target?TRUE:FALSE,
76                                   TRUE);
77       XChangeActivePointerGrab (gdk_display,
78                                 ButtonMotionMask |
79                                 ButtonPressMask |
80                                 ButtonReleaseMask |
81                                 EnterWindowMask | LeaveWindowMask,
82                                 None,
83                                 CurrentTime);      
84     }
85 }
86
87 void
88 gdk_dnd_display_drag_cursor(gint x, gint y, gboolean drag_ok,
89                             gboolean change_made)
90 {
91   if(!gdk_dnd.dnd_grabbed)
92     return;
93
94   if(gdk_dnd.c->drag_pm_default)
95     {
96       /* We're doing pixmaps here... */
97       GdkWindow *mypix, *opix;
98       GdkPoint *myhotspot;
99       gint itmp;
100       guint masktmp;
101       Window wtmp;
102
103       if(x == -2 && y == -2) /* Hide the cursors */
104         {
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"));
108           return;
109         }
110
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);
114  
115       if(drag_ok)
116         {
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;
121         }
122       else
123         {
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;
128         }
129       gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
130       if(change_made)
131         {
132           GDK_NOTE(DND, g_print("Cursors switched, hide & show\n"));
133           gdk_window_hide(opix);
134         }
135       gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
136       if (change_made)
137         {
138           gdk_window_show(mypix); /* There ought to be a way to know if
139                                      a window is already mapped etc. */
140         }      
141     }
142   else if(change_made)
143     {
144       Cursor c;
145       /* Move cursors around */
146       if(drag_ok)
147         c = gdk_dnd.c->gdk_cursor_dragok;
148       else
149         c = gdk_dnd.c->gdk_cursor_dragdefault;
150       XChangeActivePointerGrab (gdk_display,
151                                 ButtonMotionMask |
152                                 ButtonPressMask |
153                                 ButtonReleaseMask |
154                                 EnterWindowMask | LeaveWindowMask,
155                                 c,
156                                 CurrentTime);
157     }
158 }