From: Alex Wu <zhiwen...@linux.intel.com>

Just support type of ELM_SEL_TYPE_CLIPBOARD. If not define
HAVE_ELEMENTARY_X, the wayland path will be built.
---
 trunk/elementary/src/lib/elm_cnp.c |  119 +++++++++++++++++++++++++++++++++++-
 1 file changed, 117 insertions(+), 2 deletions(-)

diff --git a/trunk/elementary/src/lib/elm_cnp.c 
b/trunk/elementary/src/lib/elm_cnp.c
index 6da63ad..5c06167 100644
--- a/trunk/elementary/src/lib/elm_cnp.c
+++ b/trunk/elementary/src/lib/elm_cnp.c
@@ -410,6 +410,30 @@ static Ecore_Event_Handler *handler_drop = NULL;
 static Ecore_Event_Handler *handler_enter = NULL;
 static Ecore_Event_Handler *handler_status = NULL;
 
+#else
+/* For 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 */
@@ -522,6 +546,22 @@ elm_cnp_selection_set(Evas_Object *obj, Elm_Sel_Type 
selection,
 
    return EINA_TRUE;
 #else
+   char *types[10] = {0, };
+
+   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;
 #endif
 }
@@ -611,7 +651,20 @@ elm_cnp_selection_get(Evas_Object *obj, Elm_Sel_Type 
selection,
    
    return EINA_TRUE;
 #else
-   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;
 #endif
 }
 
@@ -1769,7 +1822,69 @@ tmpinfo_free(Tmp_Info *info)
 }
 
 #else
-/* Stubs for windows */
+
+/* For 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

Reply via email to