From fc942753d47dfa70d053c23e1d9dbd3e74ccc9ab Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 10 Nov 2023 14:11:09 +0900 Subject: [PATCH] e_zone: use ds_tizen_screen Use ds_tizen_screen and ds_tizen_splitscreen instead of using wtz_screen server interface directly. Change-Id: Ia345ef30271d0efae47500c3a00930e6f8990492 --- configure.ac | 3 +- packaging/enlightenment.spec | 2 +- src/bin/e_desk.c | 153 +++++++++++++++++---------- src/bin/e_desk.h | 2 + src/bin/e_desk_area.c | 47 ++++++++- src/bin/e_desk_area_intern.h | 9 ++ src/bin/e_desk_intern.h | 9 ++ src/bin/e_zone.c | 240 ++++++++----------------------------------- src/bin/e_zone.h | 2 - src/bin/e_zone_intern.h | 6 -- 10 files changed, 213 insertions(+), 260 deletions(-) create mode 100644 src/bin/e_desk_area_intern.h diff --git a/configure.ac b/configure.ac index f9cdf97..6a20978 100755 --- a/configure.ac +++ b/configure.ac @@ -292,6 +292,7 @@ e_requires="\ libds-tizen-tbm-server \ libds-tizen-scaler \ libds-xdg-shell-v6 \ + libds-tizen \ " PKG_CHECK_MODULES(E_INFO, [ @@ -380,7 +381,7 @@ if test "x${e_cv_want_wayland_only}" != "xno" || test "x${e_cv_want_wayland_clie tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server tizen-dpms-server eom-server presentation-time-server tizen-hwc-server linux-explicit-synchronization-unstable-v1-server wtz-foreign-server - wtz-screen-server wtz-shell-server relative-pointer-unstable-v1-server pointer-constraints-unstable-v1-server + wtz-shell-server relative-pointer-unstable-v1-server pointer-constraints-unstable-v1-server single-pixel-buffer-v1-server wtz-blender-server], [ have_wayland=yes diff --git a/packaging/enlightenment.spec b/packaging/enlightenment.spec index 5ffdb74..86629ff 100644 --- a/packaging/enlightenment.spec +++ b/packaging/enlightenment.spec @@ -61,7 +61,6 @@ BuildRequires: pkgconfig(egl) BuildRequires: pkgconfig(linux-explicit-synchronization-unstable-v1-server) BuildRequires: pkgconfig(tizen-hwc-server) BuildRequires: pkgconfig(wtz-foreign-server) -BuildRequires: pkgconfig(wtz-screen-server) BuildRequires: pkgconfig(wtz-shell-server) BuildRequires: pkgconfig(pointer-constraints-unstable-v1-server) BuildRequires: pkgconfig(relative-pointer-unstable-v1-server) @@ -80,6 +79,7 @@ BuildRequires: pkgconfig(capi-media-streamrecorder) BuildRequires: pkgconfig(libds) BuildRequires: pkgconfig(libds-xdg-shell-v6) +BuildRequires: pkgconfig(libds-tizen) BuildRequires: pkgconfig(libds-tizen-tbm-server) BuildRequires: pkgconfig(libds-tizen-scaler) diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index fd72153..8f10725 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -1,12 +1,17 @@ #include "e.h" #include "e_policy_wl.h" -#include +#include "e_desk_area_intern.h" + +#include /* E_Desk is a child object of E_Zone. A desk is essentially a background * and an associated set of client windows. Each zone can have an arbitrary * number of desktops. */ +typedef struct _E_Desk_Private E_Desk_Private; +typedef struct _E_Desk_Smart_Data E_Desk_Smart_Data; + #define DESK_EC_DATA_KEY "E_Desk_Client" #define PRI(desk) ((E_Desk_Private *)e_object_data_get(E_OBJECT(desk))) @@ -26,9 +31,6 @@ E_DESK_SMART_DATA_GET(obj, ptr); \ if (!ptr) return -typedef struct _E_Desk_Private E_Desk_Private; -typedef struct _E_Desk_Smart_Data E_Desk_Smart_Data; - typedef enum _E_Desk_Zoom_Animating_Type { E_DESK_ZOOM_ANIMATING_TYPE_NONE, @@ -38,13 +40,22 @@ typedef enum _E_Desk_Zoom_Animating_Type struct _E_Desk_Private { + E_Desk *desk; + struct { struct wl_signal client_add; struct wl_signal desk_area_enable; struct wl_signal desk_area_disable; struct wl_signal desk_area_active_change; + struct wl_signal split_desk_activate; + struct wl_signal split_desk_deactivate; } events; + + struct ds_tizen_splitscreen *splitscreen; + struct wl_listener splitscreen_destroy; + struct wl_listener splitscreen_activate; + struct wl_listener splitscreen_deactivate; }; struct _E_Desk_Smart_Data @@ -74,6 +85,8 @@ static Eina_Inlist *_e_desk_hooks[] = [E_DESK_HOOK_DESK_AREA_ENABLE] = NULL, [E_DESK_HOOK_DESK_AREA_DISABLE] = NULL, [E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE] = NULL, + [E_DESK_HOOK_SPLIT_DESK_ACTIVATE] = NULL, + [E_DESK_HOOK_SPLIT_DESK_DEACTIVATE] = NULL, }; static void _e_desk_free(E_Desk *desk); @@ -119,10 +132,14 @@ _e_desk_private_init(E_Desk *desk) if (!priv) return EINA_FALSE; + priv->desk = desk; + wl_signal_init(&priv->events.client_add); wl_signal_init(&priv->events.desk_area_enable); wl_signal_init(&priv->events.desk_area_disable); wl_signal_init(&priv->events.desk_area_active_change); + wl_signal_init(&priv->events.split_desk_activate); + wl_signal_init(&priv->events.split_desk_deactivate); e_object_data_set(E_OBJECT(desk), priv); @@ -135,8 +152,15 @@ _e_desk_private_finish(E_Desk *desk) E_Desk_Private *priv; priv = PRI(desk); + + wl_list_remove(&priv->splitscreen_deactivate.link); + wl_list_remove(&priv->splitscreen_activate.link); + wl_list_remove(&priv->splitscreen_destroy.link); + e_object_data_set(E_OBJECT(desk), NULL); + priv->desk = NULL; + free(priv); } @@ -1395,6 +1419,7 @@ _e_desk_free(E_Desk *desk) desk->desk_area.active = NULL; } + E_FREE_FUNC(desk->smart_obj, evas_object_del); eina_stringshare_del(desk->name); desk->name = NULL; @@ -2207,89 +2232,83 @@ e_desk_desk_area_info_print(E_Desk *desk) } static void -_e_desk_splitscreen_region_cb_destroy(struct wl_client *client, - struct wl_resource *resource) +_e_desk_cb_splitscreen_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED) { - wl_resource_destroy(resource); + //TODO: } static void -_e_desk_splitscreen_region_cb_assign_appid(struct wl_client *client, - struct wl_resource *resource, const char *appid) +_e_desk_cb_split_desk_activate(struct wl_listener *listener, void *data) { - E_Desk_Area *eda; + E_Desk_Private *priv; - if (!(eda = wl_resource_get_user_data(resource))) return; + priv = container_of(listener, E_Desk_Private, splitscreen_activate); - e_desk_area_hook_call(eda, E_DESK_AREA_HOOK_SET_APPID, (void *)appid); + // call the hook for activating the splitscreen in this zone + wl_signal_emit_mutable(&priv->events.split_desk_activate, NULL); + _e_desk_hook_call(E_DESK_HOOK_SPLIT_DESK_ACTIVATE, priv->desk); } -static const struct wtz_splitscreen_region_interface - _e_desk_splitscreen_region_interface = -{ - _e_desk_splitscreen_region_cb_destroy, - _e_desk_splitscreen_region_cb_assign_appid, -}; - static void -_e_desk_splitscreen_region_cb_resource_destroy(struct wl_resource *resource) +_e_desk_cb_split_desk_deactivate(struct wl_listener *listener, void *data) { - E_Desk *desk; - E_Desk_Area *eda; - - if (!(eda = wl_resource_get_user_data(resource))) return; - if (!eda->desk) return; + E_Desk_Private *priv; - desk = eda->desk; + priv = container_of(listener, E_Desk_Private, splitscreen_deactivate); - desk->ss_region_resources = - eina_list_remove(desk->ss_region_resources, resource); + // call the hook for deactivating the splitscreen in this desk + wl_signal_emit_mutable(&priv->events.split_desk_deactivate, NULL); + _e_desk_hook_call(E_DESK_HOOK_SPLIT_DESK_DEACTIVATE, priv->desk); } EINTERN Eina_Bool -e_desk_splitscreen_regions_all_generate(E_Desk *desk, struct wl_client *client, - struct wl_resource *ss_res, uint32_t id) +e_desk_splitscreen_enable(E_Desk *desk, + struct ds_tizen_splitscreen *splitscreen) { E_Desk_Area *eda; - struct wl_resource *ss_region_res; + struct ds_tizen_splitscreen_region *splitscreen_region; Eina_List *l; int i; E_OBJECT_CHECK_RETURN(desk, EINA_FALSE); E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE); + API_ENTRY_VAL(EINA_FALSE); + + priv->splitscreen = splitscreen; + priv->splitscreen_destroy.notify = _e_desk_cb_splitscreen_destroy; + ds_tizen_splitscreen_add_destroy_listener(priv->splitscreen, + &priv->splitscreen_destroy); + priv->splitscreen_activate.notify = _e_desk_cb_split_desk_activate; + ds_tizen_splitscreen_add_activate_listener(priv->splitscreen, + &priv->splitscreen_activate); + priv->splitscreen_deactivate.notify = _e_desk_cb_split_desk_deactivate; + ds_tizen_splitscreen_add_deactivate_listener(priv->splitscreen, + &priv->splitscreen_deactivate); for (i = (E_DESK_AREA_LAYER_COUNT - 1); i >= 0; i--) { EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda) { - if (eda->name == NULL) + // The eda->name can be an id of the desk group. + if (!eda->name) { - // The eda->name can be Ientification of the desk group. + ERR("E_Desk: eda->name is null."); continue; } - ss_region_res = wl_resource_create(client, - &wtz_splitscreen_region_interface, 1, 0); - if (!ss_region_res) + + splitscreen_region = ds_tizen_splitscreen_region_create( + splitscreen, eda->name, eda->x, eda->y, eda->w, eda->h); + if (!splitscreen_region) { - wl_resource_post_no_memory(ss_res); - return EINA_FALSE; + ERR("E_Desk: ds_tizen_splitscreen_region_create() failed."); + continue; } - wl_resource_set_implementation(ss_region_res, - &_e_desk_splitscreen_region_interface, eda, - _e_desk_splitscreen_region_cb_resource_destroy); - - desk->ss_region_resources = eina_list_append( - desk->ss_region_resources, ss_region_res); - - // send the splitscreen_region resources - wtz_splitscreen_send_region(ss_res, ss_region_res); - - // send the name of the split_screen_region - wtz_splitscreen_region_send_name(ss_region_res, eda->name); - - // send the geometry of the split_screen_region - wtz_splitscreen_region_send_geometry(ss_region_res, eda->x, eda->y, eda->w, eda->h); + if (!e_desk_area_splitscreen_region_enable(eda, splitscreen_region)) + { + ERR("E_Desk: e_desk_area_splitscreen_region_enable() failed."); + continue; + } } } @@ -2364,3 +2383,31 @@ e_desk_desk_area_active_change_listener_get(E_Desk *desk, wl_notify_func_t notif API_ENTRY_VAL(NULL); return wl_signal_get(&priv->events.desk_area_active_change, notify); } + +EINTERN void +e_desk_ssplit_desk_activate_listener_add(E_Desk *desk, struct wl_listener *listener) +{ + API_ENTRY; + wl_signal_add(&priv->events.split_desk_activate, listener); +} + +EINTERN struct wl_listener * +e_desk_split_desk_activate_listener_get(E_Desk *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.split_desk_activate, notify); +} + +EINTERN void +e_desk_split_desk_deactivate_listener_add(E_Desk *desk, struct wl_listener *listener) +{ + API_ENTRY; + wl_signal_add(&priv->events.split_desk_deactivate, listener); +} + +EINTERN struct wl_listener * +e_desk_split_desk_deactivate_listener_get(E_Desk *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.split_desk_deactivate, notify); +} diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index edd7ce9..7a3db7a 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -41,6 +41,8 @@ typedef enum _E_Desk_Hook_Point E_DESK_HOOK_DESK_AREA_ENABLE, E_DESK_HOOK_DESK_AREA_DISABLE, E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE, + E_DESK_HOOK_SPLIT_DESK_ACTIVATE, + E_DESK_HOOK_SPLIT_DESK_DEACTIVATE, E_DESK_HOOK_LAST } E_Desk_Hook_Point; diff --git a/src/bin/e_desk_area.c b/src/bin/e_desk_area.c index f6f7127..bc7e1cf 100644 --- a/src/bin/e_desk_area.c +++ b/src/bin/e_desk_area.c @@ -1,5 +1,7 @@ #include "e.h" +#include + typedef struct _E_Desk_Area_Private E_Desk_Area_Private; #define PRI(eda) ((E_Desk_Area_Private *)e_object_data_get(E_OBJECT(eda))) @@ -12,8 +14,6 @@ typedef struct _E_Desk_Area_Private E_Desk_Area_Private; EINA_SAFETY_ON_NULL_RETURN_VAL(eda, ret); \ E_Desk_Area_Private *priv = PRI(eda) -typedef struct _E_Desk_Area_Private E_Desk_Area_Private; - static int _e_desk_area_hooks_delete = 0; static int _e_desk_area_hooks_walking = 0; @@ -25,6 +25,10 @@ static Eina_Inlist *_e_desk_area_hooks[] = struct _E_Desk_Area_Private { E_Desk_Area *eda; + + struct ds_tizen_splitscreen_region *splitscreen_region; + struct wl_listener splitscreen_region_destroy; + struct wl_listener splitscreen_region_assign_appid; }; struct _E_Desk_Area_Hook @@ -223,6 +227,10 @@ _e_desk_area_private_finish(E_Desk_Area *eda) E_Desk_Area_Private *priv; priv = PRI(eda); + + wl_list_remove(&priv->splitscreen_region_assign_appid.link); + wl_list_remove(&priv->splitscreen_region_destroy.link); + e_object_data_set(E_OBJECT(eda), NULL); priv->eda = NULL; @@ -1183,3 +1191,38 @@ e_desk_area_ec_enable_set(E_Desk_Area *eda, E_Client *ec, Eina_Bool enable) return EINA_TRUE; } + +static void +_desk_area_cb_splitscreen_region_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED) +{ + //TODO: +} + +static void +_desk_area_cb_splitscreen_region_assign_appid(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED) +{ + E_Desk_Area_Private *priv; + const char *appid = data; + + priv = container_of(listener, E_Desk_Area_Private, splitscreen_region_assign_appid); + + e_desk_area_hook_call(priv->eda, E_DESK_AREA_HOOK_SET_APPID, (void *)appid); +} + +EINTERN Eina_Bool +e_desk_area_splitscreen_region_enable(E_Desk_Area *eda, struct ds_tizen_splitscreen_region *splitscreen_region) +{ + API_ENTRY_VAL(EINA_FALSE); + + if (!splitscreen_region) return EINA_FALSE; + + priv->splitscreen_region = splitscreen_region; + priv->splitscreen_region_destroy.notify = _desk_area_cb_splitscreen_region_destroy; + ds_tizen_splitscreen_region_add_destroy_listener( + priv->splitscreen_region, &priv->splitscreen_region_destroy); + priv->splitscreen_region_assign_appid.notify = _desk_area_cb_splitscreen_region_assign_appid; + ds_tizen_splitscreen_region_add_assign_appid_listener( + priv->splitscreen_region, &priv->splitscreen_region_assign_appid); + + return EINA_TRUE; +} diff --git a/src/bin/e_desk_area_intern.h b/src/bin/e_desk_area_intern.h new file mode 100644 index 0000000..5c04abe --- /dev/null +++ b/src/bin/e_desk_area_intern.h @@ -0,0 +1,9 @@ +#ifndef E_DESK_AREA_INTERN_H +#define E_DESK_AREA_INTERN_H + +#include +#include + +EINTERN Eina_Bool e_desk_area_splitscreen_region_enable(E_Desk_Area *eda, struct ds_tizen_splitscreen_region *splitscreen_region); + +#endif diff --git a/src/bin/e_desk_intern.h b/src/bin/e_desk_intern.h index c780b03..66914be 100644 --- a/src/bin/e_desk_intern.h +++ b/src/bin/e_desk_intern.h @@ -2,6 +2,7 @@ #define E_DESK_INTERN_H #include +#include EINTERN void e_desk_client_add_listener_add(E_Desk *desk, struct wl_listener *listener); EINTERN struct wl_listener *e_desk_client_add_listener_get(E_Desk *desk, wl_notify_func_t notify); @@ -15,4 +16,12 @@ EINTERN struct wl_listener *e_desk_desk_area_disable_listener_get(E_Desk *desk, EINTERN void e_desk_desk_area_active_change_listener_add(E_Desk *desk, struct wl_listener *listener); EINTERN struct wl_listener *e_desk_desk_area_active_change_listener_get(E_Desk *desk, wl_notify_func_t notify); +EINTERN void e_desk_split_desk_activate_listener_add(E_Desk *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_split_desk_activate_listener_get(E_Desk *desk, wl_notify_func_t notify); + +EINTERN void e_desk_splitscreen_deactivate_listener_add(E_Desk *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_splitscreen_deactivate_listener_get(E_Desk *desk, wl_notify_func_t notify); + +EINTERN Eina_Bool e_desk_splitscreen_enable(E_Desk *desk, struct ds_tizen_splitscreen *splitscreen); + #endif diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index bebe42a..447d9a9 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -1,8 +1,7 @@ #include "e.h" #include "e_client_intern.h" - -#include -#include +#include "e_desk_intern.h" +#include #define ZONE_EC_DATA_KEY "E_Zone_Client" @@ -21,16 +20,20 @@ typedef struct _E_Zone_Private_Client E_Zone_Private_Client; struct _E_Zone_Private { + E_Zone *zone; + struct { struct wl_signal client_add; struct wl_signal client_remove; struct wl_signal display_state_change; - struct wl_signal splitscreen_activate; - struct wl_signal splitscreen_deactivate; struct wl_signal focus_clear; struct wl_signal focus_reset; } events; + + struct ds_tizen_screen *tizen_screen; + struct wl_listener screen_destroy; + struct wl_listener screen_get_splitscreen; }; struct _E_Zone_Private_Client @@ -94,8 +97,6 @@ static int _e_zone_hooks_walking = 0; static Eina_Inlist *_e_zone_hooks[] = { [E_ZONE_HOOK_DISPLAY_STATE_CHANGE] = NULL, - [E_ZONE_HOOK_SPLISCREEN_ACTIVATE] = NULL, - [E_ZONE_HOOK_SPLISCREEN_DEACTIVATE] = NULL, }; static Eina_Bool @@ -107,11 +108,11 @@ _e_zone_private_init(E_Zone *zone) if (!priv) return EINA_FALSE; + priv->zone = zone; + wl_signal_init(&priv->events.client_add); wl_signal_init(&priv->events.client_remove); wl_signal_init(&priv->events.display_state_change); - wl_signal_init(&priv->events.splitscreen_activate); - wl_signal_init(&priv->events.splitscreen_deactivate); wl_signal_init(&priv->events.focus_clear); wl_signal_init(&priv->events.focus_reset); @@ -128,6 +129,11 @@ _e_zone_private_finish(E_Zone *zone) priv = PRI(zone); e_object_data_set(E_OBJECT(zone), NULL); + wl_list_remove(&priv->screen_get_splitscreen.link); + wl_list_remove(&priv->screen_destroy.link); + + priv->zone = NULL; + free(priv); } @@ -2076,185 +2082,57 @@ e_zone_hook_del(E_Zone_Hook *zh) } static void -_e_zone_screen_capability_add(struct wl_resource *resource, - struct wl_array *capabilities, uint32_t cap) -{ - uint32_t *c; - - c = wl_array_add(capabilities, sizeof(*c)); - if (c) - *c = cap; - else - wl_resource_post_no_memory(resource); -} - -static void -_e_zone_splitscreen_cb_destroy(struct wl_client *client, - struct wl_resource *resource) +_e_zone_cb_get_splitscreen(struct wl_listener *listener, void *data) { - wl_resource_destroy(resource); -} - -static void -_e_zone_splitscreen_cb_activate(struct wl_client *client, - struct wl_resource *resource) -{ - E_Zone *zone; - - if (!(zone = wl_resource_get_user_data(resource))) return; - - // call the hook for activating the splitscreen in this zone - wl_signal_emit_mutable(&PRI(zone)->events.splitscreen_activate, NULL); - _e_zone_hook_call(E_ZONE_HOOK_SPLISCREEN_ACTIVATE, zone); -} - -static void -_e_zone_splitscreen_cb_deactivate(struct wl_client *client, - struct wl_resource *resource) -{ - E_Zone *zone; + E_Zone_Private *priv; + E_Desk *desk; + struct ds_tizen_splitscreen *splitscreen; - if (!(zone = wl_resource_get_user_data(resource))) return; + priv = container_of(listener, E_Zone_Private, screen_get_splitscreen); + splitscreen = (struct ds_tizen_splitscreen *)data; - // call the hook for deactivating the splitscreen in this zone - wl_signal_emit_mutable(&PRI(zone)->events.splitscreen_deactivate, NULL); - _e_zone_hook_call(E_ZONE_HOOK_SPLISCREEN_DEACTIVATE, zone); -} - -static const struct wtz_splitscreen_interface _e_zone_splitscreen_interface = -{ - _e_zone_splitscreen_cb_destroy, - _e_zone_splitscreen_cb_activate, - _e_zone_splitscreen_cb_deactivate, -}; - -static void -_e_zone_splitscreen_cb_resource_destroy(struct wl_resource *resource) -{ - // TODO: -} - -static void -_e_zone_screen_cb_destroy(struct wl_client *client EINA_UNUSED, - struct wl_resource *resource) -{ - wl_resource_destroy(resource); -} - -static void -_e_zone_screen_cb_get_splitscreen(struct wl_client *client, - struct wl_resource *resource, uint32_t id) -{ - E_Zone *zone; - E_Desk *desk; - struct wl_resource *ss_res; - - if (!(zone = wl_resource_get_user_data(resource))) return; - - if (!zone->splitscreen_enabled) - { - ELOGF("E_Zone", "Screen dose not support Splitscreen.", NULL); - return; - } - - ss_res = wl_resource_create(client, - &wtz_splitscreen_interface, 1, id); - if (!ss_res) - { - wl_resource_post_no_memory(resource); - return; - } - - wl_resource_set_implementation(ss_res, - &_e_zone_splitscreen_interface, zone, - _e_zone_splitscreen_cb_resource_destroy); - - // The splitscreen_regions are the e_desk_areas associated with this - // E_Zone(E_Desk) and these are already created by the e20 module with the - // specifc policy. So e20 sends the splitscreen_regions associated with each - // e_desk_area. - desk = e_desk_current_get(zone); - if (!e_desk_splitscreen_regions_all_generate(desk, client, ss_res, id)) + // The splitscreen_regions are the e_desk_areas associated with this + // E_Zone(E_Desk) and these are already created by the e20 module with the + // specific policy. So e20 sends the splitscreen_regions associated with each + // e_desk_area. + desk = e_desk_current_get(priv->zone); + if (!e_desk_splitscreen_enable(desk, splitscreen)) { - ELOGF("E_Zone", "e_desk_splitscreen_regions_all_generate() failed.", - NULL); - return; - + ELOGF("E_Zone", "e_desk_splitscreen_enable() failed.", NULL); + return; } - ELOGF("E_Zone", "Create a splitscreen resource. zone_id:%d", NULL, zone->id); -} - -static const struct wtz_screen_interface _e_zone_screen_interface = -{ - _e_zone_screen_cb_destroy, - _e_zone_screen_cb_get_splitscreen, -}; - -static void -_e_zone_screen_cb_unbind(struct wl_resource *resource) -{ - E_Zone *zone; - - if (!(zone = wl_resource_get_user_data(resource))) return; - - zone->resources = eina_list_remove(zone->resources, resource); + ELOGF("E_Zone", "Enable SplitScreen. zone_id:%d", NULL, priv->zone->id); } static void -_e_zone_screen_cb_bind(struct wl_client *client, void *data, - uint32_t version, uint32_t id) +_e_zone_cb_screen_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED) { - E_Zone *zone; - struct wl_resource *resource; - struct wl_array capabilities; - - if (!(zone = data)) return; - - resource = - wl_resource_create(client, &wtz_screen_interface, version, id); - if (!resource) - { - wl_client_post_no_memory(client); - return; - } - - zone->resources = eina_list_append(zone->resources, resource); - - wl_resource_set_implementation(resource, &_e_zone_screen_interface, zone, - _e_zone_screen_cb_unbind); - wl_resource_set_user_data(resource, zone); - - // send the size of the screen - // [TODO] calculate the size with base output resolution. - wtz_screen_send_size(resource, zone->w, zone->h); - - // send the name of the screen - wtz_screen_send_name(resource, zone->name); + E_Zone_Private *priv; - // send the capabilities of the screen - wl_array_init(&capabilities); - if (zone->splitscreen_enabled) - _e_zone_screen_capability_add(resource, &capabilities, - WTZ_SCREEN_CAPABILITY_SPLITSCREEN); - wtz_screen_send_capabilities(resource, &capabilities); - - ELOGF("E_Zone", "Bound wtz_screen zone->id: %d Size: %dx%d", NULL, - zone->id, zone->w, zone->h); + priv = container_of(listener, E_Zone_Private, screen_destroy); + priv->tizen_screen = NULL; } EINTERN E_Zone * e_zone_screen_new(int num, int w, int h) { E_Zone *zone; + E_Zone_Private *priv; zone = e_zone_new(num, num, 0, 0, w, h); EINA_SAFETY_ON_NULL_RETURN_VAL(zone, NULL); - zone->global = - wl_global_create(e_comp_wl->wl.disp, &wtz_screen_interface, - 1, zone, _e_zone_screen_cb_bind); - EINA_SAFETY_ON_NULL_RETURN_VAL(zone->global, NULL); + priv = PRI(zone); + + priv->tizen_screen = ds_tizen_screen_create(e_comp_wl->wl.disp); + EINA_SAFETY_ON_NULL_RETURN_VAL(priv->tizen_screen, NULL); + + priv->screen_destroy.notify = _e_zone_cb_screen_destroy; + ds_tizen_screen_add_destroy_listener(priv->tizen_screen, &priv->screen_destroy); + + priv->screen_get_splitscreen.notify = _e_zone_cb_get_splitscreen; + ds_tizen_screen_add_get_splitscreen_listener(priv->tizen_screen, &priv->screen_get_splitscreen); return zone; } @@ -2829,34 +2707,6 @@ e_zone_display_state_change_listener_get(E_Zone *zone, wl_notify_func_t notify) } EINTERN void -e_zone_splitscreen_activate_listener_add(E_Zone *zone, struct wl_listener *listener) -{ - API_ENTRY; - wl_signal_add(&priv->events.splitscreen_activate, listener); -} - -EINTERN struct wl_listener * -e_zone_splitscreen_activate_listener_get(E_Zone *zone, wl_notify_func_t notify) -{ - API_ENTRY_VAL(NULL); - return wl_signal_get(&priv->events.splitscreen_activate, notify); -} - -EINTERN void -e_zone_splitscreen_deactivate_listener_add(E_Zone *zone, struct wl_listener *listener) -{ - API_ENTRY; - wl_signal_add(&priv->events.splitscreen_deactivate, listener); -} - -EINTERN struct wl_listener * -e_zone_splitscreen_deactivate_listener_get(E_Zone *zone, wl_notify_func_t notify) -{ - API_ENTRY_VAL(NULL); - return wl_signal_get(&priv->events.splitscreen_deactivate, notify); -} - -EINTERN void e_zone_focus_clear_listener_add(E_Zone *zone, struct wl_listener *listener) { API_ENTRY; diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index b5fda76..de503ab 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -41,8 +41,6 @@ typedef struct _E_Zone_Hook E_Zone_Hook; typedef enum _E_Zone_Hook_Point { E_ZONE_HOOK_DISPLAY_STATE_CHANGE, - E_ZONE_HOOK_SPLISCREEN_ACTIVATE, - E_ZONE_HOOK_SPLISCREEN_DEACTIVATE, E_ZONE_HOOK_LAST } E_Zone_Hook_Point; diff --git a/src/bin/e_zone_intern.h b/src/bin/e_zone_intern.h index 9f1d370..b5bbdec 100644 --- a/src/bin/e_zone_intern.h +++ b/src/bin/e_zone_intern.h @@ -12,12 +12,6 @@ EINTERN struct wl_listener *e_zone_client_remove_listener_get(E_Zone *zone, wl_n EINTERN void e_zone_display_state_change_listener_add(E_Zone *zone, struct wl_listener *listener); EINTERN struct wl_listener *e_zone_display_state_change_listener_get(E_Zone *zone, wl_notify_func_t notify); -EINTERN void e_zone_splitscreen_activate_listener_add(E_Zone *zone, struct wl_listener *listener); -EINTERN struct wl_listener *e_zone_splitscreen_activate_listener_get(E_Zone *zone, wl_notify_func_t notify); - -EINTERN void e_zone_splitscreen_deactivate_listener_add(E_Zone *zone, struct wl_listener *listener); -EINTERN struct wl_listener *e_zone_splitscreen_deactivate_listener_get(E_Zone *zone, wl_notify_func_t notify); - EINTERN void e_zone_focus_clear_listener_add(E_Zone *zone, struct wl_listener *listener); EINTERN struct wl_listener *e_zone_focus_clear_listener_get(E_Zone *zone, wl_notify_func_t notify); -- 2.7.4