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_private.h
ecore_x_selection.c
Log Message:
DND
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v
retrieving revision 1.100
retrieving revision 1.101
diff -u -3 -r1.100 -r1.101
--- Ecore_X.h 22 Mar 2005 21:59:33 -0000 1.100
+++ Ecore_X.h 23 Mar 2005 10:53:25 -0000 1.101
@@ -456,6 +456,9 @@
{
Ecore_X_Window win, source;
Ecore_X_Time time;
+
+ char **types;
+ int num_types;
};
struct _Ecore_X_Event_Xdnd_Position
@@ -803,14 +806,17 @@
EAPI int ecore_x_selection_primary_clear(void);
EAPI int ecore_x_selection_secondary_set(Ecore_X_Window w,
unsigned char *data, int size);
EAPI int ecore_x_selection_secondary_clear(void);
+EAPI int ecore_x_selection_xdnd_set(Ecore_X_Window w, unsigned
char *data, int size);
+EAPI int ecore_x_selection_xdnd_clear(void);
EAPI int ecore_x_selection_clipboard_set(Ecore_X_Window w,
unsigned char *data, int size);
EAPI int ecore_x_selection_clipboard_clear(void);
EAPI void ecore_x_selection_primary_request(Ecore_X_Window w, char
*target);
-EAPI void ecore_x_selection_secondary_request(Ecore_X_Window w,
char *target);
-EAPI void ecore_x_selection_clipboard_request(Ecore_X_Window w,
char *target);
EAPI void ecore_x_selection_primary_request_data_get(void **buf,
int *len);
+EAPI void ecore_x_selection_secondary_request(Ecore_X_Window w,
char *target);
EAPI void ecore_x_selection_secondary_request_data_get(void **buf,
int *len);
+EAPI void ecore_x_selection_xdnd_request(Ecore_X_Window w, char
*target);
EAPI void ecore_x_selection_xdnd_request_data_get(void **buf, int
*len);
+EAPI void ecore_x_selection_clipboard_request(Ecore_X_Window w,
char *target);
EAPI void ecore_x_selection_clipboard_request_data_get(void **buf,
int *len);
EAPI void ecore_x_selection_converter_add(char *target, int
(*func)(char *target, void *data, int size, void **data_ret, int *size_ret));
EAPI void ecore_x_selection_converter_atom_add(Ecore_X_Atom
target, int (*func)(char *target, void *data, int size, void **data_ret, int
*size_ret));
@@ -823,6 +829,7 @@
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_send_status(int will_accept, int suppress,
Ecore_X_Rectangle rectangle, Ecore_X_Atom action);
+EAPI void ecore_x_dnd_send_finished(void);
EAPI Ecore_X_Window ecore_x_window_new(Ecore_X_Window parent, int x, int y,
int w, int h);
EAPI Ecore_X_Window ecore_x_window_override_new(Ecore_X_Window parent, int
x, int y, int w, int h);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- ecore_x_dnd.c 22 Mar 2005 21:59:33 -0000 1.15
+++ ecore_x_dnd.c 23 Mar 2005 10:53:34 -0000 1.16
@@ -6,7 +6,6 @@
#include "Ecore_X.h"
#include "Ecore_X_Atoms.h"
-static Ecore_X_Selection_Data _xdnd_selection;
static Ecore_X_DND_Protocol *_xdnd = NULL;
static int _ecore_x_dnd_init_count = 0;
@@ -163,29 +162,14 @@
int
ecore_x_dnd_begin(Ecore_X_Window source, unsigned char *data, int size)
{
- unsigned char *buf;
- unsigned char *atoms;
- int num;
if (!ecore_x_dnd_version_get(source))
return 0;
/* Take ownership of XdndSelection */
- XSetSelectionOwner(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND, source,
- _ecore_x_event_last_time);
- if (XGetSelectionOwner(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND) !=
source)
+ if (!ecore_x_selection_xdnd_set(source, data, size))
return 0;
- /* Initialize Selection Data Struct */
- _xdnd_selection.win = source;
- _xdnd_selection.selection = ECORE_X_ATOM_SELECTION_XDND;
- _xdnd_selection.length = size;
- _xdnd_selection.time = _ecore_x_event_last_time;
-
- buf = malloc(size);
- memcpy(buf, data, size);
- _xdnd_selection.data = buf;
-
_xdnd->source = source;
_xdnd->state = ECORE_X_DND_DRAGGING;
_xdnd->time = _ecore_x_event_last_time;
@@ -193,11 +177,6 @@
/* Default Accepted Action: ask */
_xdnd->action = ECORE_X_ATOM_XDND_ACTION_ASK;
_xdnd->accepted_action = None;
-
- ecore_x_window_prop_property_get(source, ECORE_X_ATOM_XDND_TYPE_LIST,
- XA_ATOM, 32, &atoms, &num);
- _xdnd->num_types = num;
- _xdnd->types = (Ecore_X_Atom *)atoms;
return 1;
}
@@ -254,6 +233,27 @@
}
void
+ecore_x_dnd_send_finished(void)
+{
+ XEvent xev;
+
+ xev.xany.type = ClientMessage;
+ xev.xany.display = _ecore_x_disp;
+ xev.xclient.window = _xdnd->source;
+ xev.xclient.message_type = ECORE_X_ATOM_XDND_FINISHED;
+ xev.xclient.format = 32;
+
+ xev.xclient.data.l[0] = _xdnd->dest;
+ memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3);
+ if (_xdnd->will_accept)
+ {
+ xev.xclient.data.l[1] |= 0x1UL;
+ xev.xclient.data.l[2] = _xdnd->accepted_action;
+ }
+ XSendEvent(_ecore_x_disp, _xdnd->source, False, 0, &xev);
+}
+
+void
_ecore_x_dnd_drag(int x, int y)
{
XEvent xev;
@@ -286,20 +286,27 @@
ecore_x_dnd_version_get(win));
if (win != _xdnd->dest)
{
- int i;
+ int i, num;
+ unsigned char *data;
+ Ecore_X_Atom *types;
+
+ ecore_x_window_prop_property_get(_xdnd->source,
ECORE_X_ATOM_XDND_TYPE_LIST,
+ XA_ATOM, 32, &data, &num);
+ types = (Ecore_X_Atom *)data;
/* Entered new window, send XdndEnter */
xev.xclient.window = win;
xev.xclient.message_type = ECORE_X_ATOM_XDND_ENTER;
xev.xclient.data.l[0] = _xdnd->source;
- if(_xdnd->num_types > 3)
+ 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 = 0; i < MIN(_xdnd->num_types, 3); ++i)
- xev.xclient.data.l[i + 2] = _xdnd->types[i];
+ for (i = 0; i < MIN(num, 3); ++i)
+ xev.xclient.data.l[i + 2] = types[i];
+ XFree(data);
XSendEvent(_ecore_x_disp, win, False, 0, &xev);
_xdnd->await_status = 0;
}
@@ -349,27 +356,3 @@
_xdnd->dest = win;
}
-#if 0 /* Unused? */
-void
-_ecore_x_dnd_send_finished(void)
-{
- XEvent xev;
-
- xev.xany.type = ClientMessage;
- xev.xany.display = _ecore_x_disp;
- xev.xclient.window = _xdnd->source;
- xev.xclient.message_type = ECORE_X_ATOM_XDND_FINISHED;
- xev.xclient.format = 32;
-
- xev.xclient.data.l[0] = _xdnd->dest;
- memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3);
- XSendEvent(_ecore_x_disp, _xdnd->source, False, 0, &xev);
-}
-
-int
-_ecore_x_dnd_own_selection(void)
-{
- return (!XSetSelectionOwner(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND,
- _xdnd->source, CurrentTime));
-}
-#endif
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -3 -r1.42 -r1.43
--- ecore_x_events.c 22 Mar 2005 21:59:34 -0000 1.42
+++ ecore_x_events.c 23 Mar 2005 10:53:34 -0000 1.43
@@ -1,7 +1,6 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
-
#include "ecore_private.h"
#include "Ecore.h"
#include "ecore_x_private.h"
@@ -146,6 +145,19 @@
free(e);
}
+static void
+_ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
+{
+ Ecore_X_Event_Xdnd_Enter *e;
+ int i;
+
+ e = ev;
+ for (i = 0; i < e->num_types; i++)
+ XFree(e->types[i]);
+ free(e->types);
+ free(e);
+}
+
void
_ecore_x_event_handle_key_press(XEvent *xevent)
{
@@ -492,19 +504,19 @@
/* Xdnd handling */
_xdnd = _ecore_x_dnd_protocol_get();
if (_xdnd->state == ECORE_X_DND_DRAGGING)
- {
- /* 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)
- {
- _ecore_x_dnd_drag(e->root.x, e->root.y);
- }
- }
-
+ {
+ /* 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))
+ {
+ _ecore_x_dnd_drag(e->root.x, e->root.y);
+ }
+ }
+
ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
@@ -1123,258 +1135,250 @@
/* otherwise generate generic client message event. this would handle*/
/* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
- (xevent->xclient.format == 32) &&
- (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
- {
- Ecore_X_Event_Window_Delete_Request *e;
-
- e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
- if (!e) return;
- e->win = xevent->xclient.window;
- e->time = _ecore_x_event_last_time;
- ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
- }
-
+ (xevent->xclient.format == 32) &&
+ (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
+ {
+ Ecore_X_Event_Window_Delete_Request *e;
+
+ e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
+ if (!e) return;
+ e->win = xevent->xclient.window;
+ e->time = _ecore_x_event_last_time;
+ ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
+ }
+
/* Xdnd Client Message Handling Begin */
/* Message Type: XdndEnter */
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
- {
- Ecore_X_Event_Xdnd_Enter *e;
- Ecore_X_DND_Protocol *_xdnd;
- unsigned long three;
-
- _xdnd = _ecore_x_dnd_protocol_get();
- _xdnd->source = xevent->xclient.data.l[0];
- _xdnd->dest = xevent->xclient.window;
- _xdnd->version = (int) (xevent->xclient.data.l[1] >> 24);
- if (_xdnd->version > ECORE_X_DND_VERSION)
- {
- printf("DND: Requested version %d, we only support up to %d\n",
_xdnd->version,
- ECORE_X_DND_VERSION);
- return;
- }
-
- if ((three = xevent->xclient.data.l[1] & 0x1UL))
- {
- /* source supports more than 3 types, fetch property */
- unsigned char *data;
- Atom *types;
- int i, num_ret;
- if (!(ecore_x_window_prop_property_get(_xdnd->source,
- ECORE_X_ATOM_XDND_TYPE_LIST,
- XA_ATOM,
- 32,
- &data,
- &num_ret)))
- {
- printf("DND: Could not fetch data type list from source window,
aborting.\n");
- return;
- }
- types = (Atom *) data;
- _xdnd->types = calloc(num_ret + 1, sizeof(Atom));
- for (i = 0; i < num_ret; i++)
- _xdnd->types[i] = types[i];
- _xdnd->num_types = num_ret;
- free(types);
- }
- else
- {
- _xdnd->types = calloc(4, sizeof(Atom));
- _xdnd->types[0] = xevent->xclient.data.l[2];
- _xdnd->types[1] = xevent->xclient.data.l[3];
- _xdnd->types[2] = xevent->xclient.data.l[4];
- _xdnd->num_types = 3;
- }
+ {
+ Ecore_X_Event_Xdnd_Enter *e;
+ Ecore_X_DND_Protocol *_xdnd;
+ unsigned long three;
- _xdnd->state = ECORE_X_DND_TARGET_ENTERED;
+ e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
+ if (!e) return;
+
+ _xdnd = _ecore_x_dnd_protocol_get();
+ _xdnd->source = xevent->xclient.data.l[0];
+ _xdnd->dest = xevent->xclient.window;
+ _xdnd->version = (int) (xevent->xclient.data.l[1] >> 24);
+ if (_xdnd->version > ECORE_X_DND_VERSION)
+ {
+ printf("DND: Requested version %d, we only support up to %d\n",
_xdnd->version,
+
ECORE_X_DND_VERSION);
+ return;
+ }
+
+ if ((three = xevent->xclient.data.l[1] & 0x1UL))
+ {
+ /* source supports more than 3 types, fetch property */
+ unsigned char *data;
+ Ecore_X_Atom *types;
+ int i, num_ret;
+ if (!(ecore_x_window_prop_property_get(_xdnd->source,
+ ECORE_X_ATOM_XDND_TYPE_LIST,
+ XA_ATOM,
+ 32,
+ &data,
+ &num_ret)))
+ {
+ printf("DND: Could not fetch data type list from source
window, aborting.\n");
+ return;
+ }
+ types = (Ecore_X_Atom *)data;
+ e->types = calloc(num_ret, sizeof(char *));
+ for (i = 0; i < num_ret; i++)
+ e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
+ e->num_types = num_ret;
+ }
+ else
+ {
+ e->types = calloc(3, sizeof(char *));
+ e->types[0] = XGetAtomName(_ecore_x_disp,
xevent->xclient.data.l[2]);
+ e->types[1] = XGetAtomName(_ecore_x_disp,
xevent->xclient.data.l[3]);
+ e->types[2] = XGetAtomName(_ecore_x_disp,
xevent->xclient.data.l[4]);
+ e->num_types = 3;
+ }
+
+ _xdnd->state = ECORE_X_DND_TARGET_ENTERED;
+
+ e->win = _xdnd->dest;
+ e->source = _xdnd->source;
+ e->time = CurrentTime;
+ _ecore_x_event_last_time = e->time;
+ ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
_ecore_x_event_free_xdnd_enter, NULL);
+ }
- e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
- if (!e) return;
- e->win = _xdnd->dest;
- e->source = _xdnd->source;
- e->time = CurrentTime;
- _ecore_x_event_last_time = e->time;
- ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e, NULL, NULL);
- }
-
/* Message Type: XdndPosition */
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
- {
- Ecore_X_Event_Xdnd_Position *e;
- Ecore_X_DND_Protocol *_xdnd;
+ {
+ Ecore_X_Event_Xdnd_Position *e;
+ Ecore_X_DND_Protocol *_xdnd;
- _xdnd = _ecore_x_dnd_protocol_get();
- _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] & 0xFFFFUL;
- _xdnd->action = xevent->xclient.data.l[4]; /* Version 2 */
- /* TODO: Resolve a suitable method for enumerating Xdnd actions */
+ _xdnd = _ecore_x_dnd_protocol_get();
+ _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] & 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. */
+ /* Would it be feasible to handle the processing of this message
+ * within ecore? I think not, but someone might have an idea here. */
+
+ _ecore_x_event_last_time = (_xdnd->version >= 1) ?
+ (Time)xevent->xclient.data.l[3] : CurrentTime;
+
+ e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
+ if (!e) return;
+ e->win = _xdnd->dest;
+ e->source = _xdnd->source;
+ e->position.x = _xdnd->pos.x;
+ e->position.y = _xdnd->pos.y;
+ e->time = xevent->xclient.data.l[3]; /* Version 1 */
+ e->action = _xdnd->action;
+ ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
+ }
- e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
- if (!e) return;
- e->win = _xdnd->dest;
- e->source = _xdnd->source;
- e->position.x = _xdnd->pos.x;
- e->position.y = _xdnd->pos.y;
- e->time = xevent->xclient.data.l[3]; /* Version 1 */
- e->action = _xdnd->action;
- ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
- }
-
/* Message Type: XdndStatus */
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
- {
- Ecore_X_Event_Xdnd_Status *e;
- Ecore_X_DND_Protocol *_xdnd;
+ {
+ 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 != (Window)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 = _ecore_x_dnd_protocol_get();
+ /* Make sure source/target match */
+ if ((_xdnd->source != xevent->xclient.window )
+ || (_xdnd->dest != (Window)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->accepted_action = xevent->xclient.data.l[4];
+ _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;
- 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;
+ _xdnd->accepted_action = xevent->xclient.data.l[4];
- ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
- }
+ 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, NULL, NULL);
+ }
/* Message Type: XdndLeave */
/* Pretend the whole thing never happened, sort of */
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
- {
- Ecore_X_Event_Xdnd_Leave *e;
- Ecore_X_DND_Protocol *_xdnd;
+ {
+ Ecore_X_Event_Xdnd_Leave *e;
+ Ecore_X_DND_Protocol *_xdnd;
- _xdnd = _ecore_x_dnd_protocol_get();
- /* Match source/target */
- if (_xdnd->source != (Window)xevent->xclient.data.l[0]
- || _xdnd->dest != xevent->xclient.window)
- return;
- if (_xdnd->types)
- free(_xdnd->types);
- _xdnd->num_types = 0;
- /* XXX: May need to reset event handler callbacks as well */
- _xdnd->state = ECORE_X_DND_IDLE;
+ _xdnd = _ecore_x_dnd_protocol_get();
+ /* Match source/target */
+ if ((_xdnd->source != (Window)xevent->xclient.data.l[0])
+ || (_xdnd->dest != xevent->xclient.window))
+ return;
+ /* XXX: May need to reset event handler callbacks as well */
+ _xdnd->state = ECORE_X_DND_IDLE;
- e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
- if (!e) return;
- e->win = _xdnd->dest;
- e->source = _xdnd->source;
- ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
- }
+ e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
+ if (!e) return;
+ e->win = _xdnd->dest;
+ e->source = _xdnd->source;
+ ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
+ }
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
- {
- Ecore_X_Event_Xdnd_Drop *e;
- Ecore_X_DND_Protocol *_xdnd;
- Ecore_X_Time timestamp;
-
- _xdnd = _ecore_x_dnd_protocol_get();
- /* Match source/target */
- if (_xdnd->source != (Window)xevent->xclient.data.l[0]
- || _xdnd->dest != xevent->xclient.window)
- return;
-
- timestamp = (_xdnd->version >= (int)1) ?
- (Time)xevent->xclient.data.l[2] :
_ecore_x_event_last_time;
-
- XConvertSelection(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND,
- _xdnd->dest, ECORE_X_ATOM_SELECTION_PROP_XDND, _xdnd->dest,
- timestamp);
+ {
+ Ecore_X_Event_Xdnd_Drop *e;
+ Ecore_X_DND_Protocol *_xdnd;
+ Ecore_X_Time timestamp;
+
+ _xdnd = _ecore_x_dnd_protocol_get();
+ /* Match source/target */
+ if ((_xdnd->source != (Window)xevent->xclient.data.l[0])
+ || (_xdnd->dest != xevent->xclient.window))
+ return;
- /* FIXME: Have to wait for SelectionNotify before we can send
- * XdndFinished. Stupid, retarded protocols, gah! */
+ timestamp = (_xdnd->version >= 1) ?
+ (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
- e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
- if (!e) return;
- e->win = _xdnd->dest;
- e->source = _xdnd->source;
- e->time = timestamp;
- e->action = _xdnd->action;
- e->position.x = _xdnd->pos.x;
- e->position.y = _xdnd->pos.y;
- ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
- }
+ e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
+ if (!e) return;
+ e->win = _xdnd->dest;
+ e->source = _xdnd->source;
+ e->time = timestamp;
+ e->action = _xdnd->action;
+ e->position.x = _xdnd->pos.x;
+ e->position.y = _xdnd->pos.y;
+ ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
+ }
/* Message Type: XdndFinished */
else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
- {
- Ecore_X_Event_Xdnd_Finished *e;
- Ecore_X_DND_Protocol *_xdnd;
- int completed = 1;
-
- _xdnd = _ecore_x_dnd_protocol_get();
- /* Match source/target */
- if (_xdnd->source != xevent->xclient.window
- || _xdnd->dest != (Window)xevent->xclient.data.l[0])
- return;
-
- if (_xdnd->version >= 5 && (xevent->xclient.data.l[1] & 0x1UL))
- {
- /* Target successfully performed drop action */
- _xdnd->state = ECORE_X_DND_IDLE;
- } else {
- completed = 0;
- _xdnd->state = ECORE_X_DND_TARGET_CONVERTING;
-
- /* FIXME: Probably need to add a timer to switch back to idle
- * and discard the selection data */
- }
+ {
+ Ecore_X_Event_Xdnd_Finished *e;
+ Ecore_X_DND_Protocol *_xdnd;
+ int completed = 1;
+
+ _xdnd = _ecore_x_dnd_protocol_get();
+ /* Match source/target */
+ if ((_xdnd->source != xevent->xclient.window)
+ || (_xdnd->dest != (Window)xevent->xclient.data.l[0]))
+ return;
- e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
- if (!e) return;
- e->win = _xdnd->source;
- e->target = _xdnd->dest;
- e->completed = completed;
- if (_xdnd->version >= 5)
- {
- _xdnd->accepted_action = xevent->xclient.data.l[2];
- e->action = _xdnd->accepted_action;
- }
- else
- {
- _xdnd->accepted_action = 0;
- e->action = _xdnd->action;
- }
+ if ((_xdnd->version >= 5) && (xevent->xclient.data.l[1] & 0x1UL))
+ {
+ /* Target successfully performed drop action */
+ _xdnd->state = ECORE_X_DND_IDLE;
+ } else {
+ completed = 0;
+ _xdnd->state = ECORE_X_DND_TARGET_CONVERTING;
+
+ /* FIXME: Probably need to add a timer to switch back to idle
+ * and discard the selection data */
+ }
- ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
+ e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
+ if (!e) return;
+ e->win = _xdnd->source;
+ e->target = _xdnd->dest;
+ e->completed = completed;
+ if (_xdnd->version >= 5)
+ {
+ _xdnd->accepted_action = xevent->xclient.data.l[2];
+ e->action = _xdnd->accepted_action;
+ }
+ else
+ {
+ _xdnd->accepted_action = 0;
+ e->action = _xdnd->action;
+ }
- }
+ ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
+ }
else
- {
- Ecore_X_Event_Client_Message *e;
- int i;
-
- e = (Ecore_X_Event_Client_Message *) calloc(1,
sizeof(Ecore_X_Event_Client_Message));
- e->win = xevent->xclient.window;
- e->message_type = xevent->xclient.message_type;
- e->format = xevent->xclient.format;
- for(i = 0; i < 5; i++)
- e->data.l[i] = xevent->xclient.data.l[i];
-
- ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
- }
+ {
+ Ecore_X_Event_Client_Message *e;
+ int i;
+
+ e = (Ecore_X_Event_Client_Message *) calloc(1,
sizeof(Ecore_X_Event_Client_Message));
+ e->win = xevent->xclient.window;
+ e->message_type = xevent->xclient.message_type;
+ e->format = xevent->xclient.format;
+ for(i = 0; i < 5; i++)
+ e->data.l[i] = xevent->xclient.data.l[i];
+
+ ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
+ }
}
void
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- ecore_x_private.h 22 Mar 2005 21:59:34 -0000 1.37
+++ ecore_x_private.h 23 Mar 2005 10:53:34 -0000 1.38
@@ -91,9 +91,7 @@
Time time;
- Ecore_X_Atom *types;
Ecore_X_Atom action, accepted_action;
- int num_types;
int will_accept;
int suppress;
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_selection.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- ecore_x_selection.c 22 Mar 2005 21:59:35 -0000 1.20
+++ ecore_x_selection.c 23 Mar 2005 10:53:34 -0000 1.21
@@ -6,7 +6,7 @@
#include "Ecore_X.h"
#include "Ecore_X_Atoms.h"
-static Ecore_X_Selection_Data selections[3];
+static Ecore_X_Selection_Data selections[4];
static Ecore_X_Selection_Data request_data[4];
static Ecore_X_Selection_Converter *converters = NULL;
@@ -41,11 +41,12 @@
return;
/* free the selection converters */
- while (cnv) {
+ while (cnv)
+ {
tmp = cnv->next;
free(cnv);
cnv = tmp;
- }
+ }
converters = NULL;
}
@@ -56,22 +57,22 @@
int i;
char *data;
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- i = 0;
+ i = 0;
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- i = 1;
+ i = 1;
else if (selection == ECORE_X_ATOM_SELECTION_XDND)
- i = 2;
+ i = 2;
else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
- i = 3;
+ i = 3;
else
- return;
+ return;
if (!request_data[i].data || !request_data[i].length)
- {
- *len = 0;
- *buf = NULL;
- return;
- }
+ {
+ *len = 0;
+ *buf = NULL;
+ return;
+ }
data = malloc(request_data[i].length);
memcpy(data, request_data[i].data, request_data[i].length);
@@ -145,15 +146,15 @@
{
int i;
if (data.selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- i = 0;
+ i = 0;
else if (data.selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- i = 1;
+ i = 1;
else if (data.selection == ECORE_X_ATOM_SELECTION_XDND)
- i = 2;
+ i = 2;
else if (data.selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
- i = 3;
+ i = 3;
else
- return;
+ return;
request_data[i] = data;
}
@@ -162,13 +163,15 @@
_ecore_x_selection_get(Atom selection)
{
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- return &selections[0];
+ return &selections[0];
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- return &selections[1];
+ return &selections[1];
+ else if (selection == ECORE_X_ATOM_SELECTION_XDND)
+ return &selections[2];
else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
- return &selections[2];
+ return &selections[3];
else
- return NULL;
+ return NULL;
}
int
@@ -179,35 +182,37 @@
XSetSelectionOwner(_ecore_x_disp, selection, w, _ecore_x_event_last_time);
if (XGetSelectionOwner(_ecore_x_disp, selection) != w)
- return 0;
+ return 0;
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- in = 0;
+ in = 0;
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- in = 1;
+ in = 1;
+ else if (selection == ECORE_X_ATOM_SELECTION_XDND)
+ in = 2;
else
- in = 2;
-
+ in = 3;
+
if (data)
- {
- selections[in].win = w;
- selections[in].selection = selection;
- selections[in].length = size;
- selections[in].time = _ecore_x_event_last_time;
-
- buf = malloc(size);
- memcpy(buf, data, size);
- selections[in].data = buf;
- }
- else
- {
- if (selections[in].data)
- {
- free(selections[in].data);
- memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
- }
- }
-
+ {
+ selections[in].win = w;
+ selections[in].selection = selection;
+ selections[in].length = size;
+ selections[in].time = _ecore_x_event_last_time;
+
+ buf = malloc(size);
+ memcpy(buf, data, size);
+ selections[in].data = buf;
+ }
+ else
+ {
+ if (selections[in].data)
+ {
+ free(selections[in].data);
+ memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
+ }
+ }
+
return 1;
}
@@ -218,9 +223,6 @@
* @param size The size of the data buffer in bytes
* @return Returns 1 if the ownership of the selection was successfully
* claimed, or 0 if unsuccessful.
- *
- * Get the converted data from a previous PRIMARY selection
- * request. The buffer must be freed when done with.
*/
int
ecore_x_selection_primary_set(Ecore_X_Window w, unsigned char *data, int size)
@@ -247,9 +249,6 @@
* @param size The size of the data buffer in bytes
* @return Returns 1 if the ownership of the selection was successfully
* claimed, or 0 if unsuccessful.
- *
- * Get the converted data from a previous SECONDARY selection
- * request. The buffer must be freed when done with.
*/
int
ecore_x_selection_secondary_set(Ecore_X_Window w, unsigned char *data, int
size)
@@ -270,6 +269,32 @@
}
/**
+ * Claim ownership of the XDND selection and set its data.
+ * @param w The window to which this selection belongs
+ * @param data The data associated with the selection
+ * @param size The size of the data buffer in bytes
+ * @return Returns 1 if the ownership of the selection was successfully
+ * claimed, or 0 if unsuccessful.
+ */
+int
+ecore_x_selection_xdnd_set(Ecore_X_Window w, unsigned char *data, int size)
+{
+ return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_XDND);
+}
+
+/**
+ * Release ownership of the XDND selection
+ * @return Returns 1 if the selection was successfully cleared,
+ * or 0 if unsuccessful.
+ *
+ */
+int
+ecore_x_selection_xdnd_clear(void)
+{
+ return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_XDND);
+}
+
+/**
* Claim ownership of the CLIPBOARD selection and set its data.
* @param w The window to which this selection belongs
* @param data The data associated with the selection
@@ -302,25 +327,25 @@
_ecore_x_selection_target_atom_get(char *target)
{
Atom x_target;
-
+
if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
- x_target = ECORE_X_ATOM_TEXT;
+ x_target = ECORE_X_ATOM_TEXT;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
- x_target = ECORE_X_ATOM_COMPOUND_TEXT;
+ x_target = ECORE_X_ATOM_COMPOUND_TEXT;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
- x_target = ECORE_X_ATOM_STRING;
+ x_target = ECORE_X_ATOM_STRING;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
- x_target = ECORE_X_ATOM_UTF8_STRING;
+ x_target = ECORE_X_ATOM_UTF8_STRING;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
- x_target = ECORE_X_ATOM_FILE_NAME;
+ x_target = ECORE_X_ATOM_FILE_NAME;
else
- {
- char *atom_name;
- atom_name = malloc(strlen(target) + 4);
- sprintf(atom_name, "_E_%s", target);
- x_target = XInternAtom(_ecore_x_disp, atom_name, False);
- free(atom_name);
- }
+ {
+ char *atom_name;
+ atom_name = malloc(strlen(target) + 4);
+ sprintf(atom_name, "_E_%s", target);
+ x_target = XInternAtom(_ecore_x_disp, atom_name, False);
+ free(atom_name);
+ }
return x_target;
}
@@ -329,15 +354,15 @@
_ecore_x_selection_target_get(Atom target)
{
if (target == ECORE_X_ATOM_FILE_NAME)
- return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
+ return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
else if (target == ECORE_X_ATOM_STRING)
- return strdup(ECORE_X_SELECTION_TARGET_STRING);
+ return strdup(ECORE_X_SELECTION_TARGET_STRING);
else if (target == ECORE_X_ATOM_UTF8_STRING)
- return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
+ return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
else if (target == ECORE_X_ATOM_TEXT)
- return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+ return strdup(ECORE_X_SELECTION_TARGET_TEXT);
else
- return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+ return strdup(ECORE_X_SELECTION_TARGET_TEXT);
}
static void
@@ -346,18 +371,16 @@
Ecore_X_Atom target, prop;
target = _ecore_x_selection_target_atom_get(target_str);
-
+
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
- prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
+ prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
- prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
- else if (selection == ECORE_X_ATOM_SELECTION_XDND)
- prop = ECORE_X_ATOM_SELECTION_PROP_XDND;
+ prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
else
- prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
+ prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
XConvertSelection(_ecore_x_disp, selection, target, prop,
- w, _ecore_x_event_last_time);
+ w, _ecore_x_event_last_time);
}
void
@@ -373,6 +396,17 @@
}
void
+ecore_x_selection_xdnd_request(Ecore_X_Window w, char *target)
+{
+ Ecore_X_Atom atom;
+
+ atom = ecore_x_atom_get(target);
+ XConvertSelection(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND, atom,
+ ECORE_X_ATOM_SELECTION_PROP_XDND, w,
+ _ecore_x_event_last_time);
+}
+
+void
ecore_x_selection_clipboard_request(Ecore_X_Window w, char *target)
{
_ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
@@ -402,9 +436,11 @@
cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
cnv = cnv->next;
- } else {
- converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
- cnv = converters;
+ }
+ else
+ {
+ converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
+ cnv = converters;
}
cnv->target = target;
cnv->convert = func;
@@ -416,12 +452,12 @@
int (*func)(char *target, void *data, int size, void **data_ret, int
*size_ret))
{
Ecore_X_Atom x_target;
-
+
if (!func || !target)
- return;
+ return;
x_target = _ecore_x_selection_target_atom_get(target);
-
+
ecore_x_selection_converter_atom_add(x_target, func);
}
@@ -429,17 +465,17 @@
ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
{
Ecore_X_Selection_Converter *cnv, *prev_cnv;
-
+
prev_cnv = NULL;
cnv = converters;
-
+
while (cnv)
{
if (cnv->target == target)
{
- if (target == ECORE_X_ATOM_TEXT ||
- target == ECORE_X_ATOM_COMPOUND_TEXT ||
- target == ECORE_X_ATOM_STRING)
+ if ((target == ECORE_X_ATOM_TEXT) ||
+ (target == ECORE_X_ATOM_COMPOUND_TEXT) ||
+ (target == ECORE_X_ATOM_STRING))
{
cnv->convert = _ecore_x_selection_converter_text;
}
@@ -463,10 +499,10 @@
ecore_x_selection_converter_del(char *target)
{
Ecore_X_Atom x_target;
-
+
if (!target)
- return;
-
+ return;
+
x_target = _ecore_x_selection_target_atom_get(target);
ecore_x_selection_converter_atom_del(x_target);
}
@@ -484,7 +520,7 @@
sel = _ecore_x_selection_get(selection);
tgt_str = _ecore_x_selection_target_get(target);
-
+
for (cnv = converters; cnv; cnv = cnv->next)
{
if (cnv->target == target)
@@ -509,31 +545,32 @@
/* TODO: We need to work out a mechanism for automatic conversion to any
requested
* locale using Ecore_Txt functions */
/* Converter for standard non-utf8 text targets */
-static int _ecore_x_selection_converter_text(char *target, void *data, int
size, void **data_ret, int *size_ret)
+static int
+_ecore_x_selection_converter_text(char *target, void *data, int size, void
**data_ret, int *size_ret)
{
XTextProperty text_prop;
char *mystr;
XICCEncodingStyle style;
-
+
if (!data || !size)
- return 0;
+ return 0;
if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
- style = XTextStyle;
+ style = XTextStyle;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
- style = XCompoundTextStyle;
+ style = XCompoundTextStyle;
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
- style = XStringStyle;
+ style = XStringStyle;
#ifdef X_HAVE_UTF8_STRING
else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
- style = XUTF8StringStyle;
+ style = XUTF8StringStyle;
#endif
else
- return 0;
-
+ return 0;
+
if (!(mystr = strdup(data)))
- return 0;
-
+ return 0;
+
if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop)
== Success)
{
int bufsize = strlen(text_prop.value) + 1;
-------------------------------------------------------
This SF.net email is sponsored by: 2005 Windows Mobile Application Contest
Submit applications for Windows Mobile(tm)-based Pocket PCs or Smartphones
for the chance to win $25,000 and application distribution. Enter today at
http://ads.osdn.com/?ad_id=6882&alloc_id=15148&op=click
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs