forked from enlightenment/efl
Allow data formats other than the specified format when fetching properties.
Pass the actual data format along with property data. SVN revision: 26206
This commit is contained in:
parent
d796ac9023
commit
965166056b
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue