static Ecore_X_Window _x11_elm_widget_xwin_get(const Evas_Object *obj);
static Tmp_Info *_tempfile_new (int size);
static int _tmpinfo_free (Tmp_Info *tmp);
-static Eina_Bool _pasteimage_append (char *file, Evas_Object *entry);
typedef struct _X11_Cnp_Selection X11_Cnp_Selection;
ddata.action = sel->action;
sel->datacb(sel->udata, sel->widget, &ddata);
}
- else
- {
- char *stripstr, *mkupstr;
-
- stripstr = malloc(data->length + 1);
- if (!stripstr) goto end;
- strncpy(stripstr, (char *)data->data, data->length);
- stripstr[data->length] = '\0';
- cnp_debug("Notify handler text %d %d %p\n", data->format,
- data->length, data->data);
- mkupstr = _elm_util_text_to_mkup((const char *)stripstr);
-
- if (!mkupstr)
- {
- ERR("Failed to convert text to markup text!");
- free(stripstr);
- goto end;
- }
+ else cnp_debug("Paste request\n");
- cnp_debug("String is %s (from %s)\n", stripstr, data->data);
- /* TODO BUG: should never NEVER assume it's an elm_entry! */
- _elm_entry_entry_paste(sel->requestwidget, mkupstr);
- free(stripstr);
- free(mkupstr);
- }
end:
if (sel == (_x11_selections + ELM_SEL_TYPE_XDND))
ecore_x_dnd_send_finished();
cbs->dropcb(cbs->dropdata, dropable->obj, &ddata);
}
}
- else
+ else if (sel->datacb)
{
- _pasteimage_append(p, sel->requestwidget);
+ Elm_Selection_Data ddata;
+ ddata.x = ddata.y = 0;
+ ddata.format = ELM_SEL_FORMAT_IMAGE;
+ ddata.data = stripstr;
+ ddata.len = strlen(stripstr);
+ sel->datacb(sel->udata, sel->requestwidget, &ddata);
}
+ else cnp_debug("Paste request\n");
+
savedtypes.imgfile = NULL;
free(stripstr);
}
_x11_notify_handler_image(X11_Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify)
{
Ecore_X_Selection_Data *data;
- Tmp_Info *tmp;
cnp_debug("got a image file!\n");
data = notify->data;
cnp_debug("Size if %d\n", data->length);
if (sel == (_x11_selections + ELM_SEL_TYPE_XDND))
{
+ Tmp_Info *tmp;
Eina_List *l;
Dropable *dropable;
}
_tmpinfo_free(tmp);
ecore_x_dnd_send_finished();
- return 0;
}
else if (sel->datacb)
{
ddata.len = data->length;
ddata.action = sel->action;
sel->datacb(sel->udata, sel->widget, &ddata);
- return 0;
}
- /* generate tmp name */
- tmp = _tempfile_new(data->length);
- if (!tmp) return 0;
- memcpy(tmp->map, data->data, data->length);
- munmap(tmp->map, data->length);
- /* FIXME: Add to paste image data to clean up */
- _pasteimage_append(tmp->filename, sel->requestwidget);
- _tmpinfo_free(tmp);
+ else cnp_debug("Paste request\n");
return 0;
}
return 0;
}
-static Eina_Bool
-_pasteimage_append(char *file, Evas_Object *entry)
-{
- char *entrytag;
- int len;
- /* TODO BUG: shouldn't define absize=240x180. Prefer data:// instead of href:// -- may need support for evas. See http://dataurl.net/ */
- static const char *tagstring = "<item absize=240x180 href=file://%s></item>";
-
- if ((!file) || (!entry)) return EINA_FALSE;
- len = strlen(tagstring)+strlen(file);
- entrytag = alloca(len + 1);
- snprintf(entrytag, len + 1, tagstring, file);
- /* TODO BUG: should never NEVER assume it's an elm_entry! */
- _elm_entry_entry_paste(entry, entrytag);
- return EINA_TRUE;
-}
-
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
}
static Eina_Bool
+_selection_data_cb(void *data EINA_UNUSED,
+ Evas_Object *obj,
+ Elm_Selection_Data *sel_data)
+{
+ char *buf;
+
+ if (!sel_data->data) return EINA_FALSE;
+ ELM_ENTRY_DATA_GET(obj, sd);
+
+ buf = malloc(sel_data->len + 1);
+ if (!buf)
+ {
+ ERR("Failed to allocate memory, obj: %p", obj);
+ return EINA_FALSE;
+ }
+ memcpy(buf, sel_data->data, sel_data->len);
+ buf[sel_data->len] = '\0';
+
+ if ((sel_data->format & ELM_SEL_FORMAT_IMAGE) &&
+ (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE))
+ {
+ char *entry_tag;
+ int len;
+ static const char *tag_string =
+ "<item absize=240x180 href=file://%s></item>";
+
+ len = strlen(tag_string) + strlen(buf);
+ entry_tag = alloca(len + 1);
+ snprintf(entry_tag, len + 1, tag_string, buf);
+ elm_entry_entry_insert(obj, entry_tag);
+ }
+ else
+ {
+ char *txt = _elm_util_text_to_mkup(buf);
+ if (txt)
+ {
+ elm_entry_entry_insert(obj, txt);
+ free(txt);
+ }
+ else
+ {
+ ERR("Failed to convert text to markup text!");
+ }
+ }
+ free(buf);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
_drag_drop_cb(void *data EINA_UNUSED,
Evas_Object *obj,
Elm_Selection_Data *drop)
formats |= ELM_SEL_FORMAT_IMAGE;
elm_cnp_selection_get
- (data, ELM_SEL_TYPE_CLIPBOARD, formats, NULL, NULL);
+ (data, ELM_SEL_TYPE_CLIPBOARD, formats, _selection_data_cb, NULL);
}
static void
else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
formats |= ELM_SEL_FORMAT_IMAGE;
- elm_cnp_selection_get(data, type, formats, NULL, NULL);
+ elm_cnp_selection_get(data, type, formats, _selection_data_cb, NULL);
}
}