derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=879f248f0845be0163dbee0807a4eb859cf12786

commit 879f248f0845be0163dbee0807a4eb859cf12786
Author: Derek Foreman <der...@osg.samsung.com>
Date:   Tue Jan 30 16:32:45 2018 -0600

    ecore_wl2_surface: Flush surfaces for offscreen windows
    
    When a surface leaves all outputs we can discard its buffers to save
    memory.
    
    Currently most compositors don't send leave events for iconify, so this
    pretty much just saves us a cursor buffer under weston for now, but in
    the future it could be used for freeing resources of offscreen (fully
    occluded or iconified) windows.
---
 src/lib/ecore_wl2/ecore_wl2_private.h |  3 ++-
 src/lib/ecore_wl2/ecore_wl2_surface.c | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h 
b/src/lib/ecore_wl2/ecore_wl2_private.h
index 107bc6360b..47590552b6 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -562,8 +562,9 @@ typedef struct _Ecore_Wl2_Surface
    Ecore_Wl2_Window *wl2_win;
 
    int w, h;
-   Eina_Bool alpha : 1;
    Ecore_Wl2_Surface_Interface *funcs;
+   Ecore_Event_Handler *offscreen_handler;
+   Eina_Bool alpha : 1;
 } Ecore_Wl2_Surface;
 
 Ecore_Wl2_Window *_ecore_wl2_display_window_surface_find(Ecore_Wl2_Display 
*display, struct wl_surface *wl_surface);
diff --git a/src/lib/ecore_wl2/ecore_wl2_surface.c 
b/src/lib/ecore_wl2/ecore_wl2_surface.c
index c3a791f7c8..1e101e8405 100644
--- a/src/lib/ecore_wl2/ecore_wl2_surface.c
+++ b/src/lib/ecore_wl2/ecore_wl2_surface.c
@@ -63,6 +63,18 @@ ecore_wl2_surface_flush(Ecore_Wl2_Surface *surface)
    surface->funcs->flush(surface, surface->private_data);
 }
 
+static Eina_Bool
+_ecore_wl2_surface_cb_offscreen(void *data, int type EINA_UNUSED, void *event)
+{
+   Ecore_Wl2_Event_Window_Offscreen *ev = event;
+   Ecore_Wl2_Surface *surf = data;
+
+   if (surf->wl2_win->id == (int)ev->win)
+      ecore_wl2_surface_flush(surf);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
 EAPI Ecore_Wl2_Surface *
 ecore_wl2_surface_create(Ecore_Wl2_Window *win, Eina_Bool alpha)
 {
@@ -90,6 +102,10 @@ ecore_wl2_surface_create(Ecore_Wl2_Window *win, Eina_Bool 
alpha)
           {
              out->funcs = intf;
              win->wl2_surface = out;
+             out->offscreen_handler =
+               ecore_event_handler_add(ECORE_WL2_EVENT_WINDOW_OFFSCREEN,
+                                       _ecore_wl2_surface_cb_offscreen,
+                                       out);
              return out;
           }
      }

-- 


Reply via email to