e_desk_area: move iconify/uniconify listener to desk_area 53/304753/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 21 Dec 2023 07:09:04 +0000 (16:09 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 23 Jan 2024 09:19:22 +0000 (18:19 +0900)
e_desk_area manages the iconify/uniconify state of e_client
instead of e_zone.

Change-Id: I056150606322262022204b600fe4b31eeb5e4b44

src/bin/e_desk_area.c
src/bin/e_zone.c

index 6ce0780..dff1b67 100644 (file)
@@ -63,6 +63,8 @@ struct _E_Desk_Area_Private_Client
    struct wl_listener client_fullscreen;
    struct wl_listener client_unfullscreen;
    struct wl_listener client_focus_set;
+   struct wl_listener client_iconify;
+   struct wl_listener client_uniconify;
 
    // comp_object listeners
    struct wl_listener comp_object_raise;
@@ -733,6 +735,8 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    wl_list_remove(&eda_client->comp_object_lower.link);
    wl_list_remove(&eda_client->comp_object_raise.link);
 
+   wl_list_remove(&eda_client->client_uniconify.link);
+   wl_list_remove(&eda_client->client_iconify.link);
    wl_list_remove(&eda_client->client_focus_set.link);
    wl_list_remove(&eda_client->client_unfullscreen.link);
    wl_list_remove(&eda_client->client_fullscreen.link);
@@ -1181,6 +1185,158 @@ _desk_area_cb_client_focus_set(struct wl_listener *listener, void *data)
 }
 
 static void
+_desk_area_cb_client_iconify(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Desk_Area *eda;
+   E_Client *ec;
+
+   eda_client = wl_container_of(listener, eda_client, client_iconify);
+   eda = eda_client->eda;
+   ec = eda_client->ec;
+
+   e_comp_wl_remote_surface_image_save(ec);
+
+   ec->iconic = 1;
+   ec->want_focus = ec->take_focus = 0;
+   ec->changes.visible = 0;
+   if (ec->fullscreen)
+     eda->fullscreen_clients = eina_list_remove(eda->fullscreen_clients, ec);
+   e_client_comp_hidden_set(ec, 1);
+   evas_object_hide(ec->frame);
+   e_client_urgent_set(ec, ec->icccm.urgent);
+
+   e_client_iconify_event_send(ec);
+
+   if (e_config->transient.iconify)
+     {
+        E_Client *child;
+        Eina_List *list = eina_list_clone(ec->transients);
+
+        EINA_LIST_FREE(list, child)
+          {
+             if ((child->exp_iconify.type != E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) &&
+                 (e_client_is_parent_iconify_by_client(child)))
+               {
+                  e_client_iconified_type_set(child, E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT);
+                  child->exp_iconify.by_client = 1;
+                  e_policy_client_iconic_state_change_send(child, 1);
+               }
+             e_client_iconify(child);
+          }
+     }
+}
+
+static void
+_desk_area_cb_client_uniconify(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Desk_Area *eda;
+   E_Client *ec;
+   Eina_Bool not_raise;
+
+   eda_client = wl_container_of(listener, eda_client, client_uniconify);
+   eda = eda_client->eda;
+   ec = eda_client->ec;
+
+   e_comp_wl_remote_surface_image_save_cancel(ec);
+
+   not_raise = ec->exp_iconify.not_raise;
+
+   ec->exp_iconify.by_client = 0;
+   e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE);
+
+   if (e_config->transient.iconify)
+     {
+        E_Client *child;
+        Eina_List *list = eina_list_clone(ec->transients);
+
+        EINA_LIST_FREE(list, child)
+          {
+             if (e_client_transient_policy_get(child) == E_TRANSIENT_BELOW)
+               {
+                  child->exp_iconify.not_raise = not_raise;
+                  e_client_uniconify(child);
+               }
+          }
+     }
+
+   if (!not_raise)
+     e_client_raise(ec);
+
+   if (ec->internal)
+     {
+        ELOGF("EDA", "UNICONIFY|internal object force show. eda:%p", ec, eda);
+        evas_object_show(ec->frame);
+     }
+
+   if (ec->pixmap)
+     {
+         E_Comp_Wl_Client_Data *cdata;
+
+         cdata = e_client_cdata_get(ec);
+
+        if (e_pixmap_usable_get(ec->pixmap))
+          {
+             if (cdata && cdata->mapped)
+               {
+                  ELOGF("EDA", "UNICONIFY|object show. eda:%p frame_visible:%d",
+                        ec, eda, evas_object_visible_get(ec->frame));
+                  evas_object_show(ec->frame);
+               }
+             else
+               {
+                  ELOGF("EDA", "UNICONIFY|object no show. currently unmapped. eda:%p",
+                        ec, eda);
+               }
+          }
+        else
+          {
+             if (!ec->exp_iconify.buffer_flush &&
+                 !ec->exp_iconify.deiconify_update)
+               {
+                  if (cdata && cdata->mapped)
+                    {
+                       ELOGF("EDA", "UNICONIFY|object show. no use buffer flush. eda:%p frame_visible:%d",
+                           ec, eda, evas_object_visible_get(ec->frame));
+                       evas_object_show(ec->frame);
+                    }
+               }
+          }
+     }
+
+   e_client_comp_hidden_set(ec, 0);
+   ec->deskshow = ec->iconic = 0;
+
+#if 0 // focus should be set to the top window not uniconify window
+   if (ec->pixmap && e_pixmap_usable_get(ec->pixmap))
+      e_client_frame_focus_set(ec, EINA_TRUE);
+#endif
+
+   // send the uniconify event of a client
+   e_client_uniconify_event_send(ec);
+
+   if (e_config->transient.iconify)
+     {
+        E_Client *child;
+        Eina_List *list = eina_list_clone(ec->transients);
+
+        EINA_LIST_FREE(list, child)
+          {
+             if (e_client_transient_policy_get(child) == E_TRANSIENT_ABOVE)
+               {
+                  if (child->exp_iconify.type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT)
+                    e_policy_client_iconic_state_change_send(child, 0);
+                  child->exp_iconify.not_raise = not_raise;
+                  e_client_uniconify(child);
+               }
+          }
+     }
+
+   ec->exp_iconify.not_raise = 0;
+}
+
+static void
 _desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Private_Client *eda_client;
@@ -1830,6 +1986,10 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_client_unfullscreen_listener_add(ec, &eda_client->client_unfullscreen);
    eda_client->client_focus_set.notify = _desk_area_cb_client_focus_set;
    e_client_focus_set_listener_add(ec, &eda_client->client_focus_set);
+   eda_client->client_iconify.notify = _desk_area_cb_client_iconify;
+   e_client_iconify_listener_add(ec, &eda_client->client_iconify);
+   eda_client->client_uniconify.notify = _desk_area_cb_client_uniconify;
+   e_client_uniconify_listener_add(ec, &eda_client->client_uniconify);
 
    // e_comp_object listeners
    eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;
index 47a101b..cbc2e28 100644 (file)
@@ -44,8 +44,11 @@ struct _E_Zone_Private_Client
    struct wl_listener client_destroy;
    struct wl_listener client_eval_post_new_client;
    struct wl_listener client_focus_set;
+#ifdef REFACTOR_DESK_AREA
+#else
    struct wl_listener client_iconify;
    struct wl_listener client_uniconify;
+#endif
    struct wl_listener client_stick;
    struct wl_listener client_unstick;
    struct wl_listener client_maximize;
@@ -432,8 +435,11 @@ _zone_cb_client_destroy(struct wl_listener *listener, void *data)
    wl_list_remove(&zone_client->client_maximize.link);
    wl_list_remove(&zone_client->client_unstick.link);
    wl_list_remove(&zone_client->client_stick.link);
+#ifdef REFACTOR_DESK_AREA
+#else
    wl_list_remove(&zone_client->client_uniconify.link);
    wl_list_remove(&zone_client->client_iconify.link);
+#endif
    wl_list_remove(&zone_client->client_focus_set.link);
    wl_list_remove(&zone_client->client_eval_post_new_client.link);
    wl_list_remove(&zone_client->client_destroy.link);
@@ -611,6 +617,8 @@ _zone_cb_client_focus_set(struct wl_listener *listener, void *data)
      e_desk_client_add(e_desk_current_get(zone), ec);
 }
 
+#ifdef REFACTOR_DESK_AREA
+#else
 static void
 _zone_cb_client_iconify(struct wl_listener *listener, void *data)
 {
@@ -768,6 +776,7 @@ _zone_cb_client_uniconify(struct wl_listener *listener, void *data)
 
    ec->exp_iconify.not_raise = 0;
 }
+#endif
 
 static void
 _zone_cb_client_stick(struct wl_listener *listener, void *data)
@@ -2258,11 +2267,14 @@ e_zone_client_add(E_Zone *zone, E_Client *ec)
    zone_client->client_focus_set.notify = _zone_cb_client_focus_set;
    e_client_focus_set_listener_add(ec, &zone_client->client_focus_set);
 
+#ifdef REFACTOR_DESK_AREA
+#else
    zone_client->client_iconify.notify = _zone_cb_client_iconify;
    e_client_iconify_listener_add(ec, &zone_client->client_iconify);
 
    zone_client->client_uniconify.notify = _zone_cb_client_uniconify;
    e_client_uniconify_listener_add(ec, &zone_client->client_uniconify);
+#endif
 
    zone_client->client_stick.notify = _zone_cb_client_stick;
    e_client_stick_listener_add(ec, &zone_client->client_stick);