Send and receive XdndStatus messages

SVN revision: 8883
This commit is contained in:
xcomputerman 2004-02-07 19:37:47 +00:00 committed by xcomputerman
parent 4230dd4018
commit 8ff56f78ad
4 changed files with 94 additions and 3 deletions

View File

@ -416,7 +416,8 @@ struct _Ecore_X_Event_Xdnd_Position
struct _Ecore_X_Event_Xdnd_Status
{
Ecore_X_Window win, target;
int drop_accept;
int will_accept;
Ecore_X_Rectangle rectangle;
Ecore_X_Atom action;
};

View File

@ -82,3 +82,54 @@ ecore_x_dnd_begin (Ecore_X_Window source, unsigned char *data, int size)
return 1;
}
void
ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectangle, Ecore_X_Atom action)
{
XEvent xev;
if (_xdnd->state == ECORE_X_DND_IDLE ||
_xdnd->state == ECORE_X_DND_FINISHED)
return;
memset(&xev, 0, sizeof(XEvent));
_xdnd->rectangle.x = rectangle.x;
_xdnd->rectangle.y = rectangle.y;
_xdnd->rectangle.width = rectangle.width;
_xdnd->rectangle.height = rectangle.height;
_xdnd->will_accept = will_accept;
_xdnd->suppress = suppress;
xev.xclient.type = ClientMessage;
xev.xclient.display = _ecore_x_disp;
xev.xclient.message_type = _ecore_x_atom_xdnd_status;
xev.xclient.format = 32;
xev.xclient.window = _xdnd->source;
xev.xclient.data.l[0] = _xdnd->dest;
if (will_accept)
xev.xclient.data.l[1] |= 0x1UL;
if (!suppress)
xev.xclient.data.l[1] |= 0x2UL;
/* Set rectangle information */
xev.xclient.data.l[2] = rectangle.x;
xev.xclient.data.l[2] <<= 16;
xev.xclient.data.l[2] |= rectangle.y;
xev.xclient.data.l[3] = rectangle.width;
xev.xclient.data.l[3] <<= 16;
xev.xclient.data.l[3] |= rectangle.height;
if (will_accept)
{
xev.xclient.data.l[4] = action;
_xdnd->accepted_action = action;
}
else
{
xev.xclient.data.l[4] = None;
_xdnd->accepted_action = action;
}
XSendEvent(_ecore_x_disp, _xdnd->source, False, 0, &xev);
}

View File

@ -1106,10 +1106,13 @@ _ecore_x_event_handle_client_message(XEvent *xevent)
_xdnd->source = xevent->xclient.data.l[0];
_xdnd->dest = xevent->xclient.window;
_xdnd->pos.x = xevent->xclient.data.l[2] >> 16;
_xdnd->pos.y = xevent->xclient.data.l[2] & 0x00FF;
_xdnd->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
_xdnd->action = xevent->xclient.data.l[4]; /* Version 2 */
/* TODO: Resolve a suitable method for enumerating Xdnd actions */
/* Would it be feasible to handle the processing of this message
* within ecore? I think not, but someone might have an idea here. */
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
if (!e) return;
e->win = _xdnd->dest;
@ -1120,6 +1123,39 @@ _ecore_x_event_handle_client_message(XEvent *xevent)
e->action = _xdnd->action;
ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, _ecore_x_event_free_generic, NULL);
}
else if (xevent->xclient.message_type == _ecore_x_atom_xdnd_status)
{
Ecore_X_Event_Xdnd_Status *e;
Ecore_X_DND_Protocol *_xdnd;
_xdnd = _ecore_x_dnd_protocol_get();
/* Make sure source/target match */
if (_xdnd->source != xevent->xclient.window
|| _xdnd->dest != xevent->xclient.data.l[0])
return;
_xdnd->will_accept = xevent->xclient.data.l[1] & 0x1UL;
_xdnd->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
_xdnd->rectangle.x = xevent->xclient.data.l[2] >> 16;
_xdnd->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
_xdnd->rectangle.width = xevent->xclient.data.l[3] >> 16;
_xdnd->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
_xdnd->accepted_action = xevent->xclient.data.l[4];
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
if (!e) return;
e->win = _xdnd->source;
e->target = _xdnd->dest;
e->will_accept = _xdnd->will_accept;
e->rectangle.x = _xdnd->rectangle.x;
e->rectangle.y = _xdnd->rectangle.y;
e->rectangle.width = _xdnd->rectangle.width;
e->rectangle.height = _xdnd->rectangle.height;
e->action = _xdnd->accepted_action;
ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, _ecore_x_event_free_generic, NULL);
}
else
{
/* FIXME: handle this event type */

View File

@ -79,9 +79,12 @@ typedef struct _Ecore_X_DND_Protocol
} pos;
Atom *types;
Atom action;
Atom action, accepted_action;
int num_types;
int will_accept;
int suppress;
struct {
Ecore_Event_Handler *mouse_move;
Ecore_Event_Handler *mouse_up;