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;
struct _Elm_Selection_Data
{
int x, y;
- Elm_Sel_Format format;
+ Elm_Sel_Format format;
void *data;
- int len;
+ size_t len;
};
/**
*
*/
- 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.
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;
};
struct _Escape
{
const char *escape;
- const char *value;
+ const char *value;
};
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;
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);
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,
},
[CNP_ATOM_ATOM] = {
"ATOM", // for opera browser
- ELM_SEL_TARGETS,
+ ELM_SEL_FORMAT_TARGETS,
targets_converter,
response_handler_targets,
notify_handler_targets,
},
};
-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,
}
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);
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);
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
#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;
sel->active = EINA_FALSE;
sel->widget = NULL;
+ if (sel->selbuf)
+ free(sel->selbuf);
+ sel->selbuf = NULL;
sel->clear();
return EINA_TRUE;
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;
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;
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;
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;
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;
}
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);
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)
{
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;
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;
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
}
}
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);
}
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);
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");
}
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
}
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
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;
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
}
}
_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)