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:
ningerso 2006-09-29 05:49:14 +00:00 committed by ningerso
parent d796ac9023
commit 965166056b
5 changed files with 30 additions and 29 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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