ecore_wl2_window: add visibility callback set 16/276616/2
authorHosang Kim <hosang12.kim@samsung.com>
Wed, 22 Jun 2022 02:43:27 +0000 (11:43 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Wed, 22 Jun 2022 04:19:18 +0000 (13:19 +0900)
When the main thread is busy, WINDOW_VISIBILITY_CHANGE event is not
delivered on time. So add bypass callback for enhancing perpomance

Change-Id: I1ce27edf73f8753e8715e3e699ddf5f9b5f5cd07

src/lib/ecore_wl2/Ecore_Wl2.h
src/lib/ecore_wl2/ecore_wl2_private.h
src/lib/ecore_wl2/ecore_wl2_window.c

index f6012aa..7158700 100644 (file)
@@ -1053,6 +1053,20 @@ EAPI void ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*c
 /**
  * @internal
  *
+ * Set a callback to be called after the window's visibility is changed
+ *
+ * @param window The window to listen to for a tizen visibility cb notify callback
+ * @param cb The callback function to call being passed data, window and visibility
+ * @param data The Data pointer to pass as data to the callback
+ *
+ * @ingroup Ecore_Wl2_Window_Group
+ * @since_tizen 7.0
+ */
+EAPI void ecore_wl2_window_visibility_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win, Eina_Bool visibility), void *data);
+
+/**
+ * @internal
+ *
  * Get the wl_surface which belongs to this window
  *
  * @param window The Ecore_Wl2_Window to get the surface of
index fc16d42..e319591 100644 (file)
@@ -406,6 +406,9 @@ struct _Ecore_Wl2_Window
    void *cb_rot_changed_data;
    //
 
+   void (*cb_visibility) (void *data, Ecore_Wl2_Window *win, Eina_Bool visibility);
+   void *cb_visibility_data;
+
    // TIZEN_ONLY(20171207): add functions to set client's custom cursors
    struct
      {
index d5e932e..024b95b 100644 (file)
@@ -570,7 +570,8 @@ _tizen_visibility_cb_notify(void *data, struct tizen_visibility *tizen_visibilit
    else
      ev->fully_obscured = 0;
 
-   ecore_event_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, ev, NULL, NULL);
+   if (win->cb_visibility) win->cb_visibility(win->cb_visibility_data, win, !ev->fully_obscured);
+   else ecore_event_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, ev, NULL, NULL);
 }
 
 static void
@@ -1239,6 +1240,14 @@ ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *
    window->cb_close_data = data;
 }
 
+EAPI void
+ecore_wl2_window_visibility_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win, Eina_Bool visibility), void *data)
+{
+   EINA_SAFETY_ON_NULL_RETURN(window);
+   window->cb_visibility = cb;
+   window->cb_visibility_data = data;
+}
+
 EAPI struct wl_surface *
 ecore_wl2_window_surface_get(Ecore_Wl2_Window *window)
 {