mirror of
https://github.com/gryf/wmaker.git
synced 2026-01-03 04:14:20 +01:00
fix dropped data, add "" to crop filename.
This commit is contained in:
70
src/xdnd.c
70
src/xdnd.c
@@ -102,6 +102,9 @@ wXDNDProcessSelection(XEvent *event)
|
|||||||
char * delme;
|
char * delme;
|
||||||
XEvent xevent;
|
XEvent xevent;
|
||||||
Window selowner = XGetSelectionOwner(dpy,_XA_XdndSelection);
|
Window selowner = XGetSelectionOwner(dpy,_XA_XdndSelection);
|
||||||
|
WMBag *items;
|
||||||
|
|
||||||
|
|
||||||
XGetWindowProperty(dpy, event->xselection.requestor,
|
XGetWindowProperty(dpy, event->xselection.requestor,
|
||||||
_XA_WINDOWMAKER_XDNDEXCHANGE,
|
_XA_WINDOWMAKER_XDNDEXCHANGE,
|
||||||
0, 65536, True, atom_support, &ret_type, &ret_format,
|
0, 65536, True, atom_support, &ret_type, &ret_format,
|
||||||
@@ -121,22 +124,59 @@ wXDNDProcessSelection(XEvent *event)
|
|||||||
XSendEvent(dpy, selowner, 0, 0, &xevent);
|
XSendEvent(dpy, selowner, 0, 0, &xevent);
|
||||||
|
|
||||||
/*process dropping*/
|
/*process dropping*/
|
||||||
for (retain=scr->xdestring;retain[0];retain++) {
|
if (scr->xdestring) {
|
||||||
if (retain[0] < 32) retain[0] = 32;
|
int length, str_size;
|
||||||
if (!strncmp(retain, "file:", 5)) {
|
int total_size = 0;
|
||||||
int i;
|
char *tmp;
|
||||||
for (i=0;i<5;retain[i++]=' ');
|
|
||||||
|
items = WMCreateBag(1);
|
||||||
|
retain = wstrdup(scr->xdestring);
|
||||||
|
XFree(scr->xdestring); /* since xdestring was created by Xlib */
|
||||||
|
|
||||||
|
length = strlen(retain);
|
||||||
|
|
||||||
|
/* search in string */
|
||||||
|
while (length--) {
|
||||||
|
if (retain[length] == '\r') { /* useless char, nuke it */
|
||||||
|
retain[length] = 0;
|
||||||
|
}
|
||||||
|
if (retain[length] == '\n') {
|
||||||
|
str_size = strlen(&retain[length + 1]);
|
||||||
|
if(str_size) {
|
||||||
|
WMPutInBag(items, wstrdup(&retain[length + 1]));
|
||||||
|
total_size += str_size + 3; /* reserve for " \"\"" */
|
||||||
|
if (length)
|
||||||
|
WMAppendBag(items, WMCreateBag(1));
|
||||||
|
}
|
||||||
|
retain[length] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
/* final one */
|
||||||
retain = scr->xdestring;
|
WMPutInBag(items, wstrdup(retain));
|
||||||
if (scr->xdestring){
|
total_size += strlen(retain) + 3;
|
||||||
if (!strncmp(scr->xdestring, "file:", 5))
|
free(retain);
|
||||||
scr->xdestring+=5;
|
|
||||||
}
|
/* now pack new string */
|
||||||
wDockReceiveDNDDrop(scr,event);
|
scr->xdestring = wmalloc(total_size);
|
||||||
if (retain){
|
scr->xdestring[0]=0; /* empty string */
|
||||||
XFree(retain);
|
for(length = WMGetBagItemCount(items)-1; length >=0; length--) {
|
||||||
scr->xdestring = NULL;
|
tmp = WMGetFromBag(items, length);
|
||||||
|
if (!strncmp(tmp,"file:",5)) {
|
||||||
|
/* add more 2 chars while removing 5 is harmless */
|
||||||
|
strcat(scr->xdestring, " \"");
|
||||||
|
strcat(scr->xdestring, &tmp[5]);
|
||||||
|
strcat(scr->xdestring, "\"");
|
||||||
|
} else {
|
||||||
|
/* unsupport object, still need more " ? tell ]d */
|
||||||
|
strcat(scr->xdestring, &tmp[5]);
|
||||||
|
}
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
WMFreeBag(items);
|
||||||
|
wDockReceiveDNDDrop(scr,event);
|
||||||
|
printf("free ");
|
||||||
|
puts(scr->xdestring);
|
||||||
|
free(scr->xdestring); /* this xdestring is not from Xlib (no XFree) */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user