Enlightenment CVS committal Author : ningerso Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_events.c ecore_x_selection.c Log Message: Allow for handling the selection data conversion externally from ecore_x, but provide the same auto-conversion when data is set for the selection. This should work identically as before, except if the app relied on ecore to send the notification when no data was present, please test your apps. =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.176 retrieving revision 1.177 diff -u -3 -r1.176 -r1.177 --- Ecore_X.h 2 Dec 2006 06:37:51 -0000 1.176 +++ Ecore_X.h 11 Dec 2006 23:05:48 -0000 1.177 @@ -539,7 +539,8 @@ struct _Ecore_X_Event_Selection_Request { - Ecore_X_Window win; + Ecore_X_Window owner; + Ecore_X_Window requestor; Ecore_X_Time time; Ecore_X_Atom selection; Ecore_X_Atom target; @@ -989,6 +990,7 @@ EAPI void ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask); EAPI void ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask); +EAPI int ecore_x_selection_notify_send(Ecore_X_Window requestor, Ecore_X_Atom selection, Ecore_X_Atom target, Ecore_X_Atom property); EAPI int ecore_x_selection_primary_set(Ecore_X_Window w, const void *data, int size); EAPI int ecore_x_selection_primary_clear(void); EAPI int ecore_x_selection_secondary_set(Ecore_X_Window w, const void *data, int size); @@ -1001,6 +1003,7 @@ EAPI void ecore_x_selection_secondary_request(Ecore_X_Window w, const char *target); EAPI void ecore_x_selection_xdnd_request(Ecore_X_Window w, const char *target); EAPI void ecore_x_selection_clipboard_request(Ecore_X_Window w, const char *target); +EAPI int ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret); 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)); EAPI void ecore_x_selection_converter_del(char *target); =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -3 -r1.89 -r1.90 --- ecore_x_events.c 2 Dec 2006 06:37:51 -0000 1.89 +++ ecore_x_events.c 11 Dec 2006 23:05:48 -0000 1.90 @@ -1110,59 +1110,55 @@ { Ecore_X_Event_Selection_Request *e; Ecore_X_Selection_Intern *sd; - XSelectionEvent xnotify; - XEvent xev; void *data; /* * Generate a selection request event. */ e = malloc(sizeof(Ecore_X_Event_Selection_Request)); - e->win = xevent->xselectionrequest.requestor; + e->owner = xevent->xselectionrequest.owner; + e->requestor = xevent->xselectionrequest.requestor; e->time = xevent->xselectionrequest.time; e->selection = xevent->xselectionrequest.selection; e->target = xevent->xselectionrequest.target; e->property = xevent->xselectionrequest.property; ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL); - xnotify.type = SelectionNotify; - xnotify.display = xevent->xselectionrequest.display; - xnotify.requestor = xevent->xselectionrequest.requestor; - xnotify.selection = xevent->xselectionrequest.selection; - xnotify.target = xevent->xselectionrequest.target; - xnotify.time = CurrentTime; - xnotify.send_event = True; - xnotify.serial = 0; - - if ((sd = _ecore_x_selection_get(xnotify.selection)) && + if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.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 + Ecore_X_Selection_Intern *si; + + si = _ecore_x_selection_get(xevent->xselectionrequest.selection); + if (si->data) { - /* 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); + Ecore_X_Atom property; + + if (!ecore_x_selection_convert(xevent->xselectionrequest.selection, + xevent->xselectionrequest.target, + &data) == -1) + { + /* Refuse selection, conversion to requested target failed */ + 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); + property = xevent->xselectionrequest.property; + free(data); + } + + ecore_x_selection_notify_send(xevent->xselectionrequest.requestor, + xevent->xselectionrequest.selection, + xevent->xselectionrequest.target, + property); } } - else - { - xnotify.property = None; - return; - } - - xev.xselection = xnotify; - XSendEvent(xevent->xselectionrequest.display, - xevent->xselectionrequest.requestor, False, 0, &xev); + return; } void =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_x/ecore_x_selection.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -3 -r1.31 -r1.32 --- ecore_x_selection.c 5 Nov 2006 15:14:49 -0000 1.31 +++ ecore_x_selection.c 11 Dec 2006 23:05:48 -0000 1.32 @@ -425,9 +425,29 @@ ecore_x_selection_converter_atom_del(x_target); } +EAPI int +ecore_x_selection_notify_send(Ecore_X_Window requestor, Ecore_X_Atom selection, Ecore_X_Atom target, Ecore_X_Atom property) +{ + XEvent xev; + XSelectionEvent xnotify; + + xnotify.type = SelectionNotify; + xnotify.display = _ecore_x_disp; + xnotify.requestor = requestor; + xnotify.selection = selection; + xnotify.target = target; + xnotify.property = property; + xnotify.time = CurrentTime; + xnotify.send_event = True; + xnotify.serial = 0; + + xev.xselection = xnotify; + return ((XSendEvent(_ecore_x_disp, requestor, False, 0, &xev) > 0) ? 1 : 0); +} + /* Locate and run conversion callback for specified selection target */ -int -_ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret) +EAPI int +ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret) { Ecore_X_Selection_Intern *sel; Ecore_X_Selection_Converter *cnv; ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs