added drag and drop
[wmaker-crm.git] / WINGs / dragdestination.c
blobecb13cb206e5378ffa2935018a59d268451e27f8
3 #include <X11/Xatom.h>
5 #include "WINGsP.h"
8 /* dropping */
10 typedef struct W_DNDTargetInfo {
11 /* data types accepted for drops */
12 Atom *dropTypes;
13 int dropTypeCount;
16 } DNDTargetInfo;
19 static Atom XDNDversion = XDND_VERSION;
22 static void
23 realizedObserver(void *self, WMNotification *notif)
25 WMView *view = (WMView*)WMGetNotificationObject(notif);
27 XChangeProperty(W_VIEW_SCREEN(view)->display, W_VIEW_DRAWABLE(view),
28 W_VIEW_SCREEN(view)->xdndAwareAtom,
29 XA_ATOM, 32, PropModeReplace,
30 (unsigned char*)&XDNDversion, 1);
32 WMRemoveNotificationObserver(self);
36 void
37 W_SetXdndAwareProperty(WMScreen *scr, WMView *view, Atom *types, int typeCount)
39 Display *dpy = scr->display;
41 view = W_TopLevelOfView(view);
43 if (!view->flags.xdndHintSet) {
44 view->flags.xdndHintSet = 1;
46 if (view->flags.realized) {
47 XChangeProperty(dpy, W_VIEW_DRAWABLE(view), scr->xdndAwareAtom,
48 XA_ATOM, 32, PropModeReplace,
49 (unsigned char*)&XDNDversion, 1);
50 } else {
51 WMAddNotificationObserver(realizedObserver,
52 /* just use as an id */
53 &view->dragDestinationProcs,
54 WMViewRealizedNotification,
55 view);
62 void
63 WMRegisterViewForDraggedTypes(WMView *view, char *acceptedTypes[])
65 Atom *types;
66 int typeCount;
67 int i;
69 typeCount = 0;
70 while (acceptedTypes[typeCount++]);
72 types = wmalloc(sizeof(Atom)*(typeCount+1));
74 for (i = 0; i < typeCount; i++) {
75 types[i] = XInternAtom(W_VIEW_SCREEN(view)->display,
76 acceptedTypes[i], False);
78 types[i] = 0;
80 view->droppableTypes = types;
82 W_SetXdndAwareProperty(W_VIEW_SCREEN(view), view, types, typeCount);
86 void
87 WMUnregisterViewDraggedTypes(WMView *view)
89 if (view->droppableTypes != NULL)
90 free(view->droppableTypes);
91 view->droppableTypes = NULL;
94 /***********************************************************************/
97 static unsigned defDraggingEntered(WMView *self, WMDraggingInfo *info)
99 return WDOperationNone;
102 static unsigned defDraggingUpdated(WMView *self, WMDraggingInfo *info)
104 return WDOperationNone;
107 static void defDraggingExited(WMView *self, WMDraggingInfo *info)
111 static char* defPrepareForDragOperation(WMView *self, WMDraggingInfo *info)
113 return NULL;
116 static Bool defPerformDragOperation(WMView *self, WMDraggingInfo *info,
117 WMData *data)
119 return False;
122 static void defConcludeDragOperation(WMView *self, WMDraggingInfo *info)
128 void
129 WMSetViewDragDestinationProcs(WMView *view, WMDragDestinationProcs *procs)
131 if (view->dragDestinationProcs == NULL) {
132 free(view->dragDestinationProcs);
133 view->dragDestinationProcs = wmalloc(sizeof(WMDragDestinationProcs));
135 *view->dragDestinationProcs = *procs;
137 /*XXX fill in non-implemented stuffs */
138 if (procs->draggingEntered == NULL) {
139 view->dragDestinationProcs->draggingEntered = defDraggingEntered;
141 if (procs->draggingUpdated == NULL) {
142 view->dragDestinationProcs->draggingUpdated = defDraggingUpdated;
144 if (procs->draggingExited == NULL) {
145 view->dragDestinationProcs->draggingExited = defDraggingExited;
147 if (procs->prepareForDragOperation == NULL) {
148 view->dragDestinationProcs->prepareForDragOperation =
149 defPrepareForDragOperation;
151 if (procs->performDragOperation == NULL) {
152 view->dragDestinationProcs->performDragOperation =
153 defPerformDragOperation;
155 if (procs->concludeDragOperation == NULL) {
156 view->dragDestinationProcs->concludeDragOperation =
157 defConcludeDragOperation;
167 WMPoint WMGetDraggingInfoImageLocation(WMDraggingInfo *info)
169 return info->imageLocation;