mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
misc update relates to xdnd.
This commit is contained in:
22
src/event.c
22
src/event.c
@@ -436,27 +436,7 @@ saveTimestamp(XEvent *event)
|
||||
case SelectionNotify:
|
||||
LastTimestamp = event->xselection.time;
|
||||
#ifdef XDND
|
||||
wXDNDProcessSelection(&event->xselection);
|
||||
{
|
||||
char *retain = scr->xdestring;
|
||||
for (;retain[0];retain++) {
|
||||
if (retain[0] < 32) retain[0] = 32;
|
||||
if (!strncmp(retain, "file:", 5)) {
|
||||
int i;
|
||||
for (i=0;i<5;retain[i++]=' ');
|
||||
}
|
||||
}
|
||||
retain = scr->xdestring;
|
||||
if (scr->xdestring){
|
||||
if (!strncmp(scr->xdestring, "file:", 5))
|
||||
scr->xdestring+=5;
|
||||
}
|
||||
wDockReceiveDNDDrop(scr,event);
|
||||
if (retain){
|
||||
XFree(retain);
|
||||
scr->xdestring = NULL;
|
||||
}
|
||||
}
|
||||
wXDNDProcessSelection(event);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
17
src/misc.c
17
src/misc.c
@@ -875,14 +875,6 @@ get_dnd_selection(WScreen *scr)
|
||||
char *flat_string;
|
||||
int count;
|
||||
|
||||
#ifdef XDND
|
||||
if(scr->xdestring) {
|
||||
/*
|
||||
printf(" return %s\n",scr->xdestring);
|
||||
*/
|
||||
return (wstrdup(scr->xdestring));
|
||||
}
|
||||
#endif
|
||||
result=XGetTextProperty(dpy, scr->root_win, &text_ret, _XA_DND_SELECTION);
|
||||
|
||||
if (result==0 || text_ret.value==NULL || text_ret.encoding==None
|
||||
@@ -936,7 +928,7 @@ ExpandOptions(WScreen *scr, char *cmdline)
|
||||
char *out, *nout;
|
||||
char *selection=NULL;
|
||||
char *user_input=NULL;
|
||||
#ifdef OFFIX_DND
|
||||
#if defined(OFFIX_DND) || defined(XDND)
|
||||
char *dropped_thing=NULL;
|
||||
#endif
|
||||
char tmpbuf[TMPBUFSIZE];
|
||||
@@ -1047,8 +1039,13 @@ ExpandOptions(WScreen *scr, char *cmdline)
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef OFFIX_DND
|
||||
#if defined(OFFIX_DND) || defined(XDND)
|
||||
case 'd':
|
||||
#ifdef XDND
|
||||
if(scr->xdestring) {
|
||||
dropped_thing = wstrdup(scr->xdestring);
|
||||
}
|
||||
#endif
|
||||
if (!dropped_thing) {
|
||||
dropped_thing = get_dnd_selection(scr);
|
||||
}
|
||||
|
||||
50
src/xdnd.c
50
src/xdnd.c
@@ -90,17 +90,20 @@ void wXDNDClearAwareness(Window window) {
|
||||
}
|
||||
|
||||
Bool
|
||||
wXDNDProcessSelection(XSelectionEvent *event)
|
||||
wXDNDProcessSelection(XEvent *event)
|
||||
{
|
||||
WScreen *scr = wScreenForWindow(event->requestor);
|
||||
WScreen *scr = wScreenForWindow(event->xselection.requestor);
|
||||
char *dropdata;
|
||||
char *retain = scr->xdestring;
|
||||
Atom ret_type;
|
||||
int ret_format;
|
||||
unsigned long ret_item;
|
||||
unsigned long remain_byte;
|
||||
char * delme;
|
||||
XEvent xevent;
|
||||
Window selowner = XGetSelectionOwner(dpy,_XA_XdndSelection);
|
||||
XGetWindowProperty(dpy, event->requestor, _XA_WINDOWMAKER_XDNDEXCHANGE,
|
||||
XGetWindowProperty(dpy, event->xselection.requestor,
|
||||
_XA_WINDOWMAKER_XDNDEXCHANGE,
|
||||
0, 65536, True, atom_support, &ret_type, &ret_format,
|
||||
&ret_item, &remain_byte, (unsigned char **)&delme);
|
||||
if (delme){
|
||||
@@ -110,19 +113,34 @@ wXDNDProcessSelection(XSelectionEvent *event)
|
||||
scr->xdestring=delme;
|
||||
}
|
||||
|
||||
{
|
||||
/*finished*/
|
||||
XEvent xevent;
|
||||
memset (&xevent, 0, sizeof(xevent));
|
||||
xevent.xany.type = ClientMessage;
|
||||
xevent.xany.display = dpy;
|
||||
xevent.xclient.window = selowner;
|
||||
xevent.xclient.message_type = _XA_XdndFinished;
|
||||
xevent.xclient.format = 32;
|
||||
|
||||
XDND_FINISHED_TARGET_WIN(&xevent) = event->requestor;
|
||||
XSendEvent(dpy, selowner, 0, 0, &xevent);
|
||||
}
|
||||
/*send finished*/
|
||||
memset (&xevent, 0, sizeof(xevent));
|
||||
xevent.xany.type = ClientMessage;
|
||||
xevent.xany.display = dpy;
|
||||
xevent.xclient.window = selowner;
|
||||
xevent.xclient.message_type = _XA_XdndFinished;
|
||||
xevent.xclient.format = 32;
|
||||
XDND_FINISHED_TARGET_WIN(&xevent) = event->xselection.requestor;
|
||||
XSendEvent(dpy, selowner, 0, 0, &xevent);
|
||||
|
||||
/*process dropping*/
|
||||
for (;retain[0];retain++) {
|
||||
if (retain[0] < 32) retain[0] = 32;
|
||||
if (!strncmp(retain, "file:", 5)) {
|
||||
int i;
|
||||
for (i=0;i<5;retain[i++]=' ');
|
||||
}
|
||||
}
|
||||
retain = scr->xdestring;
|
||||
if (scr->xdestring){
|
||||
if (!strncmp(scr->xdestring, "file:", 5))
|
||||
scr->xdestring+=5;
|
||||
}
|
||||
wDockReceiveDNDDrop(scr,event);
|
||||
if (retain){
|
||||
XFree(retain);
|
||||
scr->xdestring = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Bool
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
|
||||
void wXDNDInitializeAtoms();
|
||||
Bool wXDNDProcessSelection(XSelectionEvent *event);
|
||||
Bool wXDNDProcessSelection(XEvent *event);
|
||||
Bool wXDNDProcessClientMessage(XClientMessageEvent *event);
|
||||
void wXDNDMakeAwareness(Window window);
|
||||
void wXDNDClearAwareness(Window window);
|
||||
|
||||
Reference in New Issue
Block a user