From a950c3dfa2a47a452781d3f97c2b5bae2ebc6fa2 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 27 Sep 2023 11:02:57 +0900 Subject: [PATCH] e_desk: introduce e_desk private E_Desk has a private data using e_object_set_data. It can make a e_desk encapsulate its private data. Change-Id: I1936ab7d105eb33fcee0e721bdaf88a756098088 --- src/bin/e_desk.c | 119 ++++++++++++++++++++++++++++++++++++++++ src/bin/e_desk_intern.h | 18 ++++++ 2 files changed, 137 insertions(+) create mode 100644 src/bin/e_desk_intern.h diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index b786b2f912..f244a1494f 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -9,13 +9,24 @@ #define DESK_EC_DATA_KEY "E_Desk_Client" +#define PRI(desk) ((E_Desk_Private *)e_object_data_get(E_OBJECT(desk))) + +#define API_ENTRY \ + EINA_SAFETY_ON_NULL_RETURN(desk); \ + E_Desk_Private *priv = PRI(desk) + #define E_DESK_SMART_DATA_GET(obj, ptr) \ E_Desk_Smart_Data *ptr = evas_object_smart_data_get(obj); +#define API_ENTRY_VAL(ret) \ + EINA_SAFETY_ON_NULL_RETURN_VAL(desk, ret); \ + E_Desk_Private *priv = PRI(desk) + #define E_DESK_SMART_DATA_GET_OR_RETURN(obj, ptr) \ 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 @@ -25,6 +36,17 @@ typedef enum _E_Desk_Zoom_Animating_Type E_DESK_ZOOM_ANIMATING_TYPE_DISABLE, } E_Desk_Zoom_Animating_Type; +struct _E_Desk_Private +{ + 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; + } events; +}; + struct _E_Desk_Smart_Data { Evas_Object_Smart_Clipped_Data base; @@ -94,6 +116,35 @@ E_API int E_EVENT_DESK_GEOMETRY_CHANGE = 0; E_API int E_EVENT_DESK_ZOOM_SET = 0; E_API int E_EVENT_DESK_ZOOM_UNSET = 0; +static Eina_Bool +_e_desk_private_init(E_Desk *desk) +{ + E_Desk_Private *priv; + + priv = E_NEW(E_Desk_Private, 1); + if (!priv) + return EINA_FALSE; + + 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); + + e_object_data_set(E_OBJECT(desk), priv); + + return EINA_TRUE; +} + +static void +_e_desk_private_finish(E_Desk *desk) +{ + E_Desk_Private *priv; + + priv = PRI(desk); + e_object_data_set(E_OBJECT(desk), NULL); + + free(priv); +} static void _e_desk_event_simple_free(void *d EINA_UNUSED, E_Event_Desk *event) @@ -155,6 +206,12 @@ e_desk_new(E_Zone *zone, int x, int y) desk = E_OBJECT_ALLOC(E_Desk, E_DESK_TYPE, _e_desk_free); if (!desk) return NULL; + if (!_e_desk_private_init(desk)) + { + e_object_del(E_OBJECT(desk)); + return NULL; + } + desk->zone = zone; desk->x = x; desk->y = y; @@ -748,6 +805,7 @@ e_desk_client_add(E_Desk *desk, E_Client *ec) _e_desk_client_data_set(desk, ec); #ifdef REFACTOR_ZONE_DESK + wl_signal_emit_mutable(&PRI(desk)->events.client_add, desk); _e_desk_hook_call(E_DESK_HOOK_CLIENT_ADD, desk); #endif @@ -1418,6 +1476,8 @@ _e_desk_free(E_Desk *desk) eina_stringshare_del(desk->name); desk->name = NULL; E_FREE_LIST(desk->handlers, ecore_event_handler_del); + + _e_desk_private_finish(desk); free(desk); } @@ -1985,6 +2045,7 @@ e_desk_desk_area_active_set(E_Desk *desk, E_Desk_Area *eda) desk->desk_area.active = eda; + wl_signal_emit_mutable(&PRI(desk)->events.desk_area_active_change, desk); _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE, desk); } @@ -2033,6 +2094,7 @@ e_desk_desk_area_enable(E_Desk *desk) if (desk->desk_area.enable) return EINA_TRUE; desk->desk_area.enable = EINA_TRUE; + wl_signal_emit_mutable(&PRI(desk)->events.desk_area_enable, desk); _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_ENABLE, desk); // check all ec is included in desk group @@ -2064,6 +2126,7 @@ e_desk_desk_area_disable(E_Desk *desk) if (!desk->desk_area.enable) return EINA_TRUE; desk->desk_area.enable = EINA_FALSE; + wl_signal_emit_mutable(&PRI(desk)->events.desk_area_disable, desk); _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_DISABLE, desk); for (int i=0; ievents.client_add, listener); +} + +EINTERN struct wl_listener * +e_desk_client_add_listener_get(E_Zone *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.client_add, notify); +} + +EINTERN void +e_desk_desk_area_enable_listener_add(E_Zone *desk, struct wl_listener *listener) +{ + API_ENTRY; + wl_signal_add(&priv->events.desk_area_enable, listener); +} + +EINTERN struct wl_listener * +e_desk_desk_area_enable_listener_get(E_Zone *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.desk_area_enable, notify); +} + +EINTERN void +e_desk_desk_area_disable_listener_add(E_Zone *desk, struct wl_listener *listener) +{ + API_ENTRY; + wl_signal_add(&priv->events.desk_area_disable, listener); +} + +EINTERN struct wl_listener * +e_desk_desk_area_disable_listener_get(E_Zone *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.desk_area_disable, notify); +} + +EINTERN void +e_desk_desk_area_active_change_listener_add(E_Zone *desk, struct wl_listener *listener) +{ + API_ENTRY; + wl_signal_add(&priv->events.desk_area_active_change, listener); +} + +EINTERN struct wl_listener * +e_desk_desk_area_active_change_listener_get(E_Zone *desk, wl_notify_func_t notify) +{ + API_ENTRY_VAL(NULL); + return wl_signal_get(&priv->events.desk_area_active_change, notify); +} diff --git a/src/bin/e_desk_intern.h b/src/bin/e_desk_intern.h new file mode 100644 index 0000000000..861769553a --- /dev/null +++ b/src/bin/e_desk_intern.h @@ -0,0 +1,18 @@ +#ifndef E_DESK_INTERN_H +#define E_DESK_INTERN_H + +#include + +EINTERN void e_desk_client_add_listener_add(E_Zone *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_client_add_listener_get(E_Zone *desk, wl_notify_func_t notify); + +EINTERN void e_desk_desk_area_enable_listener_add(E_Zone *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_desk_area_enable_listener_get(E_Zone *desk, wl_notify_func_t notify); + +EINTERN void e_desk_desk_area_disable_listener_add(E_Zone *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_desk_area_disable_listener_get(E_Zone *desk, wl_notify_func_t notify); + +EINTERN void e_desk_desk_area_active_change_listener_add(E_Zone *desk, struct wl_listener *listener); +EINTERN struct wl_listener *e_desk_desk_area_active_change_listener_get(E_Zone *desk, wl_notify_func_t notify); + +#endif -- 2.34.1