e_desk: introduce e_desk private 51/299851/2
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 27 Sep 2023 02:02:57 +0000 (11:02 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 11 Oct 2023 06:12:40 +0000 (06:12 +0000)
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
src/bin/e_desk_intern.h [new file with mode: 0644]

index b786b2f9121e1fd70dc812fccdb9ee2070b41ca6..f244a1494f6e992d5fbd9f1cc1f148fbb0898b65 100644 (file)
@@ -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; i<E_DESK_AREA_LAYER_COUNT; i++)
@@ -2355,3 +2418,59 @@ e_desk_has_ec(E_Desk *desk, E_Client *ec)
 
    return EINA_FALSE;
 }
+
+EINTERN void
+e_desk_client_add_listener_add(E_Zone *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.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 (file)
index 0000000..8617695
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef E_DESK_INTERN_H
+#define E_DESK_INTERN_H
+
+#include <wayland-server.h>
+
+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