]> Pileus Git - ~andy/gtk/blob - gdk/x11/gdkdnd-x11.c
Miscellaneous minor fixes to remove ANSI C incompatibilities
[~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         }
30       gdk_dnd_display_drag_cursor(-1, -1,
31                                   gdk_dnd.dnd_drag_target?TRUE:FALSE,
32                                   TRUE);
33     }
34 }
35
36 void
37 gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin,
38                        GdkPoint *default_hotspot,
39                        GdkWindow *goahead_pixmapwin,
40                        GdkPoint *goahead_hotspot)
41 {
42   g_return_if_fail(default_pixmapwin != NULL);
43
44   if(gdk_dnd.c->drag_pm_default)
45     gdk_window_unref(gdk_dnd.c->drag_pm_default);
46   if(gdk_dnd.c->drag_pm_ok)
47     gdk_window_unref(gdk_dnd.c->drag_pm_ok);
48
49   gdk_dnd.c->drag_pm_ok = NULL;
50
51   gdk_window_ref(default_pixmapwin);
52   gdk_dnd.c->drag_pm_default = default_pixmapwin;
53   gdk_dnd.c->default_hotspot = *default_hotspot;
54   if(goahead_pixmapwin)
55     {
56       gdk_window_ref(goahead_pixmapwin);
57       gdk_dnd.c->drag_pm_ok = goahead_pixmapwin;
58       gdk_dnd.c->ok_hotspot = *goahead_hotspot;
59     }
60
61   if(gdk_dnd.dnd_grabbed)
62     {
63       gdk_dnd_display_drag_cursor(-1, -1,
64                                   gdk_dnd.dnd_drag_target?TRUE:FALSE,
65                                   TRUE);
66       XChangeActivePointerGrab (gdk_display,
67                                 ButtonMotionMask |
68                                 ButtonPressMask |
69                                 ButtonReleaseMask |
70                                 EnterWindowMask | LeaveWindowMask,
71                                 None,
72                                 CurrentTime);      
73     }
74 }
75
76 void
77 gdk_dnd_display_drag_cursor(gint x, gint y, gboolean drag_ok,
78                             gboolean change_made)
79 {
80   if(!gdk_dnd.dnd_grabbed)
81     return;
82
83   if(gdk_dnd.c->drag_pm_default)
84     {
85       /* We're doing pixmaps here... */
86       GdkWindow *mypix, *opix;
87       GdkPoint *myhotspot;
88       gint itmp;
89       guint masktmp;
90       Window wtmp;
91
92       if(x == -2 && y == -2) /* Hide the cursors */
93         {
94           gdk_window_hide(gdk_dnd.c->drag_pm_ok);
95           gdk_window_hide(gdk_dnd.c->drag_pm_default);
96           return;
97         }
98
99       if(x == -1 && y == -1) /* We're supposed to find it out for ourselves */
100         XQueryPointer(gdk_display, gdk_root_window,
101                       &wtmp, &wtmp, &x, &y, &itmp, &itmp, &masktmp);
102
103       if(drag_ok)
104         {
105           mypix = gdk_dnd.c->drag_pm_ok;
106           opix = gdk_dnd.c->drag_pm_default;
107           myhotspot = &gdk_dnd.c->ok_hotspot;
108         }
109       else
110         {
111           mypix = gdk_dnd.c->drag_pm_default;
112           opix = gdk_dnd.c->drag_pm_ok;
113           myhotspot = &gdk_dnd.c->default_hotspot;
114         }
115       if(change_made)
116         {
117           gdk_window_hide(opix);
118           gdk_window_show(mypix); /* There ought to be a way to know if
119                                      a window is already mapped etc. */
120         }
121       gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
122     }
123   else if(change_made)
124     {
125       Cursor c;
126       /* Move cursors around */
127       if(drag_ok)
128         c = gdk_dnd.c->gdk_cursor_dragok;
129       else
130         c = gdk_dnd.c->gdk_cursor_dragdefault;
131       XChangeActivePointerGrab (gdk_display,
132                                 ButtonMotionMask |
133                                 ButtonPressMask |
134                                 ButtonReleaseMask |
135                                 EnterWindowMask | LeaveWindowMask,
136                                 c,
137                                 CurrentTime);
138     }
139 }