diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index 44d78957cc..320c438f34 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -563,6 +563,7 @@ struct _Ecore_X_Selection_Data } content; unsigned char *data; int length; + int format; int (*free)(void *data); }; @@ -1001,7 +1002,7 @@ EAPI void ecore_x_selection_converter_add(char *target, int (*func)( 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); EAPI void ecore_x_selection_converter_atom_del(Ecore_X_Atom target); -EAPI void ecore_x_selection_parser_add(const char *target, void *(*func)(const char *target, unsigned char *data, int size)); +EAPI void ecore_x_selection_parser_add(const char *target, void *(*func)(const char *target, unsigned char *data, int size, int format)); EAPI void ecore_x_selection_parser_del(const char *target); EAPI void ecore_x_dnd_aware_set(Ecore_X_Window win, int on); diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c index 9260f7fed4..da21b4fe2a 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c @@ -1160,27 +1160,26 @@ _ecore_x_event_handle_selection_notify(XEvent *xevent) unsigned char *data = NULL; Ecore_X_Atom selection; int num_ret; + int format; selection = xevent->xselection.selection; if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS) { - if (!ecore_x_window_prop_property_get(xevent->xselection.requestor, - xevent->xselection.property, - XA_ATOM, 32, &data, &num_ret)) + format = ecore_x_window_prop_property_get(xevent->xselection.requestor, + xevent->xselection.property, + XA_ATOM, 32, &data, &num_ret); + if (!format) return; } else { - if (!ecore_x_window_prop_property_get(xevent->xselection.requestor, - xevent->xselection.property, - AnyPropertyType, 8, &data, &num_ret)) - { - if (!ecore_x_window_prop_property_get(xevent->xselection.requestor, - xevent->xselection.property, - AnyPropertyType, 16, &data, &num_ret)) - return; - } + format = ecore_x_window_prop_property_get(xevent->xselection.requestor, + xevent->xselection.property, + AnyPropertyType, 8, &data, + &num_ret); + if (!format) + return; } e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify)); @@ -1202,7 +1201,7 @@ _ecore_x_event_handle_selection_notify(XEvent *xevent) free(e); return; } - e->data = _ecore_x_selection_parse(e->target, data, num_ret); + e->data = _ecore_x_selection_parse(e->target, data, num_ret, format); ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e, _ecore_x_event_free_selection_notify, NULL); } diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h index 0cce458724..0400d4a533 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h @@ -90,7 +90,7 @@ typedef struct _Ecore_X_Selection_Parser Ecore_X_Selection_Parser; struct _Ecore_X_Selection_Parser { char *target; - void *(*parse)(const char *target, unsigned char *data, int size); + void *(*parse)(const char *target, unsigned char *data, int size, int format); Ecore_X_Selection_Parser *next; }; @@ -215,7 +215,7 @@ Ecore_X_Selection_Intern * _ecore_x_selection_get(Ecore_X_Atom selection); int _ecore_x_selection_set(Window w, unsigned char *data, int len, Ecore_X_Atom selection); int _ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret); -void *_ecore_x_selection_parse(const char *target, unsigned char *data, int size); +void *_ecore_x_selection_parse(const char *target, unsigned char *data, int size, int format); void _ecore_x_sync_magic_send(int val, Ecore_X_Window swin); void _ecore_x_window_grab_remove(Ecore_X_Window win); diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c b/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c index e62d506406..3590004b0a 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c @@ -13,11 +13,11 @@ static Ecore_X_Selection_Parser *parsers = NULL; static int _ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret); static int _ecore_x_selection_data_default_free(void *data); -static void *_ecore_x_selection_parser_files(const char *target, unsigned char *data, int size); +static void *_ecore_x_selection_parser_files(const char *target, unsigned char *data, int size, int format); static int _ecore_x_selection_data_files_free(void *data); -static void *_ecore_x_selection_parser_text(const char *target, unsigned char *data, int size); +static void *_ecore_x_selection_parser_text(const char *target, unsigned char *data, int size, int format); static int _ecore_x_selection_data_text_free(void *data); -static void *_ecore_x_selection_parser_targets(const char *target, unsigned char *data, int size); +static void *_ecore_x_selection_parser_targets(const char *target, unsigned char *data, int size, int format); static int _ecore_x_selection_data_targets_free(void *data); #define ECORE_X_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x)) @@ -523,7 +523,7 @@ _ecore_x_selection_converter_text(char *target, void *data, int size, void **dat EAPI void ecore_x_selection_parser_add(const char *target, - void *(*func)(const char *target, unsigned char *data, int size)) + void *(*func)(const char *target, unsigned char *data, int size, int format)) { Ecore_X_Selection_Parser *prs; @@ -586,7 +586,7 @@ ecore_x_selection_parser_del(const char *target) /* Locate and run conversion callback for specified selection target */ void * -_ecore_x_selection_parse(const char *target, unsigned char *data, int size) +_ecore_x_selection_parse(const char *target, unsigned char *data, int size, int format) { Ecore_X_Selection_Parser *prs; Ecore_X_Selection_Data *sel; @@ -595,7 +595,7 @@ _ecore_x_selection_parse(const char *target, unsigned char *data, int size) { if (!strcmp(prs->target, target)) { - sel = prs->parse(target, data, size); + sel = prs->parse(target, data, size, format); return sel; } } @@ -604,6 +604,7 @@ _ecore_x_selection_parse(const char *target, unsigned char *data, int size) sel = calloc(1, sizeof(Ecore_X_Selection_Data)); sel->free = _ecore_x_selection_data_default_free; sel->length = size; + sel->format = format; sel->data = data; return sel; } @@ -620,7 +621,7 @@ _ecore_x_selection_data_default_free(void *data) } static void * -_ecore_x_selection_parser_files(const char *target, unsigned char *data, int size) +_ecore_x_selection_parser_files(const char *target, unsigned char *data, int size, int format) { Ecore_X_Selection_Data_Files *sel; int i, is; @@ -703,7 +704,7 @@ _ecore_x_selection_data_files_free(void *data) } static void * -_ecore_x_selection_parser_text(const char *target __UNUSED__, unsigned char *data, int size) +_ecore_x_selection_parser_text(const char *target __UNUSED__, unsigned char *data, int size, int format) { Ecore_X_Selection_Data_Text *sel; @@ -736,7 +737,7 @@ _ecore_x_selection_data_text_free(void *data) } static void * -_ecore_x_selection_parser_targets(const char *target __UNUSED__, unsigned char *data, int size) +_ecore_x_selection_parser_targets(const char *target __UNUSED__, unsigned char *data, int size, int format) { Ecore_X_Selection_Data_Targets *sel; unsigned long *targets; diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_window_prop.c b/legacy/ecore/src/lib/ecore_x/ecore_x_window_prop.c index d8cbd1804e..ca97fbe83c 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_window_prop.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_window_prop.c @@ -457,17 +457,17 @@ ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecor if (ret != Success) return 0; - if (size != size_ret || !num_ret) { + if (!num_ret) { XFree(prop_ret); return 0; } - if (!(*data = malloc(num_ret * size / 8))) { + if (!(*data = malloc(num_ret * size_ret / 8))) { XFree(prop_ret); return 0; } - switch (size) { + switch (size_ret) { case 8: for (i = 0; i < num_ret; i++) (*data)[i] = prop_ret[i]; @@ -485,7 +485,7 @@ ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecor XFree(prop_ret); if (num) *num = num_ret; - return 1; + return size_ret; } EAPI void