e_policy_wl: refactoring for handling softkey client 53/263253/2
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 30 Aug 2021 07:48:59 +0000 (16:48 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 30 Aug 2021 07:58:13 +0000 (16:58 +0900)
- Add E_Policy_Wl_Tzsh_Client_Data_Softkey structure
- Show softkey service when the softkey client which requests to hide softkey service
  is destroyed

Change-Id: I0099ba5e87434bf6cb810b08625a6fe634efc983

src/bin/e_policy_wl.c

index 36d4b38..a66acb6 100644 (file)
@@ -42,6 +42,7 @@ 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_SOFTKEY = 3,
 } Tzsh_Client_Handle_Type;
 
 typedef enum _Tzsh_Type
@@ -103,6 +104,11 @@ 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_Client_Data_Softkey
+{
+   int show_state;
+} E_Policy_Wl_Tzsh_Client_Data_Softkey;
+
 typedef struct _E_Policy_Wl_Tzsh_Region
 {
    E_Policy_Wl_Tzsh        *tzsh;
@@ -5261,27 +5267,15 @@ _tzsh_softkey_iface_cb_support_check(struct wl_client *client EINA_UNUSED, struc
 }
 
 static void
-_tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
+_tzsh_softkey_show(E_Client *ec)
 {
-   E_Policy_Wl_Tzsh_Client *tzsh_client;
-
-   ELOGF("TZ_SOFTKEY", "Request to Show softkey", NULL);
-
-   if (!e_config->use_softkey && !e_config->use_softkey_service)
-     return;
-
-   tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
-   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
-
-   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
-     return;
+   if (!ec) return;
+   if (!ec->zone) return;
 
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
+        softkey = e_policy_softkey_get(ec->zone);
         if (softkey)
           {
              ELOGF("TZ_SOFTKEY", "SHOW softkey", NULL);
@@ -5292,7 +5286,7 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey_service)
      {
         E_Service_Softkey *softkey_service;
-        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
+        softkey_service = e_service_softkey_get(ec->zone);
         if (softkey_service)
           {
              ELOGF("TZ_SOFTKEY", "Request to SHOW softkey service. (service:%p)", NULL, softkey_service);
@@ -5300,18 +5294,18 @@ _tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_reso
           }
         else
           {
-             ELOGF("TZ_SOFTKEY", "There is no softkey service. store show request", tzsh_client->ec);
-             e_service_softkey_store_visible_request(tzsh_client->ec, 1);
+             ELOGF("TZ_SOFTKEY", "There is no softkey service. store show request", ec);
+             e_service_softkey_store_visible_request(ec, 1);
           }
      }
 }
 
 static void
-_tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
+_tzsh_softkey_iface_cb_show(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
 {
    E_Policy_Wl_Tzsh_Client *tzsh_client;
 
-   ELOGF("TZ_SOFTKEY", "Request to Hide softkey", NULL);
+   ELOGF("TZ_SOFTKEY", "Request to Show softkey", NULL);
 
    if (!e_config->use_softkey && !e_config->use_softkey_service)
      return;
@@ -5324,10 +5318,27 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
      return;
 
+   E_Policy_Wl_Tzsh_Client_Data_Softkey *tzsh_client_data_softkey;
+   tzsh_client_data_softkey = (E_Policy_Wl_Tzsh_Client_Data_Softkey*)tzsh_client->client_data;
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client_data_softkey);
+
+   if (tzsh_client_data_softkey->show_state == 1)
+     return;
+
+   tzsh_client_data_softkey->show_state = 1;
+   _tzsh_softkey_show(tzsh_client->ec);
+}
+
+static void
+_tzsh_softkey_hide(E_Client *ec)
+{
+   if (!ec) return;
+   if (!ec->zone) return;
+
    if (e_config->use_softkey)
      {
         E_Policy_Softkey *softkey;
-        softkey = e_policy_softkey_get(tzsh_client->ec->zone);
+        softkey = e_policy_softkey_get(ec->zone);
         if (softkey)
           {
              ELOGF("TZ_SOFTKEY", "HIDE softkey", NULL);
@@ -5338,7 +5349,7 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
    if (e_config->use_softkey_service)
      {
         E_Service_Softkey *softkey_service;
-        softkey_service = e_service_softkey_get(tzsh_client->ec->zone);
+        softkey_service = e_service_softkey_get(ec->zone);
         if (softkey_service)
           {
              ELOGF("TZ_SOFTKEY", "Request to HIDE softkey service. (service:%p)", NULL, softkey_service);
@@ -5346,13 +5357,42 @@ _tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_reso
           }
         else
           {
-             ELOGF("TZ_SOFTKEY", "There is no softkey service. store hide request", tzsh_client->ec);
-             e_service_softkey_store_visible_request(tzsh_client->ec, 0);
+             ELOGF("TZ_SOFTKEY", "There is no softkey service. store hide request", ec);
+             e_service_softkey_store_visible_request(ec, 0);
           }
      }
 }
 
 static void
+_tzsh_softkey_iface_cb_hide(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey)
+{
+   E_Policy_Wl_Tzsh_Client *tzsh_client;
+
+   ELOGF("TZ_SOFTKEY", "Request to Hide softkey", NULL);
+
+   if (!e_config->use_softkey && !e_config->use_softkey_service)
+     return;
+
+   tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->tzsh);
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client->ec);
+
+   if (!eina_list_data_find(polwl->tzsh_clients, tzsh_client))
+     return;
+
+   E_Policy_Wl_Tzsh_Client_Data_Softkey *tzsh_client_data_softkey;
+   tzsh_client_data_softkey = (E_Policy_Wl_Tzsh_Client_Data_Softkey*)tzsh_client->client_data;
+   EINA_SAFETY_ON_NULL_RETURN(tzsh_client_data_softkey);
+
+   if (tzsh_client_data_softkey->show_state == 0)
+     return;
+
+   tzsh_client_data_softkey->show_state = 0;
+   _tzsh_softkey_hide(tzsh_client->ec);
+}
+
+static void
 _tzsh_softkey_iface_cb_state_set(struct wl_client *client EINA_UNUSED, struct wl_resource *res_tzsh_softkey, int32_t type, int32_t val)
 {
    E_Policy_Wl_Tzsh_Client *tzsh_client;
@@ -5565,6 +5605,18 @@ static const struct tws_softkey_interface _tzsh_softkey_iface =
    _tzsh_softkey_iface_cb_state_get
 };
 
+static E_Policy_Wl_Tzsh_Client_Data_Softkey *
+_tzsh_client_data_softkey_new(void)
+{
+   E_Policy_Wl_Tzsh_Client_Data_Softkey *tzsh_client_data_softkey;
+
+   tzsh_client_data_softkey = E_NEW(E_Policy_Wl_Tzsh_Client_Data_Softkey, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tzsh_client_data_softkey, NULL);
+
+   tzsh_client_data_softkey->show_state = 1;
+   return tzsh_client_data_softkey;
+}
+
 static void
 _tzsh_cb_softkey_destroy(struct wl_resource *res_tzsh_softkey)
 {
@@ -5573,6 +5625,18 @@ _tzsh_cb_softkey_destroy(struct wl_resource *res_tzsh_softkey)
    tzsh_client = wl_resource_get_user_data(res_tzsh_softkey);
    EINA_SAFETY_ON_NULL_RETURN(tzsh_client);
 
+   E_Policy_Wl_Tzsh_Client_Data_Softkey *tzsh_client_data_softkey;
+   tzsh_client_data_softkey = (E_Policy_Wl_Tzsh_Client_Data_Softkey*)tzsh_client->client_data;
+   if (tzsh_client_data_softkey)
+     {
+        if (tzsh_client_data_softkey->show_state == 0)
+          {
+             ELOGF("TZ_SOFTKEY", "Request to Show softkey by destroying client", NULL);
+             _tzsh_softkey_show(tzsh_client->ec);
+          }
+     }
+   E_FREE(tzsh_client->client_data);
+
    tzsh_client->res_tzsh_client = NULL;
    _e_policy_wl_tzsh_client_del(tzsh_client);
 }
@@ -5651,6 +5715,17 @@ _tzsh_iface_cb_softkey_get(struct wl_client *client, struct wl_resource *res_tzs
         return;
      }
 
+   tzsh_client->handle_type = TZSH_CLIENT_HANDLE_TYPE_SOFTKEY;
+   tzsh_client->client_data = _tzsh_client_data_softkey_new();
+   if (!tzsh_client->client_data)
+     {
+        ERR("Could not create tzsh_client");
+        _e_policy_wl_tzsh_client_del(tzsh_client);
+        wl_resource_destroy(res_tzsh_softkey);
+        wl_client_post_no_memory(client);
+        return;
+     }
+
    wl_resource_set_implementation(res_tzsh_softkey,
                                   &_tzsh_softkey_iface,
                                   tzsh_client,