Enlightenment CVS committal
Author : sebastid
Project : e17
Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_x
Modified Files:
Ecore_X.h ecore_x_dnd.c ecore_x_events.c ecore_x_selection.c
Log Message:
Working on dnd drag. Doesn't quite work yet....
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -3 -r1.102 -r1.103
--- Ecore_X.h 23 Mar 2005 15:40:53 -0000 1.102
+++ Ecore_X.h 23 Mar 2005 18:33:33 -0000 1.103
@@ -473,7 +473,6 @@
{
Ecore_X_Window win, target;
int will_accept;
- int suppress;
Ecore_X_Rectangle rectangle;
Ecore_X_Atom action;
};
@@ -826,6 +825,7 @@
EAPI int ecore_x_dnd_type_isset(Ecore_X_Window win, const char
*type);
EAPI void ecore_x_dnd_type_set(Ecore_X_Window win, const char
*type, int on);
EAPI int ecore_x_dnd_begin(Ecore_X_Window source, unsigned char
*data, int size);
+EAPI void ecore_x_dnd_drop(void);
EAPI void ecore_x_dnd_send_status(int will_accept, int suppress,
Ecore_X_Rectangle rectangle, Ecore_X_Atom action);
EAPI void ecore_x_dnd_send_finished(void);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -3 -r1.17 -r1.18
--- ecore_x_dnd.c 23 Mar 2005 15:40:53 -0000 1.17
+++ ecore_x_dnd.c 23 Mar 2005 18:33:36 -0000 1.18
@@ -48,7 +48,6 @@
XA_ATOM, 32, &prop_data, 1);
else
ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_AWARE);
- ecore_x_dnd_type_set(win, "text/plain", 1);
}
int
@@ -181,6 +180,33 @@
}
void
+ecore_x_dnd_drop(void)
+{
+ XEvent xev;
+
+ xev.xany.type = ClientMessage;
+ xev.xany.display = _ecore_x_disp;
+ xev.xclient.format = 32;
+ xev.xclient.window = _xdnd->dest;
+
+ if (_xdnd->will_accept)
+ {
+ xev.xclient.message_type = ECORE_X_ATOM_XDND_DROP;
+ xev.xclient.data.l[0] = _xdnd->source;
+ xev.xclient.data.l[1] = 0;
+ xev.xclient.data.l[2] = _xdnd->time;
+ XSendEvent(_ecore_x_disp, _xdnd->dest, False, 0, &xev);
+ }
+ else
+ {
+ xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
+ xev.xclient.data.l[0] = _xdnd->source;
+ xev.xclient.data.l[1] = 0;
+ XSendEvent(_ecore_x_disp, _xdnd->dest, False, 0, &xev);
+ }
+}
+
+void
ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle
rectangle, Ecore_X_Atom action)
{
XEvent xev;
@@ -205,6 +231,7 @@
xev.xclient.window = _xdnd->source;
xev.xclient.data.l[0] = _xdnd->dest;
+ xev.xclient.data.l[1] = 0;
if (will_accept)
xev.xclient.data.l[1] |= 0x1UL;
if (!suppress)
@@ -244,7 +271,8 @@
xev.xclient.window = _xdnd->source;
xev.xclient.data.l[0] = _xdnd->dest;
- memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3);
+ xev.xclient.data.l[1] = 0;
+ xev.xclient.data.l[2] = 0;
if (_xdnd->will_accept)
{
xev.xclient.data.l[1] |= 0x1UL;
@@ -271,11 +299,12 @@
win = ecore_x_window_parent_get(win);
/* Send XdndLeave to current destination window if we have left it */
- if ((win != _xdnd->dest) && (_xdnd->dest))
+ if ((_xdnd->dest) && (win != _xdnd->dest))
{
xev.xclient.window = _xdnd->dest;
xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
xev.xclient.data.l[0] = _xdnd->source;
+ xev.xclient.data.l[1] = 0;
XSendEvent(_ecore_x_disp, _xdnd->dest, False, 0, &xev);
}
@@ -298,12 +327,15 @@
xev.xclient.window = win;
xev.xclient.message_type = ECORE_X_ATOM_XDND_ENTER;
xev.xclient.data.l[0] = _xdnd->source;
+ xev.xclient.data.l[1] = 0;
if (num > 3)
xev.xclient.data.l[1] |= 0x1UL;
else
xev.xclient.data.l[1] &= 0xfffffffeUL;
xev.xclient.data.l[1] |= ((unsigned long) _xdnd->version) << 24;
+ for (i = 2; i < 5; i++)
+ xev.xclient.data.l[i] = 0;
for (i = 0; i < MIN(num, 3); ++i)
xev.xclient.data.l[i + 2] = types[i];
XFree(data);
@@ -319,7 +351,7 @@
xev.xclient.data.l[0] = _xdnd->source;
xev.xclient.data.l[1] = 0; /* Reserved */
xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
- xev.xclient.data.l[3] = CurrentTime; /* Version 1 */
+ xev.xclient.data.l[3] = _xdnd->time; /* Version 1 */
xev.xclient.data.l[4] = _xdnd->action; /* Version 2, Needs to be
pre-set */
XSendEvent(_ecore_x_disp, win, False, 0, &xev);
_xdnd->await_status = 1;
@@ -336,9 +368,7 @@
xev.xclient.message_type = ECORE_X_ATOM_XDND_DROP;
xev.xclient.data.l[0] = _xdnd->source;
xev.xclient.data.l[1] = 0;
- xev.xclient.data.l[2] = CurrentTime;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
+ xev.xclient.data.l[2] = _xdnd->time;
XSendEvent(_ecore_x_disp, win, False, 0, &xev);
}
else
@@ -346,7 +376,7 @@
xev.xclient.window = win;
xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
xev.xclient.data.l[0] = _xdnd->source;
- memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3); /* Evil
*/
+ xev.xclient.data.l[1] = 0;
XSendEvent(_ecore_x_disp, win, False, 0, &xev);
}
}
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -3 -r1.44 -r1.45
--- ecore_x_events.c 23 Mar 2005 15:40:53 -0000 1.44
+++ ecore_x_events.c 23 Mar 2005 18:33:47 -0000 1.45
@@ -503,15 +503,16 @@
/* Xdnd handling */
_xdnd = _ecore_x_dnd_protocol_get();
- if (_xdnd->state == ECORE_X_DND_DRAGGING)
+ if (_xdnd->state != ECORE_X_DND_IDLE)
{
/* Determine if we're still in the rectangle from the last status */
x1 = _xdnd->rectangle.x;
x2 = _xdnd->rectangle.x + _xdnd->rectangle.width;
y1 = _xdnd->rectangle.y;
y2 = _xdnd->rectangle.y + _xdnd->rectangle.height;
- if ((e->win != _xdnd->dest) || (e->root.x < x1) || (e->root.x > x2)
- || (e->root.y < y1) || (e->root.y > y2))
+ if (!(_xdnd->suppress) ||
+ ((e->root.x < x1) || (e->root.x > x2)
+ || (e->root.y < y1) || (e->root.y > y2)))
{
_ecore_x_dnd_drag(e->root.x, e->root.y);
}
@@ -995,12 +996,12 @@
Atom sel;
if (!(d = _ecore_x_selection_get(xevent->xselectionclear.selection)))
- return;
+ return;
if (xevent->xselectionclear.time > d->time)
- {
- _ecore_x_selection_set(None, NULL, 0,
- xevent->xselectionclear.selection);
- }
+ {
+ _ecore_x_selection_set(None, NULL, 0,
+ xevent->xselectionclear.selection);
+ }
/* Generate event for app cleanup */
e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
@@ -1008,13 +1009,13 @@
e->time = xevent->xselectionclear.time;
sel = xevent->xselectionclear.selection;
if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
- e->selection = ECORE_X_SELECTION_PRIMARY;
+ e->selection = ECORE_X_SELECTION_PRIMARY;
else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
- e->selection = ECORE_X_SELECTION_SECONDARY;
+ e->selection = ECORE_X_SELECTION_SECONDARY;
else
- e->selection = ECORE_X_SELECTION_CLIPBOARD;
+ e->selection = ECORE_X_SELECTION_CLIPBOARD;
ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
-
+
}
void
@@ -1022,11 +1023,9 @@
{
Ecore_X_Selection_Data *sd;
XSelectionEvent xnotify;
- XEvent *xev;
+ XEvent xev;
void *data;
- xev = calloc(1, sizeof(XEvent));
-
xnotify.type = SelectionNotify;
xnotify.display = xevent->xselectionrequest.display;
xnotify.requestor = xevent->xselectionrequest.requestor;
@@ -1034,37 +1033,36 @@
xnotify.target = xevent->xselectionrequest.target;
xnotify.time = CurrentTime;
- if((sd = _ecore_x_selection_get(xnotify.selection))
- && (sd->win == xevent->xselectionrequest.owner))
- {
- if (_ecore_x_selection_convert(xnotify.selection, xnotify.target,
- &data) == -1)
- {
- /* Refuse selection, conversion to requested target failed */
- xnotify.property = None;
- }
- else
- {
- /* FIXME: This does not properly handle large data transfers */
- ecore_x_window_prop_property_set(xevent->xselectionrequest.requestor,
- xevent->xselectionrequest.property,
- xevent->xselectionrequest.target,
- 8, data, sd->length);
- xnotify.property = xevent->xselectionrequest.property;
- free(data);
- }
- }
+ if ((sd = _ecore_x_selection_get(xnotify.selection))
+ && (sd->win == xevent->xselectionrequest.owner))
+ {
+ if (!_ecore_x_selection_convert(xnotify.selection, xnotify.target,
+ &data) == -1)
+ {
+ /* Refuse selection, conversion to requested target failed */
+ xnotify.property = None;
+ }
+ else
+ {
+ /* FIXME: This does not properly handle large data transfers */
+
ecore_x_window_prop_property_set(xevent->xselectionrequest.requestor,
+
xevent->xselectionrequest.property,
+ xevent->xselectionrequest.target,
+ 8, data, sd->length);
+ xnotify.property = xevent->xselectionrequest.property;
+ free(data);
+ }
+ }
else
- {
- xnotify.property = None;
- return;
- }
-
- xev->xselection = xnotify;
+ {
+ xnotify.property = None;
+ return;
+ }
+
+ xev.xselection = xnotify;
XSendEvent(xevent->xselectionrequest.display,
- xevent->xselectionrequest.requestor, False, 0, xev);
- XFree(xev);
-
+ xevent->xselectionrequest.requestor, False, 0, &xev);
+
}
void
@@ -1082,25 +1080,25 @@
e->target = _ecore_x_selection_target_get(xevent->xselection.target);
selection = xevent->xselection.selection;
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- e->selection = ECORE_X_SELECTION_PRIMARY;
+ e->selection = ECORE_X_SELECTION_PRIMARY;
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- e->selection = ECORE_X_SELECTION_SECONDARY;
+ e->selection = ECORE_X_SELECTION_SECONDARY;
else if (selection == ECORE_X_ATOM_SELECTION_XDND)
- e->selection = ECORE_X_SELECTION_XDND;
+ e->selection = ECORE_X_SELECTION_XDND;
else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
- e->selection = ECORE_X_SELECTION_CLIPBOARD;
+ e->selection = ECORE_X_SELECTION_CLIPBOARD;
else
- {
- free(e);
- return;
- }
+ {
+ free(e);
+ return;
+ }
if (!ecore_x_window_prop_property_get(e->win, xevent->xselection.property,
- AnyPropertyType, 8, &data, &num_ret))
- {
- free(e);
- return;
- }
+ AnyPropertyType, 8, &data, &num_ret))
+ {
+ free(e);
+ return;
+ }
sel_data.win = e->win;
sel_data.selection = selection;
@@ -1108,7 +1106,6 @@
sel_data.length = num_ret;
_ecore_x_selection_request_data_set(sel_data);
ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
_ecore_x_event_free_selection_notify, NULL);
-
}
void
@@ -1259,7 +1256,6 @@
e->win = _xdnd->source;
e->target = _xdnd->dest;
e->will_accept = _xdnd->will_accept;
- e->suppress = _xdnd->suppress;
e->rectangle.x = _xdnd->rectangle.x;
e->rectangle.y = _xdnd->rectangle.y;
e->rectangle.width = _xdnd->rectangle.width;
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_selection.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- ecore_x_selection.c 23 Mar 2005 10:53:34 -0000 1.21
+++ ecore_x_selection.c 23 Mar 2005 18:33:50 -0000 1.22
@@ -362,7 +362,7 @@
else if (target == ECORE_X_ATOM_TEXT)
return strdup(ECORE_X_SELECTION_TARGET_TEXT);
else
- return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+ return NULL;
}
static void
@@ -481,7 +481,7 @@
}
else
{
- if(prev_cnv)
+ if (prev_cnv)
prev_cnv->next = cnv->next;
else
converters = NULL; /* This was the only converter */
@@ -521,25 +521,34 @@
sel = _ecore_x_selection_get(selection);
tgt_str = _ecore_x_selection_target_get(target);
- for (cnv = converters; cnv; cnv = cnv->next)
+ if (tgt_str)
{
- if (cnv->target == target)
+ for (cnv = converters; cnv; cnv = cnv->next)
{
- int r;
- r = cnv->convert(tgt_str, sel->data, sel->length, &data, &size);
- if (r)
+ if (cnv->target == target)
{
- *data_ret = data;
- return r;
+ int r;
+ r = cnv->convert(tgt_str, sel->data, sel->length, &data,
&size);
+ if (r)
+ {
+ *data_ret = data;
+ return r;
+ }
+ else
+ return 0;
}
- else
- return -1;
}
- }
- free(tgt_str);
+ free(tgt_str);
+ }
+ else
+ {
+ *data_ret = malloc(sel->length);
+ memcpy(*data_ret, sel->data, sel->length);
+ return 1;
+ }
- return -1;
+ return 0;
}
/* TODO: We need to work out a mechanism for automatic conversion to any
requested
-------------------------------------------------------
This SF.net email is sponsored by Microsoft Mobile & Embedded DevCon 2005
Attend MEDC 2005 May 9-12 in Vegas. Learn more about the latest Windows
Embedded(r) & Windows Mobile(tm) platforms, applications & content. Register
by 3/29 & save $300 http://ads.osdn.com/?ad_id=6883&alloc_id=15149&op=click
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs