e_desk_area: delegate e_comp_object_lower 40/304740/1
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 18 Dec 2023 06:54:31 +0000 (15:54 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 23 Jan 2024 09:19:22 +0000 (18:19 +0900)
The e_desk_area implements the e_comp_object_lower function.

Change-Id: Ia7c48af5edb363210cae5e9e093490cfe752d5cc

src/bin/e_comp_object.c
src/bin/e_comp_object_intern.h
src/bin/e_desk_area.c
src/bin/e_focus_policy_history.c

index 51798e7..b6565d2 100644 (file)
@@ -1958,8 +1958,13 @@ _e_comp_object_raise(Evas_Object *obj)
      }
 }
 
+#ifdef REFACTOR_DESK_AREA
+EINTERN void
+_e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
+#else
 static void
 _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
+#endif
 {
    evas_object_lower(obj);
 
@@ -1969,7 +1974,11 @@ _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
         if (ec)
           {
              _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
+#ifdef REFACTOR_DESK_AREA
+             wl_signal_emit_mutable(&cw->events.lower_done, NULL);
+#else
              wl_signal_emit_mutable(&cw->events.lower, NULL);
+#endif
           }
      }
 }
@@ -2268,10 +2277,18 @@ static void
 _e_comp_intercept_lower(void *data, Evas_Object *obj)
 {
    E_Comp_Object *cw = data;
+
+#ifdef REFACTOR_DESK_AREA
+#else
    Evas_Object *o;
+#endif
 
    TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
 
+#ifdef REFACTOR_DESK_AREA
+   wl_signal_emit_mutable(&cw->events.lower, cw);
+   wl_signal_emit_mutable(&cw->events.lower_done, cw);
+#else
    if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
         if (cw->ec->layer_pending)
@@ -2343,6 +2360,7 @@ _e_comp_intercept_raise(void *data, Evas_Object *obj)
    _e_comp_object_transform_obj_stack_update(obj);
 
 end:
+#endif
    TRACE_DS_END();
 }
 
@@ -3142,6 +3160,7 @@ _e_comp_smart_add(Evas_Object *obj)
 
    wl_signal_init(&cw->events.lower);
 #ifdef REFACTOR_DESK_AREA
+   wl_signal_init(&cw->events.lower_done);
    wl_signal_init(&cw->events.raise);
 #endif
    wl_signal_init(&cw->events.show);
@@ -6617,6 +6636,13 @@ e_comp_object_lower_listener_add(Evas_Object *obj, struct wl_listener *listener)
 
 #ifdef REFACTOR_DESK_AREA
 EINTERN void
+e_comp_object_lower_done_listener_add(Evas_Object *obj, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&cw->events.lower_done, listener);
+}
+
+EINTERN void
 e_comp_object_raise_listener_add(Evas_Object *obj, struct wl_listener *listener)
 {
    API_ENTRY;
index eb5c3b8..d7e2563 100644 (file)
@@ -137,6 +137,7 @@ struct _E_Comp_Object
    struct
      {
         struct wl_signal lower;
+        struct wl_signal lower_done;
         struct wl_signal raise;
         struct wl_signal show;
         struct wl_signal hide;
@@ -170,6 +171,7 @@ typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
 
 EINTERN void _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend);
 EINTERN void _e_comp_object_layers_remove(E_Comp_Object *cw);
+EINTERN void _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj);
 EINTERN void e_comp_object_layer_set(Evas_Object *obj, short layer);
 EINTERN void _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target);
 EINTERN void _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target);
@@ -179,6 +181,7 @@ EINTERN void _e_comp_object_transform_obj_stack_update(Evas_Object *obj);
 
 EINTERN void e_comp_object_lower_listener_add(Evas_Object *obj, struct wl_listener *listener);
 //#ifdef REFACTOR_DESK_AREA
+EINTERN void e_comp_object_lower_done_listener_add(Evas_Object *obj, struct wl_listener *listener);
 EINTERN void e_comp_object_raise_listener_add(Evas_Object *obj, struct wl_listener *listener);
 //#endif
 EINTERN void e_comp_object_show_listener_add(Evas_Object *obj, struct wl_listener *listener);
index 3bd2533..7a48f05 100644 (file)
@@ -537,7 +537,40 @@ _desk_area_cb_client_subsurface_stack_update(struct wl_listener *listener, void
 static void
 _desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
 {
-   // TODO:
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
+   Evas_Object *obj, *o;
+   E_Comp_Object *cw;
+
+   eda_client = wl_container_of(listener, eda_client, comp_object_lower);
+   ec = eda_client->ec;
+   obj = ec->frame;
+   cw = (E_Comp_Object *)data;
+
+   if ((cw->ec->layer_block) || (cw->ec->layer_pending))
+     {
+        if (cw->ec->layer_pending)
+          e_comp_object_layer_update(obj, NULL, obj);
+
+        _e_comp_object_lower(cw, obj);
+        return;
+     }
+
+   if (!EINA_INLIST_GET(cw->ec)->prev) return; //already lowest on layer
+
+   o = evas_object_below_get(obj);
+   _e_comp_object_layers_remove(cw);
+   /* prepend to client list since this client should be the first item now */
+   _e_comp_object_layers_add(cw, NULL, NULL, 1);
+   if (evas_object_layer_get(o) != evas_object_layer_get(obj)) return; //already at bottom!
+
+   evas_object_data_set(obj, "client_restack", (void*)1);
+   _e_comp_object_lower(cw, obj);
+   evas_object_data_del(obj, "client_restack");
+
+   if (!cw->visible) return;
+   e_comp_render_queue();
+   _e_comp_object_transform_obj_stack_update(obj);
 }
 
 static void
index e976452..44f42c4 100644 (file)
@@ -39,7 +39,11 @@ struct _E_Focus_Policy_History_Client
    struct wl_listener client_eval_end;
    struct wl_listener stack_transient_for_done;
 
+#ifdef REFACTOR_DESK_AREA
+   struct wl_listener comp_object_lower_done;
+#else
    struct wl_listener comp_object_lower;
+#endif
    struct wl_listener comp_object_show;
    struct wl_listener comp_object_hide;
 };
@@ -391,7 +395,11 @@ _focus_policy_history_cb_client_destroy(struct wl_listener *listener, void *data
 
    wl_list_remove(&history_client->comp_object_hide.link);
    wl_list_remove(&history_client->comp_object_show.link);
+#ifdef REFACTOR_DESK_AREA
+   wl_list_remove(&history_client->comp_object_lower_done.link);
+#else
    wl_list_remove(&history_client->comp_object_lower.link);
+#endif
 
    wl_list_remove(&history_client->stack_transient_for_done.link);
    wl_list_remove(&history_client->client_eval_end.link);
@@ -890,14 +898,23 @@ _focus_policy_history_cb_stack_transient_for_done(struct wl_listener *listener,
    e_client_frame_focus_set(new_focus, EINA_TRUE);
 }
 
+#ifdef REFACTOR_DESK_AREA
+static void
+_focus_policy_history_cb_comp_object_lower_done(struct wl_listener *listener, void *data)
+#else
 static void
 _focus_policy_history_cb_comp_object_lower(struct wl_listener *listener, void *data)
+#endif
 {
    E_Focus_Policy_History_Client *history_client;
    E_Focus_Policy_History *history_policy;
    E_Client *ec;
 
+#ifdef REFACTOR_DESK_AREA
+   history_client = wl_container_of(listener, history_client, comp_object_lower_done);
+#else
    history_client = wl_container_of(listener, history_client, comp_object_lower);
+#endif
 
    history_policy = history_client->history_policy;
    EINA_SAFETY_ON_NULL_RETURN(history_policy);
@@ -1044,8 +1061,13 @@ _focus_policy_history_cb_zone_client_add(struct wl_listener *listener, void *dat
    e_client_stack_transient_for_done_listener_add(ec, &history_client->stack_transient_for_done);
 
    // e_comp_object listeners
+#ifdef REFACTOR_DESK_AREA
+   history_client->comp_object_lower_done.notify = _focus_policy_history_cb_comp_object_lower_done;
+   e_comp_object_lower_done_listener_add(obj, &history_client->comp_object_lower_done);
+#else
    history_client->comp_object_lower.notify = _focus_policy_history_cb_comp_object_lower;
    e_comp_object_lower_listener_add(obj, &history_client->comp_object_lower);
+#endif
    history_client->comp_object_show.notify = _focus_policy_history_cb_comp_object_show;
    e_comp_object_show_listener_add(obj, &history_client->comp_object_show);
    history_client->comp_object_hide.notify = _focus_policy_history_cb_comp_object_hide;