e_main: add hook for idle enter/exit of main loop 13/306813/2
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 27 Feb 2024 06:47:54 +0000 (15:47 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 28 Feb 2024 01:53:27 +0000 (01:53 +0000)
e_main provides two hooks below. each hooks let them
know when ecore_main_loop enters idle state and
exits idle state.
   E_MAIN_HOOK_LOOP_BEFORE_IDLE_ENTER
   E_MAIN_HOOK_LOOP_AFTER_IDLE_EXIT

Change-Id: I21d4c26fc4dc50edb48415b588efe326e562922e

src/bin/e_comp_wl.c
src/bin/e_main.c
src/include/e_comp_wl.h
src/include/e_main.h

index de2edc7..9173b66 100644 (file)
@@ -1,5 +1,6 @@
 
 #include "e_comp_wl_intern.h"
+#include "e_main_intern.h"
 #include "e_foreign_intern.h"
 #include "e_wtz_shell_intern.h"
 #include "e_client_intern.h"
@@ -283,17 +284,6 @@ _e_comp_wl_focus_check(void)
 }
 
 static Eina_Bool
-_e_comp_wl_cb_idle_exiter(void *data EINA_UNUSED)
-{
-   e_comp_wl->idle_exiter_timestamp = ecore_time_get() * 1000;
-
-   TRACE_DS_ASYNC_BEGIN((intptr_t)&e_comp_wl->idle_exiter_timestamp,
-                        IDLE_EXITER~CB_PREPARE);
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
 _e_comp_wl_cb_read(void *data EINA_UNUSED, Ecore_Fd_Handler *hdlr EINA_UNUSED)
 {
    /* dispatch pending wayland events */
@@ -387,6 +377,23 @@ _e_comp_wl_cb_prepare(void *data EINA_UNUSED, Ecore_Fd_Handler *hdlr EINA_UNUSED
 
    TRACE_DS_ASYNC_END((intptr_t)&e_comp_wl->idle_exiter_timestamp,
                       IDLE_EXITER~CB_PREPARE);
+
+   // _e_comp_wl_cb_prepare() function is called before idle state in ecore_main_loop.
+   // idle state means that epoll() or select() is called in ecore_main_loop.
+   e_main_hook_call(E_MAIN_HOOK_LOOP_BEFORE_IDLE_ENTER);
+}
+
+static void
+_e_comp_wl_cb_awake(void *data)
+{
+   e_comp_wl->idle_exiter_timestamp = ecore_time_get() * 1000;
+
+   TRACE_DS_ASYNC_BEGIN((intptr_t)&e_comp_wl->idle_exiter_timestamp,
+                        IDLE_EXITER~CB_PREPARE);
+
+   // _e_comp_wl_cb_awake() function is called after idle state in ecore_main_loop.
+   // ecore_main_loop awake due to returning from epoll() or select()
+   e_main_hook_call(E_MAIN_HOOK_LOOP_AFTER_IDLE_EXIT);
 }
 
 E_API enum wl_output_transform
@@ -3838,6 +3845,9 @@ _e_comp_wl_display_create(void)
    ecore_main_fd_handler_prepare_callback_set(wl_cdata->fd_hdlr,
                                               _e_comp_wl_cb_prepare, wl_cdata);
 
+   /* add awake handler */
+   ecore_main_awake_handler_add(_e_comp_wl_cb_awake, NULL);
+
    return EINA_TRUE;
 
 input_err:
@@ -3937,8 +3947,6 @@ e_comp_wl_init(void)
    E_LIST_HOOK_APPEND(hooks, E_CLIENT_HOOK_RESIZE_END,   _e_comp_wl_client_cb_resize_end,   NULL);
    E_LIST_HOOK_APPEND(hooks, E_CLIENT_HOOK_MOVE_END,     _e_comp_wl_client_cb_move_end,     NULL);
 
-   e_comp_wl->idle_exiter = ecore_idle_exiter_add(_e_comp_wl_cb_idle_exiter, NULL);
-
    TRACE_DS_END();
    return EINA_TRUE;
 }
@@ -3955,8 +3963,6 @@ e_comp_wl_shutdown(void)
 {
    E_Comp_Data *comp = (E_Comp_Data *)e_comp_wl;
 
-   ecore_idle_exiter_del(e_comp_wl->idle_exiter);
-
    e_comp_wl_subsurfaces_shutdown();
    /* free handlers */
    E_FREE_LIST(handlers, ecore_event_handler_del);
@@ -3980,6 +3986,9 @@ e_comp_wl_shutdown(void)
 
    wl_list_remove(&comp->client_created.link);
 
+   /* delete awake handler */
+   ecore_main_awake_handler_del(_e_comp_wl_cb_awake);
+
    e_comp_wl = NULL;
    e_comp->wl_comp_data = NULL;
    free(comp);
index c55f7dd..d1f346e 100644 (file)
@@ -161,7 +161,9 @@ static Eina_Inlist *_e_main_hooks[] =
 {
    [E_MAIN_HOOK_MODULE_LOAD_DONE] = NULL,
    [E_MAIN_HOOK_E_INFO_READY] = NULL,
-   [E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE] = NULL
+   [E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE] = NULL,
+   [E_MAIN_HOOK_LOOP_BEFORE_IDLE_ENTER] = NULL,
+   [E_MAIN_HOOK_LOOP_AFTER_IDLE_EXIT] = NULL
 };
 
 /* external variables */
index 226408a..e09f85c 100644 (file)
@@ -400,7 +400,7 @@ struct _E_Comp_Wl_Data
    E_Comp_Wl_Evas_Gl *evas_gl;
 
    double idle_exiter_timestamp;
-   Ecore_Idle_Exiter *idle_exiter;
+   EINA_DEPRECATED Ecore_Idle_Exiter *idle_exiter;
 };
 
 struct _E_Comp_Wl_Client_Data
index f5d77b4..b40978b 100644 (file)
@@ -10,6 +10,8 @@ typedef enum _E_Main_Hook_Point
    E_MAIN_HOOK_MODULE_LOAD_DONE,
    E_MAIN_HOOK_E_INFO_READY,
    E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE,
+   E_MAIN_HOOK_LOOP_BEFORE_IDLE_ENTER,
+   E_MAIN_HOOK_LOOP_AFTER_IDLE_EXIT,
    E_MAIN_HOOK_LAST
 } E_Main_Hook_Point;