e_policy_wl: refactoring tzsh_client 80/263180/1 accepted/tizen/unified/20210830.132245 submit/tizen/20210830.064626
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 27 Aug 2021 08:45:59 +0000 (17:45 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 27 Aug 2021 08:48:47 +0000 (17:48 +0900)
E_Policy_Wl_Tzsh_Client structure
- add handle_type to replace each type values
- add client_data for each tzsh_client's private data

Change-Id: Ie255694cdd3bc4b3a6da80d3ff27c95b258a6e07

src/bin/e_policy_wl.c

index 583eadf16ae54511adf16176b7556cfde2c1e6e3..36d4b38d6611779fc504fad82c71f012f6d353d6 100644 (file)
@@ -37,6 +37,13 @@ typedef enum _Tzsh_Srv_Role
    TZSH_SRV_ROLE_MAX
 } Tzsh_Srv_Role;
 
+typedef enum _Tzsh_Client_Handle_Type
+{
+   TZSH_CLIENT_HANDLE_TYPE_NONE = 0,
+   TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL = 1,
+   TZSH_CLIENT_HANDLE_TYPE_SHARED_WIDGET_LAUNCH = 2,
+} Tzsh_Client_Handle_Type;
+
 typedef enum _Tzsh_Type
 {
    TZSH_TYPE_UNKNOWN = 0,
@@ -85,13 +92,17 @@ typedef struct _E_Policy_Wl_Tzsh_Client
 {
    E_Policy_Wl_Tzsh        *tzsh;
    struct wl_resource *res_tzsh_client;
-   Eina_Bool           qp_client;
-   E_Quickpanel_Type   qp_type;
-   Eina_Bool           swl_client;
+   Tzsh_Client_Handle_Type handle_type;
    E_Pixmap *ep;
    E_Client *ec;
+   void *client_data;
 } E_Policy_Wl_Tzsh_Client;
 
+typedef struct _E_Policy_Wl_Tzsh_Client_Data_Quickpanel
+{
+   E_Quickpanel_Type type;
+} E_Policy_Wl_Tzsh_Client_Data_Quickpanel;
+
 typedef struct _E_Policy_Wl_Tzsh_Region
 {
    E_Policy_Wl_Tzsh        *tzsh;
@@ -779,15 +790,6 @@ _e_policy_wl_tzsh_client_del(E_Policy_Wl_Tzsh_Client *tzsh_client)
    _print_tzsh_client_info();
 #endif
 
-   if (tzsh_client->ec)
-     {
-        if (tzsh_client->qp_client)
-          e_qp_client_del(tzsh_client->ec,
-                          tzsh_client->qp_type);
-        if (tzsh_client->swl_client)
-          e_service_launcher_release_shared_widget_launch(tzsh_client->ec);
-     }
-
    if (tzsh_client->res_tzsh_client)
      wl_resource_set_user_data(tzsh_client->res_tzsh_client, NULL);
 
@@ -4647,6 +4649,22 @@ e_tzsh_indicator_srv_ower_win_update(E_Zone *zone)
 // --------------------------------------------------------
 // tizen_ws_shell_interface::quickpanel
 // --------------------------------------------------------
+static void
+_tzsh_client_data_quickpanel_type_set(E_Policy_Wl_Tzsh_Client_Data_Quickpanel *quickpanel_client, E_Quickpanel_Type type)
+{
+   if (quickpanel_client)
+     quickpanel_client->type = type;
+}
+
+static E_Quickpanel_Type
+_tzsh_client_data_quickpanel_type_get(E_Policy_Wl_Tzsh_Client_Data_Quickpanel *quickpanel_client)
+{
+   if (!quickpanel_client)
+     return E_QUICKPANEL_TYPE_UNKNOWN;
+   else
+     return quickpanel_client->type;
+}
+
 static void
 _e_tzsh_qp_state_change_send(struct wl_resource *res_tzsh_client, int type, int value)
 {
@@ -4667,6 +4685,27 @@ _e_tzsh_qp_state_change_send(struct wl_resource *res_tzsh_client, int type, int
    wl_array_release(&states);
 }
 
+static Eina_Bool
+_e_tzsh_qp_client_data_type_check(E_Policy_Wl_Tzsh_Client *tzsh_client, E_Quickpanel_Type type)
+{
+   E_Policy_Wl_Tzsh_Client_Data_Quickpanel *tzsh_client_quickpanel;
+
+   if (!tzsh_client)
+     return EINA_FALSE;
+
+   if (tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL)
+     return EINA_FALSE;
+
+   tzsh_client_quickpanel = (E_Policy_Wl_Tzsh_Client_Data_Quickpanel*)tzsh_client->client_data;
+   if (!tzsh_client_quickpanel)
+     return EINA_FALSE;
+
+   if (_tzsh_client_data_quickpanel_type_get(tzsh_client_quickpanel) != type)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
 E_API void
 e_tzsh_qp_state_visible_update(E_Client *ec, Eina_Bool vis, E_Quickpanel_Type type)
 {
@@ -4680,7 +4719,8 @@ e_tzsh_qp_state_visible_update(E_Client *ec, Eina_Bool vis, E_Quickpanel_Type ty
    EINA_LIST_FOREACH(polwl->tzsh_clients, l, tzsh_client)
      {
         /* check for type of qp */
-        if (tzsh_client->qp_type != type) continue;
+        if (!_e_tzsh_qp_client_data_type_check(tzsh_client, type))
+          continue;
         if (!tzsh_client->tzsh) continue;
         if (!tzsh_client->ec) continue;
 
@@ -4719,7 +4759,8 @@ e_tzsh_qp_state_scrollable_update(E_Client *ec, Eina_Bool scrollable, E_Quickpan
    EINA_LIST_FOREACH(polwl->tzsh_clients, l, tzsh_client)
      {
         /* check for type of qp */
-        if (tzsh_client->qp_type != type) continue;
+        if (!_e_tzsh_qp_client_data_type_check(tzsh_client, type))
+          continue;
         if (!tzsh_client->tzsh) continue;
         if (!tzsh_client->ec) continue;
 
@@ -4758,7 +4799,8 @@ e_tzsh_qp_state_orientation_update(E_Client *ec, int ridx, E_Quickpanel_Type typ
    EINA_LIST_FOREACH(polwl->tzsh_clients, l, tzsh_client)
      {
         /* check for type of qp */
-        if (tzsh_client->qp_type != type) continue;
+        if (!_e_tzsh_qp_client_data_type_check(tzsh_client, type))
+          continue;
         if (!tzsh_client->tzsh) continue;
         if (!tzsh_client->ec) continue;
 
@@ -4790,6 +4832,18 @@ _tzsh_qp_iface_cb_release(struct wl_client *client EINA_UNUSED, struct wl_resour
    wl_resource_destroy(res_tzsh_qp);
 }
 
+static E_Quickpanel_Type
+_e_tzsh_qp_type_get(E_Policy_Wl_Tzsh_Client *tzsh_client)
+{
+   E_Policy_Wl_Tzsh_Client_Data_Quickpanel *tzsh_client_quickpanel;
+   tzsh_client_quickpanel = (E_Policy_Wl_Tzsh_Client_Data_Quickpanel*)tzsh_client->client_data;
+   if (!tzsh_client_quickpanel)
+     return E_QUICKPANEL_TYPE_UNKNOWN;
+   else
+     return _tzsh_client_data_quickpanel_type_get(tzsh_client_quickpanel);
+}
+
+
 static void
 _tzsh_qp_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_qp)
 {
@@ -4802,16 +4856,17 @@ _tzsh_qp_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   e_qp_client_show(ec, tzsh_client->qp_type);
+   e_qp_client_show(ec, qp_type);
 }
 
 static void
@@ -4826,16 +4881,17 @@ _tzsh_qp_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   e_qp_client_hide(ec, tzsh_client->qp_type);
+   e_qp_client_hide(ec, qp_type);
 }
 
 static void
@@ -4850,16 +4906,17 @@ _tzsh_qp_iface_cb_enable(struct wl_client *client EINA_UNUSED, struct wl_resourc
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   e_qp_client_scrollable_state_set(ec, tzsh_client->qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_SET);
+   e_qp_client_scrollable_state_set(ec, qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_SET);
 }
 
 static void
@@ -4874,16 +4931,17 @@ _tzsh_qp_iface_cb_disable(struct wl_client *client EINA_UNUSED, struct wl_resour
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
-   e_qp_client_scrollable_state_set(ec, tzsh_client->qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_UNSET);
+   e_qp_client_scrollable_state_set(ec, qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_UNSET);
 }
 
 static void
@@ -4900,9 +4958,10 @@ _tzsh_qp_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl_reso
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
 
@@ -4913,11 +4972,11 @@ _tzsh_qp_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl_reso
      {
       case TWS_QUICKPANEL_STATE_TYPE_VISIBILITY:
         val = TWS_QUICKPANEL_STATE_VALUE_VISIBLE_HIDE;
-        vis = e_qp_visible_get(ec, tzsh_client->qp_type);
+        vis = e_qp_visible_get(ec, qp_type);
         if (vis) val = TWS_QUICKPANEL_STATE_VALUE_VISIBLE_SHOW;
         break;
       case TWS_QUICKPANEL_STATE_TYPE_SCROLLABLE:
-        scrollable = e_qp_client_scrollable_state_get(ec, tzsh_client->qp_type);
+        scrollable = e_qp_client_scrollable_state_get(ec, qp_type);
         if (scrollable == E_QUICKPANEL_CLIENT_SCROLL_STATE_UNSET)
           val = TWS_QUICKPANEL_STATE_VALUE_SCROLLABLE_UNSET;
         else if (scrollable == E_QUICKPANEL_CLIENT_SCROLL_STATE_SET)
@@ -4928,7 +4987,7 @@ _tzsh_qp_iface_cb_state_get(struct wl_client *client EINA_UNUSED, struct wl_reso
           val = TWS_QUICKPANEL_STATE_VALUE_SCROLLABLE_SET;
         break;
       case TWS_QUICKPANEL_STATE_TYPE_ORIENTATION:
-        ridx = e_qp_orientation_get(ec, tzsh_client->qp_type);
+        ridx = e_qp_orientation_get(ec, qp_type);
         val = TWS_QUICKPANEL_STATE_VALUE_ORIENTATION_0 + ridx;
         break;
       default:
@@ -4950,11 +5009,17 @@ _tzsh_qp_iface_cb_type_set(struct wl_client *client EINA_UNUSED, struct wl_resou
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
+
+   E_Policy_Wl_Tzsh_Client_Data_Quickpanel *tzsh_client_quickpanel;
+   tzsh_client_quickpanel = (E_Policy_Wl_Tzsh_Client_Data_Quickpanel*)tzsh_client->client_data;
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client_quickpanel);
 
-   /* unexpected case: this client has already specific quickpanel type */
-   EINA_SAFETY_ON_FALSE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _tzsh_client_data_quickpanel_type_get(tzsh_client_quickpanel);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type != E_QUICKPANEL_TYPE_UNKNOWN);
+
+   _tzsh_client_data_quickpanel_type_set(tzsh_client_quickpanel, type);
 
-   tzsh_client->qp_type = (E_Quickpanel_Type)type;
    ec = tzsh_client->ec;
 
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
@@ -4980,21 +5045,21 @@ _tzsh_qp_iface_cb_scrollable_state_set(struct wl_client *client EINA_UNUSED, str
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->handle_type != TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL);
 
-   /* unexpected case: this client doesn't have specific quickpanel type */
-   EINA_SAFETY_ON_TRUE_RETURN(tzsh_client->qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
+   E_Quickpanel_Type qp_type = _e_tzsh_qp_type_get(tzsh_client);
+   EINA_SAFETY_ON_TRUE_RETURN(qp_type == E_QUICKPANEL_TYPE_UNKNOWN);
 
    ec = tzsh_client->ec;
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
    if (state == TWS_QUICKPANEL_STATE_VALUE_SCROLLABLE_UNSET)
-     e_qp_client_scrollable_state_set(ec, tzsh_client->qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_UNSET);
+     e_qp_client_scrollable_state_set(ec, qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_UNSET);
    else if (state == TWS_QUICKPANEL_STATE_VALUE_SCROLLABLE_SET)
-     e_qp_client_scrollable_state_set(ec, tzsh_client->qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_SET);
+     e_qp_client_scrollable_state_set(ec, qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_SET);
    else if (state == TWS_QUICKPANEL_STATE_VALUE_SCROLLABLE_RETAIN)
-     e_qp_client_scrollable_state_set(ec, tzsh_client->qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_RETAIN);
-
+     e_qp_client_scrollable_state_set(ec, qp_type, E_QUICKPANEL_CLIENT_SCROLL_STATE_RETAIN);
 }
 
 static const struct tws_quickpanel_interface _tzsh_qp_iface =
@@ -5017,11 +5082,28 @@ _tzsh_cb_qp_destroy(struct wl_resource *res_tzsh_qp)
    tzsh_client = wl_resource_get_user_data(res_tzsh_qp);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
-   tzsh_client->res_tzsh_client = NULL;
+   E_Quickpanel_Type qp_type =
+     _tzsh_client_data_quickpanel_type_get((E_Policy_Wl_Tzsh_Client_Data_Quickpanel*)tzsh_client->client_data);
+   e_qp_client_del(tzsh_client->ec, qp_type);
 
+   E_FREE(tzsh_client->client_data);
+
+   tzsh_client->res_tzsh_client = NULL;
    _e_policy_wl_tzsh_client_del(tzsh_client);
 }
 
+static E_Policy_Wl_Tzsh_Client_Data_Quickpanel *
+_tzsh_client_data_quickpanel_new(void)
+{
+   E_Policy_Wl_Tzsh_Client_Data_Quickpanel *tzsh_client_quickpanel;
+
+   tzsh_client_quickpanel = E_NEW(E_Policy_Wl_Tzsh_Client_Data_Quickpanel, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tzsh_client_quickpanel, NULL);
+
+   tzsh_client_quickpanel->type = E_QUICKPANEL_TYPE_UNKNOWN;
+   return tzsh_client_quickpanel;
+}
+
 static void
 _tzsh_iface_cb_qp_get(struct wl_client *client, struct wl_resource *res_tzsh, uint32_t id, uint32_t surf_id)
 {
@@ -5083,8 +5165,14 @@ _tzsh_iface_cb_qp_get(struct wl_client *client, struct wl_resource *res_tzsh, ui
         return;
      }
 
-   tzsh_client->qp_client = EINA_TRUE;
-   tzsh_client->qp_type = E_QUICKPANEL_TYPE_UNKNOWN;
+   tzsh_client->handle_type = TZSH_CLIENT_HANDLE_TYPE_QUICKPANEL;
+   tzsh_client->client_data = _tzsh_client_data_quickpanel_new();
+   if (!tzsh_client->client_data)
+     {
+        ERR("Could not create tzsh_client");
+        wl_client_post_no_memory(client);
+        return;
+     }
 
    /* Since various types of qp are supported, one ec can be used for handler for
     * two or more qp types. So e_qp_client_add function is called at the callback
@@ -5650,6 +5738,8 @@ _tzsh_cb_swl_destroy(struct wl_resource *res_tzsh_swl)
    tzsh_client = wl_resource_get_user_data(res_tzsh_swl);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
+   e_service_launcher_release_shared_widget_launch(tzsh_client->ec);
+
    tzsh_client->res_tzsh_client = NULL;
    _e_policy_wl_tzsh_client_del(tzsh_client);
 }
@@ -5718,7 +5808,7 @@ _tzsh_iface_cb_shared_widget_launch_get(struct wl_client *client,
         return;
      }
 
-   tzsh_client->swl_client = EINA_TRUE;
+   tzsh_client->handle_type = TZSH_CLIENT_HANDLE_TYPE_SHARED_WIDGET_LAUNCH;
 
    wl_resource_set_implementation(res_tzsh_swl,
                                   &_tzsh_swl_iface,