From: Hyoyoung Chang <hyoyoung@gmail.com>

Subject: [E-devel] [patch] elm_cnp_helper - change elm_cnp_selection_set and code cleanup
Date: Tue, 27 Dec 2011 20:15:14 +0900

Dear all.

As discomfitor suggested, I cleanup some codes.
elm_cnp_selection_set : add buffer length argument and check for image type.
(i think it's urgent issue before elm_cnp_selection_set api is widely used.)
enum defines : add 'type' prefix.

Thanks


SVN revision: 66566
This commit is contained in:
Hyoyoung Chang 2011-12-27 11:24:13 +00:00 committed by Mike Blumenkrantz
parent 90d1d1635e
commit 84554addb8
4 changed files with 97 additions and 70 deletions

View File

@ -30414,30 +30414,30 @@ extern "C" {
typedef enum _Elm_Sel_Type
{
ELM_SEL_PRIMARY,
ELM_SEL_SECONDARY,
ELM_SEL_CLIPBOARD,
ELM_SEL_XDND,
ELM_SEL_TYPE_PRIMARY,
ELM_SEL_TYPE_SECONDARY,
ELM_SEL_TYPE_CLIPBOARD,
ELM_SEL_TYPE_XDND,
ELM_SEL_MAX,
ELM_SEL_TYPE_MAX,
} Elm_Sel_Type;
typedef enum _Elm_Sel_Format
{
/** Targets: for matching every atom requesting */
ELM_SEL_TARGETS = -1,
ELM_SEL_FORMAT_TARGETS = -1,
/** they come from outside of elm */
ELM_SEL_FORMAT_NONE = 0x0,
ELM_SEL_FORMAT_NONE = 0x0,
/** Plain unformated text: Used for things that don't want rich markup */
ELM_SEL_FORMAT_TEXT = 0x01,
ELM_SEL_FORMAT_TEXT = 0x01,
/** Edje textblock markup, including inline images */
ELM_SEL_FORMAT_MARKUP = 0x02,
ELM_SEL_FORMAT_MARKUP = 0x02,
/** Images */
ELM_SEL_FORMAT_IMAGE = 0x04,
ELM_SEL_FORMAT_IMAGE = 0x04,
/** Vcards */
ELM_SEL_FORMAT_VCARD = 0x08,
ELM_SEL_FORMAT_VCARD = 0x08,
/** Raw HTMLish things for widgets that want that stuff (hello webkit!) */
ELM_SEL_FORMAT_HTML = 0x10,
ELM_SEL_FORMAT_HTML = 0x10,
ELM_SEL_FORMAT_MAX
} Elm_Sel_Format;
@ -30445,9 +30445,9 @@ extern "C" {
struct _Elm_Selection_Data
{
int x, y;
Elm_Sel_Format format;
Elm_Sel_Format format;
void *data;
int len;
size_t len;
};
/**
@ -30466,7 +30466,7 @@ extern "C" {
*
*/
EAPI Eina_Bool elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget, Elm_Sel_Format format, const char *buf);
EAPI Eina_Bool elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget, Elm_Sel_Format format, const void *buf, size_t buflen);
/**
* @brief Retrive the data from the widget which is set for copying and pasting.

View File

@ -62,19 +62,19 @@ enum
struct _Cnp_Selection
{
const char *debug;
Evas_Object *widget;
char *selbuf;
Evas_Object *requestwidget;
void *udata;
Elm_Sel_Format requestformat;
Elm_Drop_Cb datacb;
const char *debug;
Evas_Object *widget;
char *selbuf;
Evas_Object *requestwidget;
void *udata;
Elm_Sel_Format requestformat;
Elm_Drop_Cb datacb;
Eina_Bool (*set) (Ecore_X_Window, const void *data, int size);
Eina_Bool (*clear) (void);
void (*request) (Ecore_X_Window, const char *target);
Elm_Sel_Format format;
Ecore_X_Selection ecore_sel;
Elm_Sel_Format format;
Ecore_X_Selection ecore_sel;
Eina_Bool active : 1;
};
@ -82,7 +82,7 @@ struct _Cnp_Selection
struct _Escape
{
const char *escape;
const char *value;
const char *value;
};
struct _Tmp_Info
@ -96,7 +96,7 @@ struct _Tmp_Info
struct _Cnp_Atom
{
const char *name;
Elm_Sel_Format formats;
Elm_Sel_Format formats;
/* Called by ecore to do conversion */
Converter_Fn_Cb converter;
Response_Handler_Cb response;
@ -116,11 +116,11 @@ struct _Saved_Type
struct _Dropable
{
Evas_Object *obj;
Evas_Object *obj;
/* FIXME: Cache window */
Elm_Sel_Format types;
Elm_Drop_Cb dropcb;
void *cbdata;
Elm_Sel_Format types;
Elm_Drop_Cb dropcb;
void *cbdata;
};
static Tmp_Info *elm_cnp_tempfile_create(int size);
@ -168,7 +168,7 @@ static const Escape escapes[] = {
static Cnp_Atom atoms[CNP_N_ATOMS] = {
[CNP_ATOM_TARGETS] = {
"TARGETS",
ELM_SEL_TARGETS,
ELM_SEL_FORMAT_TARGETS,
targets_converter,
response_handler_targets,
notify_handler_targets,
@ -176,7 +176,7 @@ static Cnp_Atom atoms[CNP_N_ATOMS] = {
},
[CNP_ATOM_ATOM] = {
"ATOM", // for opera browser
ELM_SEL_TARGETS,
ELM_SEL_FORMAT_TARGETS,
targets_converter,
response_handler_targets,
notify_handler_targets,
@ -342,29 +342,29 @@ static Cnp_Atom atoms[CNP_N_ATOMS] = {
},
};
static Cnp_Selection selections[ELM_SEL_MAX] = {
ARRAYINIT(ELM_SEL_PRIMARY) {
static Cnp_Selection selections[ELM_SEL_TYPE_MAX] = {
ARRAYINIT(ELM_SEL_TYPE_PRIMARY) {
.debug = "Primary",
.ecore_sel = ECORE_X_SELECTION_PRIMARY,
.set = ecore_x_selection_primary_set,
.clear = ecore_x_selection_primary_clear,
.request = ecore_x_selection_primary_request,
},
ARRAYINIT(ELM_SEL_SECONDARY) {
ARRAYINIT(ELM_SEL_TYPE_SECONDARY) {
.debug = "Secondary",
.ecore_sel = ECORE_X_SELECTION_SECONDARY,
.set = ecore_x_selection_secondary_set,
.clear = ecore_x_selection_secondary_clear,
.request = ecore_x_selection_secondary_request,
},
ARRAYINIT(ELM_SEL_CLIPBOARD) {
ARRAYINIT(ELM_SEL_TYPE_CLIPBOARD) {
.debug = "Clipboard",
.ecore_sel = ECORE_X_SELECTION_CLIPBOARD,
.set = ecore_x_selection_clipboard_set,
.clear = ecore_x_selection_clipboard_clear,
.request = ecore_x_selection_clipboard_request,
},
ARRAYINIT(ELM_SEL_XDND) {
ARRAYINIT(ELM_SEL_TYPE_XDND) {
.debug = "XDnD",
.ecore_sel = ECORE_X_SELECTION_XDND,
.request = ecore_x_selection_xdnd_request,
@ -408,7 +408,8 @@ elm_selection_selection_has_owner(void)
}
Eina_Bool
elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget, Elm_Sel_Format format, const char *selbuf)
elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget,
Elm_Sel_Format format, const void *selbuf, size_t buflen)
{
#ifdef HAVE_ELEMENTARY_X
Evas_Object *top = elm_widget_top_get(widget);
@ -418,7 +419,8 @@ elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget, Elm_Sel_Forma
if (top) xwin = elm_win_xwindow_get(top);
else xwin = elm_win_xwindow_get(widget);
if (!xwin) return EINA_FALSE;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_MAX) return EINA_FALSE;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_TYPE_MAX)
return EINA_FALSE;
if (!_elm_cnp_init_count) _elm_cnp_init();
if ((!selbuf) && (format != ELM_SEL_FORMAT_IMAGE))
return elm_cnp_selection_clear(selection, widget);
@ -430,7 +432,20 @@ elm_cnp_selection_set(Elm_Sel_Type selection, Evas_Object *widget, Elm_Sel_Forma
sel->set(xwin, &selection, sizeof(Elm_Sel_Type));
sel->format = format;
sel->selbuf = selbuf ? strdup(selbuf) : NULL;
if (selbuf)
{
if (format == ELM_SEL_FORMAT_IMAGE)
{
sel->selbuf = malloc(buflen+1);
memcpy(sel->selbuf, selbuf, buflen);
}
else
sel->selbuf = strdup((char*)selbuf);
}
else
sel->selbuf = NULL;
return EINA_TRUE;
#else
@ -444,7 +459,8 @@ elm_cnp_selection_clear(Elm_Sel_Type selection, Evas_Object *widget)
#ifdef HAVE_ELEMENTARY_X
Cnp_Selection *sel;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_MAX) return EINA_FALSE;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_TYPE_MAX)
return EINA_FALSE;
if (!_elm_cnp_init_count) _elm_cnp_init();
sel = selections + selection;
@ -454,6 +470,9 @@ elm_cnp_selection_clear(Elm_Sel_Type selection, Evas_Object *widget)
sel->active = EINA_FALSE;
sel->widget = NULL;
if (sel->selbuf)
free(sel->selbuf);
sel->selbuf = NULL;
sel->clear();
return EINA_TRUE;
@ -464,13 +483,14 @@ elm_cnp_selection_clear(Elm_Sel_Type selection, Evas_Object *widget)
Eina_Bool
elm_cnp_selection_get(Elm_Sel_Type selection, Elm_Sel_Format format,
Evas_Object *widget, Elm_Drop_Cb datacb, void *udata)
Evas_Object *widget, Elm_Drop_Cb datacb, void *udata)
{
#ifdef HAVE_ELEMENTARY_X
Evas_Object *top;
Cnp_Selection *sel;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_MAX) return EINA_FALSE;
if ((unsigned int)selection >= (unsigned int)ELM_SEL_TYPE_MAX)
return EINA_FALSE;
if (!_elm_cnp_init_count) _elm_cnp_init();
sel = selections + selection;
@ -518,17 +538,19 @@ selection_clear(void *udata __UNUSED__, int type __UNUSED__, void *event)
Cnp_Selection *sel;
int i;
for (i = 0; i < ELM_SEL_MAX; i++)
for (i = 0; i < ELM_SEL_TYPE_MAX; i++)
{
if (selections[i].ecore_sel == ev->selection) break;
}
cnp_debug("selection %d clear\n", i);
/* Not me... Don't care */
if (i == ELM_SEL_MAX) return ECORE_CALLBACK_PASS_ON;
if (i == ELM_SEL_TYPE_MAX) return ECORE_CALLBACK_PASS_ON;
sel = selections + i;
sel->active = 0;
sel->active = EINA_FALSE;
sel->widget = NULL;
if (sel->selbuf)
free(sel->selbuf);
sel->selbuf = NULL;
return ECORE_CALLBACK_PASS_ON;
@ -552,16 +574,16 @@ selection_notify(void *udata __UNUSED__, int type __UNUSED__, void *event)
switch (ev->selection)
{
case ECORE_X_SELECTION_CLIPBOARD:
sel = selections + ELM_SEL_CLIPBOARD;
sel = selections + ELM_SEL_TYPE_CLIPBOARD;
break;
case ECORE_X_SELECTION_PRIMARY:
sel = selections + ELM_SEL_PRIMARY;
sel = selections + ELM_SEL_TYPE_PRIMARY;
break;
case ECORE_X_SELECTION_SECONDARY:
sel = selections + ELM_SEL_SECONDARY;
sel = selections + ELM_SEL_TYPE_SECONDARY;
break;
case ECORE_X_SELECTION_XDND:
sel = selections + ELM_SEL_XDND;
sel = selections + ELM_SEL_TYPE_XDND;
break;
default:
return ECORE_CALLBACK_PASS_ON;
@ -595,7 +617,8 @@ _get_selection_type(void *data, int size)
Cnp_Selection *sel;
sel = selections + *((int *)data);
if (sel->active &&
(sel->format >= ELM_SEL_TARGETS) && (sel->format < ELM_SEL_FORMAT_MAX))
(sel->format >= ELM_SEL_FORMAT_TARGETS) &&
(sel->format < ELM_SEL_FORMAT_MAX))
return sel->format;
}
return ELM_SEL_FORMAT_NONE;
@ -876,7 +899,7 @@ vcard_receive(Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify)
data = notify->data;
cnp_debug("vcard receive\n");
if (sel == (selections + ELM_SEL_XDND))
if (sel == (selections + ELM_SEL_TYPE_XDND))
{
Elm_Selection_Data ddata;
@ -1372,9 +1395,9 @@ found:
}
cnp_debug("doing a request then\n");
selections[ELM_SEL_XDND].requestwidget = dropable->obj;
selections[ELM_SEL_XDND].requestformat = ELM_SEL_FORMAT_MARKUP;
selections[ELM_SEL_XDND].active = EINA_TRUE;
selections[ELM_SEL_TYPE_XDND].requestwidget = dropable->obj;
selections[ELM_SEL_TYPE_XDND].requestformat = ELM_SEL_FORMAT_MARKUP;
selections[ELM_SEL_TYPE_XDND].active = EINA_TRUE;
ecore_x_selection_xdnd_request(xwin, atoms[i].name);
@ -1545,7 +1568,7 @@ _drag_mouse_up(void *un __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *
ecore_x_dnd_drop();
if (dragdonecb)
{
dragdonecb(dragdonecb,selections[ELM_SEL_XDND].widget);
dragdonecb(dragdonecb,selections[ELM_SEL_TYPE_XDND].widget);
dragdonecb = NULL;
}
if (dragwin)
@ -1569,7 +1592,7 @@ elm_drag_start(Evas_Object *obj, Elm_Sel_Format format, const char *data, void (
{
Ecore_X_Window xwin;
Cnp_Selection *sel;
Elm_Sel_Type xdnd = ELM_SEL_XDND;
Elm_Sel_Type xdnd = ELM_SEL_TYPE_XDND;
Ecore_Evas *ee;
int x, y, x2, y2, x3, y3;
Evas_Object *icon;
@ -1582,7 +1605,7 @@ elm_drag_start(Evas_Object *obj, Elm_Sel_Format format, const char *data, void (
cnp_debug("starting drag...\n");
ecore_x_dnd_type_set(xwin, "text/uri-list", 1);
sel = selections + ELM_SEL_XDND;
sel = selections + ELM_SEL_TYPE_XDND;
sel->active = 1;
sel->widget = obj;
sel->format = format;

View File

@ -1126,7 +1126,7 @@ _paste(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
formats = ELM_SEL_FORMAT_MARKUP;
if (!wd->textonly)
formats |= ELM_SEL_FORMAT_IMAGE;
elm_cnp_selection_get(ELM_SEL_CLIPBOARD, formats, data, NULL, NULL);
elm_cnp_selection_get(ELM_SEL_TYPE_CLIPBOARD, formats, data, NULL, NULL);
#endif
}
}
@ -1140,8 +1140,8 @@ _store_selection(Elm_Sel_Type seltype, Evas_Object *obj)
if (!wd) return;
sel = edje_object_part_text_selection_get(wd->ent, "elm.text");
if ((!sel) || (!sel[0])) return; /* avoid deleting our own selection */
elm_cnp_selection_set(seltype, obj, ELM_SEL_FORMAT_MARKUP, sel);
if (seltype == ELM_SEL_CLIPBOARD)
elm_cnp_selection_set(seltype, obj, ELM_SEL_FORMAT_MARKUP, sel, strlen(sel));
if (seltype == ELM_SEL_TYPE_CLIPBOARD)
eina_stringshare_replace(&wd->cut_sel, sel);
}
@ -1157,7 +1157,7 @@ _cut(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
edje_object_signal_emit(wd->ent, "elm,state,select,off", "elm");
if (!_elm_config->desktop_entry)
elm_widget_scroll_hold_pop(data);
_store_selection(ELM_SEL_CLIPBOARD, data);
_store_selection(ELM_SEL_TYPE_CLIPBOARD, data);
edje_object_part_text_insert(wd->ent, "elm.text", "");
edje_object_part_text_select_none(wd->ent, "elm.text");
_sizing_eval(data);
@ -1175,7 +1175,7 @@ _copy(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
edje_object_signal_emit(wd->ent, "elm,state,select,off", "elm");
elm_widget_scroll_hold_pop(data);
}
_store_selection(ELM_SEL_CLIPBOARD, data);
_store_selection(ELM_SEL_TYPE_CLIPBOARD, data);
// edje_object_part_text_select_none(wd->ent, "elm.text");
}
@ -1531,7 +1531,8 @@ _signal_selection_start(void *data, Evas_Object *obj __UNUSED__, const char *emi
top = elm_widget_top_get(data);
if ((top) && (elm_win_xwindow_get(top)))
elm_cnp_selection_set(ELM_SEL_PRIMARY, data, ELM_SEL_FORMAT_MARKUP, txt);
elm_cnp_selection_set(ELM_SEL_TYPE_PRIMARY, data,
ELM_SEL_FORMAT_MARKUP, txt, strlen(txt));
}
#endif
}
@ -1559,7 +1560,7 @@ _signal_selection_changed(void *data, Evas_Object *obj __UNUSED__, const char *e
if (!wd) return;
wd->have_selection = EINA_TRUE;
evas_object_smart_callback_call(data, SIG_SELECTION_CHANGED, NULL);
_store_selection(ELM_SEL_PRIMARY, data);
_store_selection(ELM_SEL_TYPE_PRIMARY, data);
}
static void
@ -1579,8 +1580,9 @@ _signal_selection_cleared(void *data, Evas_Object *obj __UNUSED__, const char *e
top = elm_widget_top_get(data);
if ((top) && (elm_win_xwindow_get(top)))
elm_cnp_selection_set(ELM_SEL_PRIMARY, data, ELM_SEL_FORMAT_MARKUP,
wd->cut_sel);
elm_cnp_selection_set(ELM_SEL_TYPE_PRIMARY, data,
ELM_SEL_FORMAT_MARKUP, wd->cut_sel,
strlen(wd->cut_sel));
#endif
eina_stringshare_del(wd->cut_sel);
wd->cut_sel = NULL;
@ -1592,7 +1594,7 @@ _signal_selection_cleared(void *data, Evas_Object *obj __UNUSED__, const char *e
top = elm_widget_top_get(data);
if ((top) && (elm_win_xwindow_get(top)))
elm_cnp_selection_clear(ELM_SEL_PRIMARY, data);
elm_cnp_selection_clear(ELM_SEL_TYPE_PRIMARY, data);
#endif
}
}
@ -1602,7 +1604,8 @@ static void
_signal_entry_paste_request(void *data, Evas_Object *obj __UNUSED__, const char *emission, const char *source __UNUSED__)
{
Widget_Data *wd = elm_widget_data_get(data);
Elm_Sel_Type type = (emission[sizeof("ntry,paste,request,")] == '1') ? ELM_SEL_PRIMARY : ELM_SEL_CLIPBOARD;
Elm_Sel_Type type = (emission[sizeof("ntry,paste,request,")] == '1') ?
ELM_SEL_TYPE_PRIMARY : ELM_SEL_TYPE_CLIPBOARD;
if (!wd) return;
evas_object_smart_callback_call(data, SIG_SELECTION_PASTE, NULL);
if (wd->sel_notify_handler)

View File

@ -189,7 +189,8 @@ _longpress(void *objv)
/* FIXME: Deal with relative paths */
buf = malloc(strlen(file) + strlen("file://") + 1);
sprintf(buf, "%s%s","file://",file);
elm_drag_start(objv, ELM_SEL_FORMAT_IMAGE, buf, _drag_done_cb, NULL);
elm_drag_start(objv, ELM_SEL_FORMAT_IMAGE,
buf, _drag_done_cb, NULL);
free(buf);
}
elm_object_scroll_freeze_push(objv);