copypaste: support eldbus to send msg to cbhm 86/79386/1
authorMinchul Lee <slotus.lee@samsung.com>
Mon, 11 Jul 2016 07:06:34 +0000 (16:06 +0900)
committerMinchul Lee <slotus.lee@samsung.com>
Mon, 11 Jul 2016 07:06:34 +0000 (16:06 +0900)
Change-Id: Ic4f69fca233f6658a2490616a87212030992cee7
Signed-off-by: Minchul Lee <slotus.lee@samsung.com>
src/modules/copypasteUI_ctxpopup/cbhm_helper.c
src/modules/copypasteUI_ctxpopup/cbhm_helper.h
src/modules/copypasteUI_ctxpopup/copypaste.c

index 7cf23caf277dd5ff158f172c99b174327ac243e3..584dad25f545659682e110ef7e60bb3105701e8a 100644 (file)
@@ -73,6 +73,52 @@ _cbhm_window_get()
 }
 #endif
 
+#ifdef HAVE_ELEMENTARY_WAYLAND
+static Eldbus_Proxy *eldbus_proxy;
+Eldbus_Connection *cbhm_conn;
+
+Eldbus_Proxy* cbhm_proxy_get()
+{
+   return eldbus_proxy;
+}
+
+Eldbus_Connection* cbhm_connection_get()
+{
+   return cbhm_conn;
+}
+
+static void
+_cbhm_on_name_owner_changed(void *data EINA_UNUSED,
+      const char *bus EINA_UNUSED, const char *old_id EINA_UNUSED,
+      const char *new_id EINA_UNUSED)
+{
+   /* FIXME : If entry should know the time cbhm service is started or stoped,
+    * use this function. */
+}
+
+void
+cbhm_eldbus_init()
+{
+   EINA_LOG_ERR("IN");
+   Eldbus_Object *eldbus_obj;
+
+   cbhm_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
+   eldbus_obj = eldbus_object_get(cbhm_conn, CBHM_DBUS_INTERFACE,
+         CBHM_DBUS_OBJPATH);
+   eldbus_proxy = eldbus_proxy_get(eldbus_obj, CBHM_DBUS_INTERFACE);
+   eldbus_name_owner_changed_callback_add(cbhm_conn, CBHM_DBUS_INTERFACE,
+         _cbhm_on_name_owner_changed, cbhm_conn, EINA_TRUE);
+}
+
+void
+cbhm_eldbus_deinit()
+{
+   EINA_LOG_ERR("IN");
+   if (cbhm_conn)
+      eldbus_connection_unref(cbhm_conn);
+}
+#endif /* HAVE_ELEMENTARY_WAYLAND */
+
 Eina_Bool
 _cbhm_msg_send(Evas_Object *obj, char *msg)
 {
@@ -199,8 +245,52 @@ _cbhm_item_count_get(Evas_Object *obj EINA_UNUSED, int atom_index)
         return count;
      }
    DMSG("ret: 0x%x\n", ret);
-#else
-   (void)atom_index;
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   Eldbus_Message *reply, *req;
+   const char *errname = NULL, *errmsg = NULL;
+   int count = -1;
+
+   EINA_LOG_ERR("eldbus_proxy_call CbhmGetCount");
+
+       /* FIXME : should support get count for TEXT and ALL. That is,
+        * it needs some parameter */
+   if (atom_index == ATOM_INDEX_CBHM_COUNT_TEXT)
+      EINA_LOG_ERR("ATOM_INDEX_CBHM_COUNT_TEXT");
+   else
+      EINA_LOG_ERR("ATOM_INDEX_CBHM_COUNT_ALL");
+
+   if (!(req = eldbus_proxy_method_call_new(eldbus_proxy, "CbhmGetCount")))
+     {
+        EINA_LOG_ERR(
+              "Failed to create method call on org.freedesktop.DBus.Properties.Get");
+        return -1;
+     }
+
+   eldbus_message_ref(req);
+
+   reply = eldbus_proxy_send_and_block(eldbus_proxy, req, 100);
+
+   if (!reply || eldbus_message_error_get(reply, &errname, &errmsg))
+     {
+        EINA_LOG_ERR(
+              "Unable to call method org.freedesktop.DBus.Properties.Get: %s %s",
+              errname, errmsg);
+        eldbus_message_unref(req);
+        return -1;
+     }
+
+   if (!eldbus_message_arguments_get(reply, "i", &count))
+     {
+        EINA_LOG_ERR("Cannot get arguments from eldbus");
+        eldbus_message_unref(req);
+        return -1;
+     }
+
+   eldbus_message_unref(req);
+   EINA_LOG_DBG("cbhm item count(%d)", count);
+
+   return count;
 #endif
    return -1;
 }
index 7a200ad0d5ede86f6d68529bb41910f69ddc581e..c34c17bad4851efed91a392465a8f512998d979c 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _CBHM_HELPER_H
+#define _CBHM_HELPER_H
+
 #ifdef HAVE_CONFIG_H
 #include "elementary_config.h"
 #endif
@@ -25,6 +28,17 @@ enum ATOM_INDEX_CBHM_COUNT {
        ATOM_INDEX_CBHM_COUNT_MAX = 3
 };
 
+#ifdef HAVE_ELEMENTARY_WAYLAND
+#define CBHM_DBUS_OBJPATH "/org/tizen/cbhm/dbus"
+#ifndef CBHM_DBUS_INTERFACE
+#define CBHM_DBUS_INTERFACE "org.tizen.cbhm.dbus"
+#endif /* CBHM_DBUS_INTERFACE */
+
+Eldbus_Proxy* cbhm_proxy_get();
+void cbhm_eldbus_init();
+void cbhm_eldbus_deinit();
+#endif /* HAVE_ELEMENTARY_WAYLAND */
+
 Eina_Bool _cbhm_msg_send(Evas_Object* obj, char *msg);
 int _cbhm_item_count_get(Evas_Object *obj EINA_UNUSED, int atom_index);
 #ifdef HAVE_ELEMENTARY_X
@@ -36,3 +50,5 @@ Eina_Bool _cbhm_item_get(Evas_Object *obj, int index, void *data_type, char **bu
 #ifdef HAVE_ELEMENTARY_X
 Eina_Bool _cbhm_item_set(Evas_Object *obj, Ecore_X_Atom data_type, char *item_data);
 #endif
+
+#endif /* _CBHM_HELPER_H */
index b4152cb61e7aa4a7fc0ae200f6e0d787166575ea..fdbb4c0bfb2f6c3836ee0d3a619f4fbc0570e4c6 100644 (file)
@@ -1012,6 +1012,7 @@ _translate_menu(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_
 static void
 _clipboard_menu(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
+   EINA_LOG_ERR("IN");
    if(!ext_mod) return;
 
    // start for cbhm
@@ -1022,10 +1023,32 @@ _clipboard_menu(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
    xwin = elm_win_xwindow_get(top);
    ecore_x_selection_secondary_set(xwin, NULL, 0);
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   const char *types[10] = {0, };
+
+   int i = -1;
+   types[++i] = "application/x-elementary-markup";
+   ecore_wl_dnd_selection_set(ecore_wl_input_get(), types);
+#endif
+
    if (ext_mod->cnp_mode != ELM_CNP_MODE_MARKUP)
-     _cbhm_msg_send(data, "show0");
+     {
+        EINA_LOG_ERR("eldbus_proxy_call CbhmShow 0");
+#ifdef HAVE_ELEMENTARY_WAYLAND
+         eldbus_proxy_call(cbhm_proxy_get(), "CbhmShow", NULL, NULL, -1, "s", "0");
+#else
+         _cbhm_msg_send(data, "show0");
+#endif
+     }
    else
-     _cbhm_msg_send(data, "show1");
+     {
+         EINA_LOG_ERR("eldbus_proxy_call CbhmShow 1");
+#ifdef HAVE_ELEMENTARY_WAYLAND
+         eldbus_proxy_call(cbhm_proxy_get(), "CbhmShow", NULL, NULL, -1, "s", "1");
+#else
+        _cbhm_msg_send(data, "show1");
+#endif
+     }
    _ctxpopup_hide(obj);
    // end for cbhm
    elm_entry_select_none(data);
@@ -1117,6 +1140,9 @@ obj_hook(Evas_Object *obj)
    elm_entry_context_menu_item_add(obj, "Translate", NULL,
                                    ELM_ICON_STANDARD, NULL, NULL);
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   cbhm_eldbus_init();
+#endif
 }
 
 EAPI void
@@ -1156,7 +1182,27 @@ obj_unhook(Evas_Object *obj EINA_UNUSED)
         free(ext_mod);
         ext_mod = NULL;
      }
+
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   EINA_LOG_ERR("call cbhm_eldbus_deinit");
+   cbhm_eldbus_deinit();
+#endif
+}
+
+#if 0 /* for asynchronized proxy_call function */
+static void
+__cbhm_get_count(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+{
+   EINA_LOG_ERR("IN");
+   int count = -1;
+
+   if (eldbus_message_error_get(msg, NULL, NULL) ||
+       !eldbus_message_arguments_get(msg, "i", &count)) return;
+
+   if (count == -1)
+      return;
 }
+#endif
 
 EAPI void
 obj_longpress(Evas_Object *obj)
@@ -1164,6 +1210,7 @@ obj_longpress(Evas_Object *obj)
    if(!ext_mod) return;
    LOG("IN\n\n");
 
+   int cbhm_count = 0;
    Evas_Object *ctxparent;
    Evas_Object *parent, *child;
    const Eina_List *l;
@@ -1187,13 +1234,12 @@ obj_longpress(Evas_Object *obj)
      {
         Eina_List *lao = NULL;
         Evas_Object *ao = NULL;
-#ifdef HAVE_ELEMENTARY_X
-        int cbhm_count = 0;
+
         if (elm_entry_cnp_mode_get(obj) != ELM_CNP_MODE_MARKUP)
           cbhm_count = _cbhm_item_count_get(obj, ATOM_INDEX_CBHM_COUNT_TEXT);
         else
           cbhm_count = _cbhm_item_count_get(obj, ATOM_INDEX_CBHM_COUNT_ALL);
-#endif
+
         if (ext_mod->popup)
           {
              evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _entry_del_cb);
@@ -1300,8 +1346,9 @@ obj_longpress(Evas_Object *obj)
 
 #ifdef HAVE_ELEMENTARY_X
              if (cbhm_count)
-#else
-             if (1) // need way to detect if someone has a selection
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+             if (cbhm_count)
 #endif
                {
                   if (elm_entry_cnp_mode_get(obj) == ELM_CNP_MODE_PLAINTEXT)
@@ -1343,8 +1390,9 @@ obj_longpress(Evas_Object *obj)
              // start for cbhm
 #ifdef HAVE_ELEMENTARY_X
              if ((ext_mod->editable) && (cbhm_count) && (has_clipboard))
-#else
-             if ((ext_mod->editable) && (has_clipboard))
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+             if ((ext_mod->editable) && (cbhm_count) && (has_clipboard))
 #endif
                {
                   CP_ICON_ADD(icon, "clipboard");
@@ -1416,8 +1464,9 @@ obj_longpress(Evas_Object *obj)
 
 #ifdef HAVE_ELEMENTARY_X
                    if (ext_mod->editable && cbhm_count)
-#else
-                   if (ext_mod->editable)
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+                   if (ext_mod->editable && cbhm_count)
 #endif
                      {
                         if (elm_entry_cnp_mode_get(obj) == ELM_CNP_MODE_PLAINTEXT)
@@ -1480,8 +1529,9 @@ obj_longpress(Evas_Object *obj)
                      }
 #ifdef HAVE_ELEMENTARY_X
                    if (cbhm_count)
-#else
-                   if (1) // need way to detect if someone has a selection
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+                   if (cbhm_count)
 #endif
                      {
                         if (ext_mod->editable)
@@ -1523,8 +1573,9 @@ obj_longpress(Evas_Object *obj)
                   // start for cbhm
 #ifdef HAVE_ELEMENTARY_X
                   if ((ext_mod->editable) && (cbhm_count) && (has_clipboard))
-#else
-                  if ((ext_mod->editable) && (has_clipboard))
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+                  if ((ext_mod->editable) && (cbhm_count) && (has_clipboard))
 #endif
                     {
                        CP_ICON_ADD(icon, "clipboard");