]> Pileus Git - ~andy/gtk/blob - gdk/x11/gdkdnd-x11.c
new functions for setting WM hints
[~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       Window wtmp;
90
91       if(x == -2 && y == -2) /* Hide the cursors */
92         {
93           gdk_window_hide(gdk_dnd.c->drag_pm_ok);
94           gdk_window_hide(gdk_dnd.c->drag_pm_default);
95           return;
96         }
97
98       if(x == -1 && y == -1) /* We're supposed to find it out for ourselves */
99         XQueryPointer(gdk_display, gdk_root_window,
100                       &wtmp, &wtmp, &x, &y, &itmp, &itmp, &itmp);
101
102       if(drag_ok)
103         {
104           mypix = gdk_dnd.c->drag_pm_ok;
105           opix = gdk_dnd.c->drag_pm_default;
106           myhotspot = &gdk_dnd.c->ok_hotspot;
107         }
108       else
109         {
110           mypix = gdk_dnd.c->drag_pm_default;
111           opix = gdk_dnd.c->drag_pm_ok;
112           myhotspot = &gdk_dnd.c->default_hotspot;
113         }
114       if(change_made)
115         {
116           gdk_window_hide(opix);
117           gdk_window_show(mypix); /* There ought to be a way to know if
118                                      a window is already mapped etc. */
119         }
120       gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
121     }
122   else if(change_made)
123     {
124       Cursor c;
125       /* Move cursors around */
126       if(drag_ok)
127         c = gdk_dnd.c->gdk_cursor_dragok;
128       else
129         c = gdk_dnd.c->gdk_cursor_dragdefault;
130       XChangeActivePointerGrab (gdk_display,
131                                 ButtonMotionMask |
132                                 ButtonPressMask |
133                                 ButtonReleaseMask |
134                                 EnterWindowMask | LeaveWindowMask,
135                                 c,
136                                 CurrentTime);
137     }
138 }