From: Alex Wu <zhiwen...@linux.intel.com> Just support type of ELM_SEL_TYPE_CLIPBOARD. Use HAVE_ELEMENTARY_WAYLAND macro to build againt wayland engine, and use elm_win_wl_window_get() run-time engine check. --- trunk/elementary/src/lib/elm_cnp.c | 121 +++++++++++++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 2 deletions(-)
diff --git a/trunk/elementary/src/lib/elm_cnp.c b/trunk/elementary/src/lib/elm_cnp.c index 6da63ad..e28a861 100644 --- a/trunk/elementary/src/lib/elm_cnp.c +++ b/trunk/elementary/src/lib/elm_cnp.c @@ -410,6 +410,28 @@ static Ecore_Event_Handler *handler_drop = NULL; static Ecore_Event_Handler *handler_enter = NULL; static Ecore_Event_Handler *handler_status = NULL; +#elif defined HAVE_ELEMENTARY_WAYLAND +static int _elm_cnp_init_count = 0; +static Eina_Bool _elm_cnp_init(void); +typedef struct _Cnp_Selection Cnp_Selection; + +struct _Cnp_Selection +{ + char *selbuf; + int buflen; + + Evas_Object *widget; + Evas_Object *requestwidget; +}; + +static Cnp_Selection cnp_selection = {0, }; + +static void +_sel_obj_del2(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Cnp_Selection *sel = data; + if (sel->requestwidget == obj) sel->requestwidget = NULL; +} #endif /* Stringshared, so I can just compare pointers later */ @@ -521,6 +543,25 @@ elm_cnp_selection_set(Evas_Object *obj, Elm_Sel_Type selection, sel->selbuf = NULL; return EINA_TRUE; +#elif defined HAVE_ELEMENTARY_WAYLAND + char *types[10] = {0, }; + + if (elm_win_wl_window_get(obj) == NULL) return EINA_FALSE; + if (!_elm_cnp_init_count) _elm_cnp_init(); + + /* TODO: other EML_SEL_TYPE and ELM_SEL_FORMAT */ + if (ELM_SEL_TYPE_CLIPBOARD == selection) + { + types[0] = "text/plain;charset=utf-8"; + ecore_wl_dnd_set_selection(ecore_wl_dnd_get(), types); + + if (cnp_selection.selbuf) free(cnp_selection.selbuf); + cnp_selection.selbuf = strdup((char*)selbuf); + cnp_selection.buflen = buflen; + return EINA_TRUE; + } + + return EINA_FALSE; #else return EINA_FALSE; #endif @@ -610,6 +651,22 @@ elm_cnp_selection_get(Evas_Object *obj, Elm_Sel_Type selection, (sel->requestwidget, EVAS_CALLBACK_DEL, _sel_obj_del2, sel); return EINA_TRUE; +#elif defined HAVE_ELEMENTARY_WAYLAND + if (elm_win_wl_window_get(obj) == NULL) return EINA_FALSE; + if (!_elm_cnp_init_count) _elm_cnp_init(); + + /* For now, just avoid overlapped request */ + if (cnp_selection.requestwidget) return EINA_FALSE; + + /* TODO: other EML_SEL_TYPE and ELM_SEL_FORMAT */ + if (ELM_SEL_TYPE_CLIPBOARD == selection) + { + cnp_selection.requestwidget = obj; + evas_object_event_callback_add(cnp_selection.requestwidget, EVAS_CALLBACK_DEL, + _sel_obj_del2, &cnp_selection); + ecore_wl_dnd_get_selection(ecore_wl_dnd_get(), "text/plain;charset=utf-8"); + } + return EINA_TRUE; #else return EINA_FALSE; #endif @@ -1768,8 +1825,68 @@ tmpinfo_free(Tmp_Info *info) return 0; } -#else -/* Stubs for windows */ +#elif defined HAVE_ELEMENTARY_WAYLAND +static Eina_Bool +selection_send(void *udata, int type __UNUSED__, void *event) +{ + char *buf; + int ret, len_remained; + int len_written = 0; + Cnp_Selection *cnp_selection = udata; + Ecore_Wl_Event_Data_Source_Send *ev = event; + + len_remained = cnp_selection->buflen; + buf = cnp_selection->selbuf; + + while (len_written < cnp_selection->buflen) + { + ret = write(ev->fd, buf, len_remained); + if (ret == -1) break; + buf += ret; + len_written += ret; + len_remained -= ret; + } + + close(ev->fd); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +selection_receive(void *udata, int type __UNUSED__, void *event) +{ + Cnp_Selection *cnp_selection = udata; + Ecore_Wl_Event_Selection_Data_Ready *ev = event; + + if (cnp_selection->requestwidget) + { + if (!ev->done) + { + /* TODO BUG: should never NEVER assume it's an elm_entry! */ + _elm_entry_entry_paste(cnp_selection->requestwidget, ev->data); + } + else + { + evas_object_event_callback_del_full(cnp_selection->requestwidget, EVAS_CALLBACK_DEL, + _sel_obj_del2, cnp_selection); + cnp_selection->requestwidget = NULL; + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_elm_cnp_init(void) +{ + if (_elm_cnp_init_count++) return EINA_TRUE; + + ecore_event_handler_add(ECORE_WL_EVENT_DATA_SOURCE_SEND, selection_send, &cnp_selection); + ecore_event_handler_add(ECORE_WL_EVENT_SELECTION_DATA_READY, selection_receive, &cnp_selection); + + return EINA_TRUE; +} + +/* Stubs for wayland */ Eina_Bool elm_drag_start(Evas_Object *o, Elm_Sel_Format f, const char *d, void (*donecb)(void *, Evas_Object *),void *cbdata) { -- 1.7.9.5 ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel