Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_events.c ecore_x_private.h ecore_x_selection.c Log Message: Lots of overdue selections code. - Pasting works, but has a little data size-related bug that will be fixed soon. A work around would be to use the returned size (len) to determine the correct data length but this should be done within ecore itself. - Copy code isn't working yet =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- Ecore_X.h 6 Jan 2004 03:42:05 -0000 1.20 +++ Ecore_X.h 10 Jan 2004 21:01:18 -0000 1.21 @@ -22,6 +22,19 @@ typedef void Ecore_X_Reply; #endif +typedef enum _Ecore_X_Selection_Target { + ECORE_X_SELECTION_TARGET_FILENAME, + ECORE_X_SELECTION_TARGET_STRING, + ECORE_X_SELECTION_TARGET_UTF8_STRING, + ECORE_X_SELECTION_TARGET_TEXT +} Ecore_X_Selection_Target; + +typedef enum _Ecore_X_Selection { + ECORE_X_SELECTION_PRIMARY, + ECORE_X_SELECTION_SECONDARY, + ECORE_X_SELECTION_CLIPBOARD +} Ecore_X_Selection; + typedef enum _Ecore_X_Event_Mode { ECORE_X_EVENT_MODE_NORMAL, @@ -358,8 +371,10 @@ struct _Ecore_X_Event_Selection_Notify { - Ecore_X_Window win; - Ecore_X_Window time; + Ecore_X_Window win; + Ecore_X_Time time; + Ecore_X_Selection selection; + Ecore_X_Selection_Target target; }; struct _Ecore_X_Event_Client_Message @@ -553,13 +568,6 @@ } Ecore_X_Window_State; -typedef enum _Ecore_X_Selection_Target { - ECORE_X_SELECTION_TARGET_FILENAME, - ECORE_X_SELECTION_TARGET_STRING, - ECORE_X_SELECTION_TARGET_UTF8_STRING, - ECORE_X_SELECTION_TARGET_TEXT -} Ecore_X_Selection_Target; - int ecore_x_init(const char *name); int ecore_x_shutdown(void); Ecore_X_Display *ecore_x_display_get(void); @@ -581,6 +589,16 @@ int ecore_x_selection_secondary_clear(void); int ecore_x_selection_clipboard_set(Ecore_X_Window w, char *data, int len); int ecore_x_selection_clipboard_clear(void); +void ecore_x_selection_primary_request(Ecore_X_Window w, Ecore_X_Selection_Target t); +void ecore_x_selection_secondary_request(Ecore_X_Window w, Ecore_X_Selection_Target t); +void ecore_x_selection_clipboard_request(Ecore_X_Window w, Ecore_X_Selection_Target t); +void ecore_x_selection_primary_request_data_get(void **buf, int *len); +void ecore_x_selection_secondary_request_data_get(void **buf, int *len); +void ecore_x_selection_clipboard_request_data_get(void **buf, int *len); +Ecore_X_Selection_Target + ecore_x_selection_target_get(Ecore_X_Atom target); +char * ecore_x_selection_convert_to_string(char *data); +char * ecore_x_selection_convert_to_utf8_string(char *data); Ecore_X_Window ecore_x_window_new(Ecore_X_Window parent, int x, int y, int w, int h); 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_events.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_x_events.c 3 Dec 2003 07:23:08 -0000 1.12 +++ ecore_x_events.c 10 Jan 2004 21:01:18 -0000 1.13 @@ -848,21 +848,108 @@ void _ecore_x_event_handle_selection_clear(XEvent *xevent) { - /* FIXME: handle this event type */ - /* This should wrap all the netwm property changes as well as ICCCM, */ - /* the old gnomewm and kde hints, mwm hints and more */ + Ecore_X_Selection_Data *d; + + if(!(d = _ecore_x_selection_get(xevent->xselectionclear.selection))) + return; + if (xevent->xselectionclear.time > d->time) + { + _ecore_x_selection_set(None, NULL, 0, + xevent->xselectionclear.selection); + } } void _ecore_x_event_handle_selection_request(XEvent *xevent) { - /* FIXME: handle this event type */ + Ecore_X_Event_Selection_Request *e; + Ecore_X_Selection_Data *sd; + XSelectionEvent xnotify; + XEvent *xev; + char *data; + + e = calloc(1, sizeof(Ecore_X_Event_Selection_Request)); + e->win = xevent->xselectionrequest.requestor; + e->time = xevent->xselectionrequest.time; + + xev = calloc(1, sizeof(XEvent)); + + xnotify.requestor = xevent->xselectionrequest.requestor; + xnotify.selection = xevent->xselectionrequest.selection; + xnotify.target = xevent->xselectionrequest.target; + xnotify.time = CurrentTime; + + if((sd = _ecore_x_selection_get(xnotify.selection)) + && (sd->win == xevent->xselectionrequest.owner)) + { + /* FIXME: Provide API for user-defined conversion functions */ + if (xnotify.target == _ecore_x_atom_string) + data = ecore_x_selection_convert_to_string(sd->data); + else if (xnotify.target == _ecore_x_atom_utf8_string) + data = ecore_x_selection_convert_to_utf8_string(sd->data); + else + data = sd->data; + + /* FIXME: This does not properly handle large data transfers */ + ecore_x_window_prop_property_set(e->win, + xevent->xselectionrequest.property, + xevent->xselectionrequest.target, + 8, data, sd->length); + xnotify.property = xevent->xselectionrequest.property; + } + else + { + xnotify.property = None; + return; + } + + xev->xselection = xnotify; + XSendEvent(_ecore_x_disp, e->win, False, 0, xev); + /* FIXME: We alloc e but we never actually add it to the event + * queue -- should it be freed or is it still useful? */ + } void _ecore_x_event_handle_selection_notify(XEvent *xevent) { - /* FIXME: handle this event type */ + Ecore_X_Event_Selection_Notify *e; + unsigned char *data = NULL; + Atom selection; + int num_ret; + Ecore_X_Selection_Data sel_data; + + e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify)); + e->win = xevent->xselection.requestor; + e->time = xevent->xselection.time; + 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; + else if (selection == _ecore_x_atom_selection_secondary) + e->selection = ECORE_X_SELECTION_SECONDARY; + else if (selection == _ecore_x_atom_selection_clipboard) + e->selection = ECORE_X_SELECTION_CLIPBOARD; + else + { + free(e); + return; + } + + if (!ecore_x_window_prop_property_get(e->win, xevent->xselection.property, + AnyPropertyType, 8, &data, &num_ret)) + { + free(e); + return; + } + + sel_data.win = e->win; + sel_data.selection = selection; + sel_data.data = data; + 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_generic, NULL); + } void =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- ecore_x_private.h 6 Jan 2004 03:42:05 -0000 1.13 +++ ecore_x_private.h 10 Jan 2004 21:01:18 -0000 1.14 @@ -42,6 +42,7 @@ Atom selection; char *data; int length; + Time time; }; typedef enum _Ecore_X_WM_Protocol { @@ -168,5 +169,9 @@ void _ecore_x_event_handle_client_message(XEvent *xevent); void _ecore_x_event_handle_mapping_notify(XEvent *xevent); void _ecore_x_event_handle_shape_change(XEvent *xevent); + +void _ecore_x_selection_request_data_set(Ecore_X_Selection_Data data); +Ecore_X_Selection_Data * _ecore_x_selection_get(Atom selection); +int _ecore_x_selection_set(Window w, char *data, int len, Atom selection); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_selection.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- ecore_x_selection.c 25 Nov 2003 06:10:18 -0000 1.2 +++ ecore_x_selection.c 10 Jan 2004 21:01:18 -0000 1.3 @@ -1,48 +1,170 @@ #include <Ecore.h> #include "ecore_x_private.h" #include <Ecore_X.h> +#include <Ecore_Txt.h> -static int _ecore_x_selection_set(Ecore_X_Window w, char *data, int len, Ecore_X_Atom selection) +/* FIXME: Initialize! */ +static Ecore_X_Selection_Data selections[3]; +static Ecore_X_Selection_Data request_data[3]; + +static void +_ecore_x_selection_request_data_get(Ecore_X_Atom selection, void **buf, int *len) +{ + int i; + char *data; + if (selection == _ecore_x_atom_selection_primary) + i = 0; + else if (selection == _ecore_x_atom_selection_secondary) + i = 1; + else if (selection == _ecore_x_atom_selection_clipboard) + i = 2; + else + return; + + if (!request_data[i].data || !request_data[i].length) + { + *len = 0; + *buf = NULL; + return; + } + + data = malloc(request_data[i].length); + memcpy(data, request_data[i].data, request_data[i].length); + *len = request_data[i].length; + *buf = data; + return; +} + +void +ecore_x_selection_primary_request_data_get(void **buf, int *len) +{ + _ecore_x_selection_request_data_get(_ecore_x_atom_selection_primary, + buf, len); +} + +void +ecore_x_selection_secondary_request_data_get(void **buf, int *len) +{ + _ecore_x_selection_request_data_get(_ecore_x_atom_selection_secondary, + buf, len); +} + +void +ecore_x_selection_clipboard_request_data_get(void **buf, int *len) +{ + _ecore_x_selection_request_data_get(_ecore_x_atom_selection_clipboard, + buf, len); +} + +void +_ecore_x_selection_request_data_set(Ecore_X_Selection_Data data) +{ + int i; + if (data.selection == _ecore_x_atom_selection_primary) + i = 0; + else if (data.selection == _ecore_x_atom_selection_secondary) + i = 1; + else if (data.selection == _ecore_x_atom_selection_clipboard) + i = 2; + else + return; + + request_data[i] = data; +} + +Ecore_X_Selection_Data * +_ecore_x_selection_get(Atom selection) +{ + if (selection == _ecore_x_atom_selection_primary) + return &selections[0]; + else if (selection == _ecore_x_atom_selection_secondary) + return &selections[1]; + else if (selection == _ecore_x_atom_selection_clipboard) + return &selections[2]; + else + return NULL; +} + +int +_ecore_x_selection_set(Window w, char *data, int len, Atom selection) { + int in; + char *buf = NULL; + XSetSelectionOwner(_ecore_x_disp, selection, w, _ecore_x_event_last_time); if (XGetSelectionOwner(_ecore_x_disp, selection) != w) return 0; + + if (selection == _ecore_x_atom_selection_primary) + in = 0; + else if (selection == _ecore_x_atom_selection_secondary) + in = 1; + else + in = 2; + + if (data) + { + selections[in].win = w; + selections[in].selection = selection; + selections[in].length = len; + selections[in].time = _ecore_x_event_last_time; + + buf = malloc(sizeof(char) * len); + memcpy(buf, data, sizeof(char) * len); + selections[in].data = buf; + } + else + { + if (selections[in].data) + { + free(selections[in].data); + memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data)); + } + } + /* ecore_x_window_prop_property_set(_ecore_x_disp, w, selection, XA_STRING, 8, data, len); */ return 1; } -int ecore_x_selection_primary_set(Ecore_X_Window w, char *data, int len) +int +ecore_x_selection_primary_set(Ecore_X_Window w, char *data, int len) { return _ecore_x_selection_set(w, data, len, _ecore_x_atom_selection_primary); } -int ecore_x_selection_primary_clear(void) +int +ecore_x_selection_primary_clear(void) { return _ecore_x_selection_set(None, NULL, 0, _ecore_x_atom_selection_primary); } -int ecore_x_selection_secondary_set(Ecore_X_Window w, char *data, int len) +int +ecore_x_selection_secondary_set(Ecore_X_Window w, char *data, int len) { return _ecore_x_selection_set(w, data, len, _ecore_x_atom_selection_secondary); } -int ecore_x_selection_secondary_clear(void) +int +ecore_x_selection_secondary_clear(void) { return _ecore_x_selection_set(None, NULL, 0, _ecore_x_atom_selection_secondary); } -int ecore_x_selection_clipboard_set(Ecore_X_Window w, char *data, int len) +int +ecore_x_selection_clipboard_set(Ecore_X_Window w, char *data, int len) { return _ecore_x_selection_set(w, data, len, _ecore_x_atom_selection_clipboard); } -int ecore_x_selection_clipboard_clear(void) +int +ecore_x_selection_clipboard_clear(void) { return _ecore_x_selection_set(None, NULL, 0, _ecore_x_atom_selection_clipboard); } -static void _ecore_x_selection_request(Ecore_X_Window w, Ecore_X_Atom selection, Ecore_X_Selection_Target t) +static void +_ecore_x_selection_request(Ecore_X_Window w, Ecore_X_Atom selection, Ecore_X_Selection_Target t) { Ecore_X_Atom target, prop; @@ -74,18 +196,50 @@ w, _ecore_x_event_last_time); } -void ecore_x_selection_primary_request(Ecore_X_Window w, Ecore_X_Selection_Target t) +void +ecore_x_selection_primary_request(Ecore_X_Window w, Ecore_X_Selection_Target t) { _ecore_x_selection_request(w, _ecore_x_atom_selection_primary, t); } -void ecore_x_selection_secondary_request(Ecore_X_Window w, Ecore_X_Selection_Target t) +void +ecore_x_selection_secondary_request(Ecore_X_Window w, Ecore_X_Selection_Target t) { _ecore_x_selection_request(w, _ecore_x_atom_selection_secondary, t); } -void ecore_x_selection_clipboard_request(Ecore_X_Window w, Ecore_X_Selection_Target t) +void +ecore_x_selection_clipboard_request(Ecore_X_Window w, Ecore_X_Selection_Target t) { _ecore_x_selection_request(w, _ecore_x_atom_selection_clipboard, t); +} + +char * +ecore_x_selection_convert_to_string(char *data) +{ + /* FIXME: Do something */ + return data; +} + +char * +ecore_x_selection_convert_to_utf8_string(char *data) +{ + /* FIXME: Do something */ + return data; +} + +Ecore_X_Selection_Target +ecore_x_selection_target_get(Ecore_X_Atom target) +{ + if (target == _ecore_x_atom_file_name) + return ECORE_X_SELECTION_TARGET_FILENAME; + else if (target == _ecore_x_atom_string) + return ECORE_X_SELECTION_TARGET_STRING; + else if (target == _ecore_x_atom_utf8_string) + return ECORE_X_SELECTION_TARGET_UTF8_STRING; + else if (target == _ecore_x_atom_text) + return ECORE_X_SELECTION_TARGET_TEXT; + else + return ECORE_X_SELECTION_TARGET_TEXT; } ------------------------------------------------------- This SF.net email is sponsored by: Perforce Software. Perforce is the Fast Software Configuration Management System offering advanced branching capabilities and atomic changes on 50+ platforms. Free Eval! http://www.perforce.com/perforce/loadprog.html _______________________________________________ enlightenment-cvs mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs