summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2018-01-30 15:19:43 -0600
committerDerek Foreman <derekf@osg.samsung.com>2018-01-30 17:09:51 -0600
commit1bd41aa3b6d36744c3cd3dd41ed46f5b801a5888 (patch)
tree68003c7246e83fd6d4b0233364e4477f718c0839
parent8abac6da65a1bfd5883383bb72de1215ff555b8f (diff)
downloadefl-1bd41aa3b6d36744c3cd3dd41ed46f5b801a5888.tar.gz
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.
-rw-r--r--src/lib/ecore_wl2/Ecore_Wl2.h6
-rw-r--r--src/lib/ecore_wl2/ecore_wl2.c5
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_window.c10
3 files changed, 20 insertions, 1 deletions
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 =