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 \
#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"
{
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
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;
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
// --------------------------------------------------------
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)
{
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);
}
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);
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);
#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;
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
};
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;
}
EINTERN void
e_server_shutdown(void)
{
+ e_tizen_clipboard_shutdown();
e_tizen_indicator_shutdown();
e_tizen_ws_shell_shutdown();
e_tizen_launch_appinfo_shutdown();
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;
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;
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;
--- /dev/null
+#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);
+}
--- /dev/null
+#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
#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;
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