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