parent
4230dd4018
commit
8ff56f78ad
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue