e_tizen_clipboard: move the tizen_clipboard implementation to e_tizen_clipboard 06/320406/1
authorSooChan Lim <sc1.lim@samsung.com>
Fri, 28 Feb 2025 00:45:49 +0000 (09:45 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 28 Feb 2025 06:11:11 +0000 (15:11 +0900)
move the tizen_clipboard code from e_policy_wl to e_tizen_clipboard

Change-Id: I830eae984860cc7089432ee1fc6a458983b85a97

src/bin/Makefile.mk
src/bin/server/e_policy_wl.c
src/bin/server/e_policy_wl_intern.h
src/bin/server/e_server.c
src/bin/server/e_server_intern.h
src/bin/server/e_tizen_clipboard.c [new file with mode: 0644]
src/bin/server/e_tizen_clipboard_intern.h [new file with mode: 0644]
src/bin/windowmgr/services/e_service_cbhm.c

index 99d673fd7a229df0bb58f201414c60e216e2f4f1..71c00a68d20fbdaedfb623320d213114f92f3e83 100644 (file)
@@ -201,6 +201,7 @@ src/bin/server/e_tizen_launch_appinfo.c \
 src/bin/server/e_tizen_display_policy.c \
 src/bin/server/e_tizen_ws_shell_manager.c \
 src/bin/server/e_tizen_indicator.c \
+src/bin/server/e_tizen_clipboard.c \
 src/bin/server/e_surface_view.c \
 src/bin/windowmgr/services/e_service_gesture.c \
 src/bin/windowmgr/services/e_service_lockscreen.c \
index a01744d6213b89c3d4110443dbc639ddc46b14ba..6d7a9cb235d0b4b1e4f5b6c3abb787cc80efa239 100644 (file)
@@ -1,7 +1,6 @@
 #include "e_policy_wl_intern.h"
 #include "e_policy_intern.h"
 #include "e_appinfo_intern.h"
-#include "services/e_service_cbhm_intern.h"
 #include "services/e_service_softkey_intern.h"
 #include "e_policy_wl_display_intern.h"
 #include "e_policy_conformant_intern.h"
@@ -63,6 +62,8 @@ typedef struct _E_Policy_Wl_Tz_Clipboard
 {
    struct wl_resource *res_tz_clipboard;
    Eina_List *ec_list;
+   E_Client *ec;
+   struct wl_listener ec_destroy;
 } E_Policy_Wl_Tz_Clipboard;
 
 typedef struct _E_Policy_Wl
@@ -71,8 +72,6 @@ typedef struct _E_Policy_Wl
    Eina_Hash       *tzpols;                  /* list of E_Policy_Wl_Tzpol */
 
    Eina_List       *pending_vis;             /* list of clients that have pending visibility change*/
-
-   Eina_List       *tz_clipboards;           /* list of E_Policy_Wl_Tz_Clipboard */
 } E_Policy_Wl;
 
 static E_Policy_Wl *polwl = NULL;
@@ -409,23 +408,6 @@ _e_policy_wl_surf_client_set(E_Client *ec)
    return;
 }
 
-static Eina_List *
-_e_policy_wl_e_clients_find_by_pid(pid_t pid)
-{
-   E_Client *ec;
-   Eina_List *clients = NULL, *l, *comp_ec_list;
-
-   comp_ec_list = e_comp_ec_list_get();
-   EINA_LIST_FOREACH(comp_ec_list, l, ec)
-     {
-        if (e_object_is_del(E_OBJECT(ec))) continue;
-        if (ec->netwm.pid != pid) continue;
-        clients = eina_list_append(clients, ec);
-     }
-
-   return clients;
-}
-
 // --------------------------------------------------------
 // visibility
 // --------------------------------------------------------
@@ -2828,260 +2810,6 @@ _e_policy_wl_cb_hook_intercept_show_helper(void *data, E_Client *ec)
    return ret;
 }
 
-// --------------------------------------------------------
-// E_Policy_Wl_Tz_Clipboard
-// --------------------------------------------------------
-static E_Policy_Wl_Tz_Clipboard *
-_e_policy_wl_tz_clipboard_add(struct wl_resource *res_tz_clipboard)
-{
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard;
-
-   tz_clipboard = E_NEW(E_Policy_Wl_Tz_Clipboard, 1);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tz_clipboard, NULL);
-
-   tz_clipboard->res_tz_clipboard = res_tz_clipboard;
-   polwl->tz_clipboards = eina_list_append(polwl->tz_clipboards, tz_clipboard);
-
-   return tz_clipboard;
-}
-
-static void
-_e_policy_wl_tz_clipboard_del(E_Policy_Wl_Tz_Clipboard *tz_clipboard)
-{
-   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard);
-
-   polwl->tz_clipboards = eina_list_remove(polwl->tz_clipboards, tz_clipboard);
-   E_FREE(tz_clipboard);
-}
-
-static E_Policy_Wl_Tz_Clipboard *
-_e_policy_wl_tz_clipboard_get_from_client(E_Client *ec)
-{
-   Eina_List *l;
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard;
-
-   EINA_LIST_FOREACH(polwl->tz_clipboards, l, tz_clipboard)
-     {
-        if (eina_list_data_find(tz_clipboard->ec_list, ec))
-          return tz_clipboard;
-     }
-
-   return NULL;
-}
-
-static Eina_Bool
-_e_policy_wl_tz_clipboard_set_client(struct wl_resource *res_tz_clipboard, E_Client *ec)
-{
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard = NULL;
-
-   tz_clipboard = wl_resource_get_user_data(res_tz_clipboard);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tz_clipboard, EINA_FALSE);
-
-   if (!eina_list_data_find(tz_clipboard->ec_list, ec))
-     {
-        tz_clipboard->ec_list = eina_list_append(tz_clipboard->ec_list, ec);
-     }
-   return EINA_TRUE;
-}
-
-static void
-_e_policy_wl_tz_clipboard_unset_client(E_Client *ec)
-{
-   Eina_List *l;
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard = NULL;
-
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   EINA_LIST_FOREACH(polwl->tz_clipboards, l, tz_clipboard)
-     {
-        if (eina_list_data_find(tz_clipboard->ec_list, ec))
-          {
-             tz_clipboard->ec_list = eina_list_remove(tz_clipboard->ec_list, ec);
-          }
-     }
-}
-
-// --------------------------------------------------------
-// tizen_clipboard_interface
-// --------------------------------------------------------
-static void
-_tz_clipboard_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard)
-{
-   wl_resource_destroy(res_tz_clipboard);
-}
-
-static void
-_tz_clipboard_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard, struct wl_resource *surf)
-{
-   E_Client *ec;
-
-   ec = e_client_from_surface_resource(surf);
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-   EINA_SAFETY_ON_NULL_RETURN(e_client_view_get(ec));
-
-   _e_policy_wl_tz_clipboard_set_client(res_tz_clipboard, ec);
-   e_service_cbhm_parent_set(ec, EINA_TRUE);
-   e_service_cbhm_show();
-}
-
-static void
-_tz_clipboard_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard, struct wl_resource *surf)
-{
-   E_Client *ec;
-
-   ec = e_client_from_surface_resource(surf);
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-   EINA_SAFETY_ON_NULL_RETURN(e_client_view_get(ec));
-
-   e_service_cbhm_parent_set(ec, EINA_FALSE);
-   e_service_cbhm_hide();
-}
-
-static void
-_tz_clipboard_cb_data_only_set(struct wl_client *client, struct wl_resource *res_tz_clipboard, uint32_t set)
-{
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard = NULL;
-   struct wl_client *_wc;
-   struct wl_resource *data_res;
-   pid_t pid = 0;
-   uid_t uid = 0;
-   Eina_Bool res;
-   Eina_List *clients;
-   E_Client *ec, *found = NULL;
-   E_Comp_Wl_Client_Data *cdata;
-
-   tz_clipboard = wl_resource_get_user_data(res_tz_clipboard);
-   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard);
-
-   if (tz_clipboard->ec_list)
-     {
-        ELOGF("TZPOL",
-              "Unable to set data only mode for wl_client(%p) : "
-              "ec_list exists",
-              NULL, client);
-        goto send_deny;
-     }
-
-   if (!(data_res = e_comp_wl_data_find_for_client(client)))
-     {
-        ELOGF("TZPOL",
-              "Unable to set data only mode for wl_client(%p) : "
-              "no wl_data_device resource",
-              NULL, client);
-        goto send_deny;
-     }
-
-   clients = _e_policy_wl_e_clients_find_by_pid(pid);
-   if (clients)
-     {
-        EINA_LIST_FREE(clients, ec)
-          {
-             if (found) continue;
-             cdata = e_client_cdata_get(ec);
-             if (cdata && cdata->surface)
-               {
-                  _wc = wl_resource_get_client(cdata->surface);
-                  if (_wc == client)
-                    found = ec;
-               }
-          }
-     }
-
-   if (found)
-     {
-        ELOGF("TZPOL",
-              "Unable to set data only mode for wl_client(%p) : "
-              "have ec(%p)",
-              NULL, client, ec);
-        goto send_deny;
-     }
-
-   /* Privilege Check */
-   wl_client_get_credentials(client, &pid, &uid, NULL);
-   res = e_security_privilege_check(pid, uid,
-                                    E_PRIVILEGE_DATA_ONLY_SET);
-   if (!res)
-     {
-        ELOGF("TZPOL",
-              "Privilege Check Failed! DENY data_only_set",
-              NULL);
-        goto send_deny;
-     }
-
-   ELOGF("TZPOL",
-         "Set data only mode :%d for wl_client(%p)",
-         NULL, set, client);
-   e_comp_wl_data_device_only_set(data_res, !(set == 0));
-   tizen_clipboard_send_allowed_data_only(res_tz_clipboard, (uint32_t)1);
-   return;
-
-send_deny:
-   tizen_clipboard_send_allowed_data_only(res_tz_clipboard, (uint32_t)0);
-}
-
-static const struct tizen_clipboard_interface _tz_clipboard_iface =
-{
-   _tz_clipboard_cb_destroy,
-   _tz_clipboard_cb_show,
-   _tz_clipboard_cb_hide,
-   _tz_clipboard_cb_data_only_set,
-};
-
-static void
-_tz_clipboard_cb_unbind(struct wl_resource *res_tz_clipboard)
-{
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard;
-
-   tz_clipboard = wl_resource_get_user_data(res_tz_clipboard);
-   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard);
-
-   _e_policy_wl_tz_clipboard_del(tz_clipboard);
-}
-
-static void
-_tz_clipboard_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t ver, uint32_t id)
-{
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard_pol;
-   struct wl_resource *res_tz_clipboard;
-
-   EINA_SAFETY_ON_NULL_GOTO(polwl, err);
-
-   res_tz_clipboard = wl_resource_create(client,
-                                         &tizen_clipboard_interface,
-                                         ver,
-                                         id);
-   EINA_SAFETY_ON_NULL_GOTO(res_tz_clipboard, err);
-
-   tz_clipboard_pol = _e_policy_wl_tz_clipboard_add(res_tz_clipboard);
-   EINA_SAFETY_ON_NULL_GOTO(tz_clipboard_pol, err);
-
-   wl_resource_set_implementation(res_tz_clipboard,
-                                  &_tz_clipboard_iface,
-                                  tz_clipboard_pol,
-                                  _tz_clipboard_cb_unbind);
-   return;
-
-err:
-   ERR("Could not create tizen_clipboard_interface res: %m");
-   wl_client_post_no_memory(client);
-}
-
-EINTERN void
-e_policy_wl_clipboard_data_selected_send(E_Client *ec)
-{
-   E_Comp_Wl_Client_Data *cdata;
-   E_Policy_Wl_Tz_Clipboard *tz_clipboard;
-
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   tz_clipboard = _e_policy_wl_tz_clipboard_get_from_client(ec);
-   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard);
-
-   cdata = e_client_cdata_get(ec);
-   tizen_clipboard_send_data_selected(tz_clipboard->res_tz_clipboard,
-                                      cdata ? cdata->surface : NULL);
-}
-
 static void
 _e_policy_wl_cb_hook_shell_surface_ready(void *d, E_Client *ec)
 {
@@ -3277,8 +3005,6 @@ e_policy_wl_client_del(E_Client *ec)
 
    e_policy_wl_pixmap_del(ec->pixmap);
 
-   _e_policy_wl_tz_clipboard_unset_client(ec);
-
    polwl->pending_vis = eina_list_remove(polwl->pending_vis, ec);
 }
 
@@ -3397,14 +3123,6 @@ e_policy_wl_init(void)
    EINA_SAFETY_ON_NULL_GOTO(global, err);
    polwl->globals = eina_list_append(polwl->globals, global);
 
-   global = wl_global_create(comp_wl->wl.disp,
-                             &tizen_clipboard_interface,
-                             2,
-                             NULL,
-                             _tz_clipboard_cb_bind);
-   EINA_SAFETY_ON_NULL_GOTO(global, err);
-   polwl->globals = eina_list_append(polwl->globals, global);
-
    polwl->tzpols = eina_hash_pointer_new(_e_policy_wl_tzpol_del);
 
    E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(hooks_co, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _e_policy_wl_cb_hook_intercept_show_helper, NULL);
index ab8431503b310b8c3c3d62b04eadd4bbe6b7a307..0510d956f8e5e8690e9e6119d39014a0b62855fa 100644 (file)
@@ -27,7 +27,6 @@ EINTERN void      e_policy_wl_notification_level_fetch(E_Client *ec);
 EINTERN void      e_policy_wl_aux_hint_init(void);
 EINTERN void      e_policy_wl_aux_message_send(E_Client *ec, const char *key, const char *val, Eina_List *options);
 EINTERN void      e_policy_wl_aux_hint_apply(E_Client *ec);
-EINTERN void      e_policy_wl_clipboard_data_selected_send(E_Client *ec);
 EINTERN void      e_policy_wl_stack_changed_send(E_Client *ec);
 EINTERN void      e_policy_wl_generate_request(E_Client *ec, E_Policy_Wl_Gen_Request type);
 EINTERN void      e_policy_wl_base_output_resolution_info_update(pid_t pid);
index b34d06c59cbf04328700b90bdecf51effa633c36..2c0c97ef16d905785469703794fe1e97c022ed6d 100644 (file)
@@ -28,6 +28,7 @@
 #include "e_tizen_launch_appinfo_intern.h"
 #include "e_tizen_ws_shell_manager_intern.h"
 #include "e_tizen_indicator_intern.h"
+#include "e_tizen_clipboard_intern.h"
 
 typedef struct _E_Server E_Server;
 
@@ -68,6 +69,7 @@ struct _E_Server
         E_Tizen_Launch_Appinfo *tizen_launch_appinfo;
         E_Tizen_Ws_Shell_Manager *tizen_ws_shell_manager;
         E_Tizen_Indicator *tizen_indicator;
+        E_Tizen_Clipboard *tizen_clipboard;
     } handles; // feature handles
 };
 
@@ -141,6 +143,7 @@ e_server_init(void)
    e_server_feature_register(E_SERVER_FEATURE_TIZEN_LAUNCH_APPINFO, e_tizen_launch_appinfo_init(comp_wl->wl.disp));
    e_server_feature_register(E_SERVER_FEATURE_TIZEN_WS_SHELL_MANAGER, e_tizen_ws_shell_manager_init(comp_wl->wl.disp));
    e_server_feature_register(E_SERVER_FEATURE_TIZEN_INDICATOR, e_tizen_indicator_init(comp_wl->wl.disp));
+   e_server_feature_register(E_SERVER_FEATURE_TIZEN_CLIPBOARD, e_tizen_clipboard_init(comp_wl->wl.disp));
 
    return EINA_TRUE;
 }
@@ -148,6 +151,7 @@ e_server_init(void)
 EINTERN void
 e_server_shutdown(void)
 {
+   e_tizen_clipboard_shutdown();
    e_tizen_indicator_shutdown();
    e_tizen_ws_shell_shutdown();
    e_tizen_launch_appinfo_shutdown();
@@ -278,6 +282,9 @@ e_server_feature_register(E_SERVER_FEATURE feature, void *handle)
        case E_SERVER_FEATURE_TIZEN_INDICATOR:
          g_server->handles.tizen_indicator = handle;
          break;
+       case E_SERVER_FEATURE_TIZEN_CLIPBOARD:
+         g_server->handles.tizen_clipboard = handle;
+         break;
        default:
          ERR("Unknown feature(%d) and handle(%p)", feature, handle);
          break;
@@ -380,6 +387,9 @@ e_server_feature_handle_get(E_SERVER_FEATURE feature)
        case E_SERVER_FEATURE_TIZEN_INDICATOR:
          handle = g_server->handles.tizen_indicator;
          break;
+       case E_SERVER_FEATURE_TIZEN_CLIPBOARD:
+         handle = g_server->handles.tizen_clipboard;
+         break;
        default:
          ERR("Unknown feature(%d)", feature);
          break;
index 460e90f6fd8fee1a4881ca38f515d2235e387e79..feb2633942d160285cfaad74d87d356fed3bc6ce 100644 (file)
@@ -33,6 +33,7 @@ typedef enum _E_SERVER_FEATURE {
     E_SERVER_FEATURE_TIZEN_LAUNCH_APPINFO,
     E_SERVER_FEATURE_TIZEN_WS_SHELL_MANAGER,
     E_SERVER_FEATURE_TIZEN_INDICATOR,
+    E_SERVER_FEATURE_TIZEN_CLIPBOARD,
     E_SERVER_FEATURE_MAX
 } E_SERVER_FEATURE;
 
diff --git a/src/bin/server/e_tizen_clipboard.c b/src/bin/server/e_tizen_clipboard.c
new file mode 100644 (file)
index 0000000..b63c4f2
--- /dev/null
@@ -0,0 +1,355 @@
+#include "e_tizen_clipboard_intern.h"
+#include "services/e_service_cbhm_intern.h"
+#include "e_comp_wl_data_intern.h"
+#include "e_privilege_intern.h"
+#include "e_security_intern.h"
+
+#include <wayland-server.h>
+#include <tizen-extension-server-protocol.h>
+
+typedef struct _E_Tizen_Clipboard_Client
+{
+   struct wl_resource *res_tz_clipboard;
+
+   Eina_List *ec_list;
+} E_Tizen_Clipboard_Client;
+
+struct _E_Tizen_Clipboard
+{
+   struct wl_global *global;
+
+   Eina_List       *clipboard_clients;
+};
+
+static E_Tizen_Clipboard *g_tizen_clipboard = NULL;
+
+static Eina_List *hooks_ec = NULL;
+
+// --------------------------------------------------------
+// E_Tizen_Clipboard_Client
+// --------------------------------------------------------
+static E_Tizen_Clipboard_Client *
+_e_tizen_clipboard_client_add(struct wl_resource *res_tz_clipboard)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client;
+
+   tz_clipboard_client = E_NEW(E_Tizen_Clipboard_Client, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tz_clipboard_client, NULL);
+
+   tz_clipboard_client->res_tz_clipboard = res_tz_clipboard;
+
+   g_tizen_clipboard->clipboard_clients = eina_list_append(g_tizen_clipboard->clipboard_clients, tz_clipboard_client);
+
+   return tz_clipboard_client;
+}
+
+static void
+_e_tizen_clipboard_client_del(E_Tizen_Clipboard_Client *tz_clipboard_client)
+{
+   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard_client);
+
+   g_tizen_clipboard->clipboard_clients = eina_list_remove(g_tizen_clipboard->clipboard_clients, tz_clipboard_client);
+
+   E_FREE(tz_clipboard_client);
+}
+
+static E_Tizen_Clipboard_Client *
+_e_tizen_clipboard_client_get_from_e_client(E_Client *ec)
+{
+   Eina_List *l;
+   E_Tizen_Clipboard_Client *tz_clipboard_client;
+
+   EINA_LIST_FOREACH(g_tizen_clipboard->clipboard_clients, l, tz_clipboard_client)
+     {
+        if (eina_list_data_find(tz_clipboard_client->ec_list, ec))
+          return tz_clipboard_client;
+     }
+
+   return NULL;
+}
+
+static void
+_e_tizen_clipboard_client_unset_e_client(E_Client *ec)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client = NULL;
+   Eina_List *l;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   EINA_LIST_FOREACH(g_tizen_clipboard->clipboard_clients, l, tz_clipboard_client)
+     {
+        if (eina_list_data_find(tz_clipboard_client->ec_list, ec))
+          {
+             tz_clipboard_client->ec_list = eina_list_remove(tz_clipboard_client->ec_list, ec);
+          }
+     }
+}
+
+static Eina_Bool
+_e_tizen_clipboard_client_set_e_client(struct wl_resource *res_tz_clipboard, E_Client *ec)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client = NULL;
+
+   tz_clipboard_client = wl_resource_get_user_data(res_tz_clipboard);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tz_clipboard_client, EINA_FALSE);
+
+   if (!eina_list_data_find(tz_clipboard_client->ec_list, ec))
+     {
+        tz_clipboard_client->ec_list = eina_list_append(tz_clipboard_client->ec_list, ec);
+     }
+
+   return EINA_TRUE;
+}
+
+// --------------------------------------------------------
+// tizen_clipboard_interface
+// --------------------------------------------------------
+static void
+_tz_clipboard_client_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard)
+{
+   wl_resource_destroy(res_tz_clipboard);
+}
+
+static void
+_tz_clipboard_client_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard, struct wl_resource *surf)
+{
+   E_Client *ec;
+
+   ec = e_client_from_surface_resource(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+   EINA_SAFETY_ON_NULL_RETURN(e_client_view_get(ec));
+
+   _e_tizen_clipboard_client_set_e_client(res_tz_clipboard, ec);
+   e_service_cbhm_parent_set(ec, EINA_TRUE);
+   e_service_cbhm_show();
+}
+
+static void
+_tz_clipboard_client_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tz_clipboard, struct wl_resource *surf)
+{
+   E_Client *ec;
+
+   ec = e_client_from_surface_resource(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+   EINA_SAFETY_ON_NULL_RETURN(e_client_view_get(ec));
+
+   e_service_cbhm_parent_set(ec, EINA_FALSE);
+   e_service_cbhm_hide();
+}
+
+static Eina_List *
+_e_tizen_clipboard_e_clients_find_by_pid(pid_t pid)
+{
+   E_Client *ec;
+   Eina_List *clients = NULL, *l, *comp_ec_list;
+
+   comp_ec_list = e_comp_ec_list_get();
+   EINA_LIST_FOREACH(comp_ec_list, l, ec)
+     {
+        if (e_object_is_del(E_OBJECT(ec))) continue;
+        if (ec->netwm.pid != pid) continue;
+        clients = eina_list_append(clients, ec);
+     }
+
+   return clients;
+}
+
+static void
+_tz_clipboard_client_cb_data_only_set(struct wl_client *client, struct wl_resource *res_tz_clipboard, uint32_t set)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client = NULL;
+   struct wl_client *_wc;
+   struct wl_resource *data_res;
+   pid_t pid = 0;
+   uid_t uid = 0;
+   Eina_Bool res;
+   Eina_List *clients;
+   E_Client *ec, *found = NULL;
+   E_Comp_Wl_Client_Data *cdata;
+
+   tz_clipboard_client = wl_resource_get_user_data(res_tz_clipboard);
+   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard_client);
+
+   if (tz_clipboard_client->ec_list)
+     {
+        ELOGF("TZPOL",
+              "Unable to set data only mode for wl_client(%p) : "
+              "ec_list exists",
+              NULL, client);
+        goto send_deny;
+     }
+
+   if (!(data_res = e_comp_wl_data_find_for_client(client)))
+     {
+        ELOGF("TZPOL",
+              "Unable to set data only mode for wl_client(%p) : "
+              "no wl_data_device resource",
+              NULL, client);
+        goto send_deny;
+     }
+
+   clients = _e_tizen_clipboard_e_clients_find_by_pid(pid);
+   if (clients)
+     {
+        EINA_LIST_FREE(clients, ec)
+          {
+             if (found) continue;
+             cdata = e_client_cdata_get(ec);
+             if (cdata && cdata->surface)
+               {
+                  _wc = wl_resource_get_client(cdata->surface);
+                  if (_wc == client)
+                    found = ec;
+               }
+          }
+     }
+
+   if (found)
+     {
+        ELOGF("TZPOL",
+              "Unable to set data only mode for wl_client(%p) : "
+              "have ec(%p)",
+              NULL, client, ec);
+        goto send_deny;
+     }
+
+   /* Privilege Check */
+   wl_client_get_credentials(client, &pid, &uid, NULL);
+   res = e_security_privilege_check(pid, uid,
+                                    E_PRIVILEGE_DATA_ONLY_SET);
+   if (!res)
+     {
+        ELOGF("TZPOL",
+              "Privilege Check Failed! DENY data_only_set",
+              NULL);
+        goto send_deny;
+     }
+
+   ELOGF("TZPOL",
+         "Set data only mode :%d for wl_client(%p)",
+         NULL, set, client);
+   e_comp_wl_data_device_only_set(data_res, !(set == 0));
+   tizen_clipboard_send_allowed_data_only(res_tz_clipboard, (uint32_t)1);
+   return;
+
+send_deny:
+   tizen_clipboard_send_allowed_data_only(res_tz_clipboard, (uint32_t)0);
+}
+
+static const struct tizen_clipboard_interface _tz_clipboard_client_iface =
+{
+   _tz_clipboard_client_cb_destroy,
+   _tz_clipboard_client_cb_show,
+   _tz_clipboard_client_cb_hide,
+   _tz_clipboard_client_cb_data_only_set,
+};
+
+static void
+_tz_clipboard_client_cb_unbind(struct wl_resource *res_tz_clipboard)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client;
+
+   tz_clipboard_client = wl_resource_get_user_data(res_tz_clipboard);
+   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard_client);
+
+   _e_tizen_clipboard_client_del(tz_clipboard_client);
+}
+
+static void
+_tz_clipboard_client_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t ver, uint32_t id)
+{
+   E_Tizen_Clipboard_Client *tz_clipboard_client;
+   struct wl_resource *res_tz_clipboard;
+
+   EINA_SAFETY_ON_NULL_GOTO(g_tizen_clipboard, err);
+
+   res_tz_clipboard = wl_resource_create(client,
+                                         &tizen_clipboard_interface,
+                                         ver,
+                                         id);
+   EINA_SAFETY_ON_NULL_GOTO(res_tz_clipboard, err);
+
+   tz_clipboard_client = _e_tizen_clipboard_client_add(res_tz_clipboard);
+   EINA_SAFETY_ON_NULL_GOTO(tz_clipboard_client, err);
+
+   wl_resource_set_implementation(res_tz_clipboard,
+                                  &_tz_clipboard_client_iface,
+                                  tz_clipboard_client,
+                                  _tz_clipboard_client_cb_unbind);
+   return;
+
+err:
+   ERR("Could not create tizen_clipboard_interface res: %m");
+   wl_client_post_no_memory(client);
+}
+
+static void
+_e_policy_cb_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
+{
+   _e_tizen_clipboard_client_unset_e_client(ec);
+}
+
+EINTERN E_Tizen_Clipboard *
+e_tizen_clipboard_init(struct wl_display *display)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
+
+   if (g_tizen_clipboard) return g_tizen_clipboard;
+
+   g_tizen_clipboard = E_NEW(E_Tizen_Clipboard, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_clipboard, NULL);
+
+   g_tizen_clipboard->global = wl_global_create(display,
+                             &tizen_clipboard_interface,
+                             2,
+                             NULL,
+                             _tz_clipboard_client_cb_bind);
+
+   if (!g_tizen_clipboard->global)
+     {
+        ERR("Failed to create tizen_clipboard global");
+        E_FREE(g_tizen_clipboard);
+        g_tizen_clipboard = NULL;
+
+        return NULL;
+     }
+
+   E_CLIENT_HOOK_APPEND(hooks_ec, E_CLIENT_HOOK_DEL, _e_policy_cb_hook_client_del, NULL);
+
+   return g_tizen_clipboard;
+}
+
+EINTERN void
+e_tizen_clipboard_shutdown(void)
+{
+   E_Tizen_Clipboard_Client *clipboard_client;
+
+   if (!g_tizen_clipboard) return;
+
+   EINA_LIST_FREE(g_tizen_clipboard->clipboard_clients, clipboard_client)
+     {
+        wl_resource_destroy(clipboard_client->res_tz_clipboard);
+     }
+
+   wl_global_destroy(g_tizen_clipboard->global);
+
+   E_FREE(g_tizen_clipboard);
+   g_tizen_clipboard = NULL;
+}
+
+EINTERN void
+e_tizen_clipboard_data_selected_send(E_Client *ec)
+{
+   E_Comp_Wl_Client_Data *cdata;
+   E_Tizen_Clipboard_Client *tz_clipboard_client;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   tz_clipboard_client = _e_tizen_clipboard_client_get_from_e_client(ec);
+   EINA_SAFETY_ON_NULL_RETURN(tz_clipboard_client);
+
+   cdata = e_client_cdata_get(ec);
+
+   tizen_clipboard_send_data_selected(tz_clipboard_client->res_tz_clipboard,
+                                      cdata ? cdata->surface : NULL);
+}
diff --git a/src/bin/server/e_tizen_clipboard_intern.h b/src/bin/server/e_tizen_clipboard_intern.h
new file mode 100644 (file)
index 0000000..1016253
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef E_TIZEN_CLIPBOARD_INTERN_H
+#define E_TIZEN_CLIPBOARD_INTERN_H
+
+#include "e_intern.h"
+
+typedef struct _E_Tizen_Clipboard E_Tizen_Clipboard;
+
+EINTERN E_Tizen_Clipboard *e_tizen_clipboard_init(struct wl_display *display);
+EINTERN void               e_tizen_clipboard_shutdown(void);
+
+EINTERN void      e_tizen_clipboard_data_selected_send(E_Client *ec);
+
+#endif
\ No newline at end of file
index b9f5d1ddb82a546477955457e2e654c74c4cdbf1..cc99978553104c6e97adae0cbba5114ec729ac0d 100644 (file)
@@ -2,7 +2,7 @@
 #include "e_comp_wl_intern.h"
 #include "e_client_intern.h"
 #include "e_policy_conformant.h"
-#include "e_policy_wl_intern.h"
+#include "e_tizen_clipboard_intern.h"
 #include "e_view_client_intern.h"
 
 typedef struct _E_Policy_Cbhm E_Policy_Cbhm;
@@ -299,7 +299,7 @@ e_service_cbhm_data_selected(void)
    EINA_SAFETY_ON_TRUE_RETURN(e_object_is_del(E_OBJECT(cbhm->ec)));
 
    if (cbhm->ec->parent)
-     e_policy_wl_clipboard_data_selected_send(cbhm->ec->parent);
+     e_tizen_clipboard_data_selected_send(cbhm->ec->parent);
 }
 
 EINTERN void