derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=1bd41aa3b6d36744c3cd3dd41ed46f5b801a5888

commit 1bd41aa3b6d36744c3cd3dd41ed46f5b801a5888
Author: Derek Foreman <der...@osg.samsung.com>
Date:   Tue Jan 30 15:19:43 2018 -0600

    ecore_wl2: Add new event for windows not displayed on any output
    
    When a window leaves all outputs we can free its render buffers to save
    memory.  This new event is generated when a window leaves all outputs.
---
 src/lib/ecore_wl2/Ecore_Wl2.h        |  6 ++++++
 src/lib/ecore_wl2/ecore_wl2.c        |  5 ++++-
 src/lib/ecore_wl2/ecore_wl2_window.c | 10 ++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h
index 4207bf40cf..238aaef63b 100644
--- a/src/lib/ecore_wl2/Ecore_Wl2.h
+++ b/src/lib/ecore_wl2/Ecore_Wl2.h
@@ -362,6 +362,11 @@ typedef struct Ecore_Wl2_Event_Aux_Message
    Ecore_Wl2_Display *display;
 } Ecore_Wl2_Event_Aux_Message;
 
+typedef struct Ecore_Wl2_Event_Window_Offscreen
+{
+   unsigned int win;
+} Ecore_Wl2_Event_Window_Offscreen;
+
 typedef struct _Ecore_Wl2_Buffer Ecore_Wl2_Buffer;
 
 typedef enum _Ecore_Wl2_Buffer_Type Ecore_Wl2_Buffer_Type;
@@ -418,6 +423,7 @@ EAPI extern int ECORE_WL2_EVENT_WINDOW_HIDE; /** @since 
1.20 */
 EAPI extern int ECORE_WL2_EVENT_WINDOW_ACTIVATE; /** @since 1.20 */
 EAPI extern int ECORE_WL2_EVENT_WINDOW_DEACTIVATE; /** @since 1.20 */
 EAPI extern int ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE; /** @since 1.21 */
+EAPI extern int ECORE_WL2_EVENT_WINDOW_OFFSCREEN; /** @since 1.21 */
 
 typedef struct _Ecore_Wl2_Surface_Interface
 {
diff --git a/src/lib/ecore_wl2/ecore_wl2.c b/src/lib/ecore_wl2/ecore_wl2.c
index 479ee93ef0..78ac85b6ac 100644
--- a/src/lib/ecore_wl2/ecore_wl2.c
+++ b/src/lib/ecore_wl2/ecore_wl2.c
@@ -53,6 +53,7 @@ EAPI int ECORE_WL2_EVENT_WINDOW_HIDE = 0;
 EAPI int ECORE_WL2_EVENT_WINDOW_ACTIVATE = 0;
 EAPI int ECORE_WL2_EVENT_WINDOW_DEACTIVATE = 0;
 EAPI int ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE = 0;
+EAPI int ECORE_WL2_EVENT_WINDOW_OFFSCREEN = 0;
 
 EAPI int _ecore_wl2_event_window_www = -1;
 EAPI int _ecore_wl2_event_window_www_drag = -1;
@@ -173,6 +174,7 @@ ecore_wl2_init(void)
    ECORE_WL2_EVENT_WINDOW_ACTIVATE = ecore_event_type_new();
    ECORE_WL2_EVENT_WINDOW_DEACTIVATE = ecore_event_type_new();
    ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE = ecore_event_type_new();
+   ECORE_WL2_EVENT_WINDOW_OFFSCREEN = ecore_event_type_new();
 
    if (!no_session_recovery)
      no_session_recovery = !!getenv("EFL_NO_WAYLAND_SESSION_RECOVERY");
@@ -246,7 +248,8 @@ ecore_wl2_shutdown(void)
                           ECORE_WL2_EVENT_WINDOW_HIDE,
                           ECORE_WL2_EVENT_WINDOW_ACTIVATE,
                           ECORE_WL2_EVENT_WINDOW_DEACTIVATE,
-                          ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE);
+                          ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE,
+                          ECORE_WL2_EVENT_WINDOW_OFFSCREEN);
 
    /* shutdown Ecore_Event */
    ecore_event_shutdown();
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c 
b/src/lib/ecore_wl2/ecore_wl2_window.c
index 0e93170876..6d39250015 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -447,6 +447,16 @@ _surface_leave(void *data, struct wl_surface *surf 
EINA_UNUSED, struct wl_output
    EINA_SAFETY_ON_NULL_RETURN(output);
 
    win->outputs = eina_list_remove(win->outputs, output);
+   if (!win->outputs)
+     {
+        Ecore_Wl2_Event_Window_Offscreen *ev;
+        ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Offscreen));
+        if (ev)
+          {
+             ev->win = win->id;
+             ecore_event_add(ECORE_WL2_EVENT_WINDOW_OFFSCREEN, ev, NULL, NULL);
+          }
+     }
 }
 
 static const struct wl_surface_listener _surface_listener =

-- 


Reply via email to