Modified flushing memory logic
[platform/core/appfw/app-core.git] / src / multiwindow_base / appcore_multiwindow_base.c
index dd4fee0..e6eef8e 100644 (file)
 #include "appcore_multiwindow_base_private.h"
 
 appcore_multiwindow_base_context _appcore_mw_context;
+static guint __flush_timer = 0;
+
+static gboolean __flush_memory(gpointer data)
+{
+       _DBG("Flush memory");
+       if (_appcore_mw_context.ops.base.trim_memory)
+               _appcore_mw_context.ops.base.trim_memory(_appcore_mw_context.data);
+       __flush_timer = 0;
+       return G_SOURCE_REMOVE;
+}
+
+static void __add_flush_timer(void)
+{
+       if (__flush_timer)
+               return;
+
+       __flush_timer = g_timeout_add(5000, __flush_memory, NULL);
+}
+
+static void __remove_flush_timer(void)
+{
+       if (!__flush_timer)
+               return;
+
+       g_source_remove(__flush_timer);
+       __flush_timer = 0;
+}
 
 static Eina_Bool __stub_show_cb(void *data, int type, void *event)
 {
@@ -56,9 +83,18 @@ static Eina_Bool __stub_hide_cb(void *data, int type, void *event)
 
 static Eina_Bool __stub_visibility_cb(void *data, int type, void *event)
 {
+       Ecore_Wl2_Event_Window_Visibility_Change *ev = event;
+
        if (_appcore_mw_context.ops.window.visibility)
                _appcore_mw_context.ops.window.visibility(type, event, _appcore_mw_context.data);
 
+       if (ev && ev->fully_obscured) {
+               if (!appcore_multiwindow_base_window_is_resumed())
+                       __add_flush_timer();
+       } else {
+               __remove_flush_timer();
+       }
+
        return ECORE_CALLBACK_RENEW;
 }
 
@@ -72,9 +108,14 @@ static Eina_Bool __stub_lower_cb(void *data, int type, void *event)
 
 static Eina_Bool __stub_pre_visibility_cb(void *data, int type, void *event)
 {
+       Ecore_Wl2_Event_Window_Pre_Visibility_Change *ev = event;
+
        if (_appcore_mw_context.ops.window.pre_visibility)
                _appcore_mw_context.ops.window.pre_visibility(type, event, _appcore_mw_context.data);
 
+       if (ev->type == ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED)
+               __remove_flush_timer();
+
        return ECORE_CALLBACK_RENEW;
 }
 
@@ -166,6 +207,11 @@ static int __on_terminate(void *data)
        return appcore_multiwindow_base_on_terminate();
 }
 
+static void __on_trim_memory(void *data)
+{
+       appcore_multiwindow_base_on_trim_memory();
+}
+
 static void __window_on_show(int type, void *event, void *data)
 {
        appcore_multiwindow_base_window_on_show(type, event);
@@ -205,6 +251,7 @@ EXPORT_API appcore_multiwindow_base_ops appcore_multiwindow_base_get_default_ops
        ops.base.finish = NULL;
        ops.base.run = NULL;
        ops.base.exit = NULL;
+       ops.base.trim_memory = __on_trim_memory;
 
        ops.window.show = __window_on_show;
        ops.window.hide = __window_on_hide;
@@ -251,3 +298,7 @@ EXPORT_API int appcore_multiwindow_base_on_control(bundle *b)
        return 0;
 }
 
+EXPORT_API int appcore_multiwindow_base_on_trim_memory(void)
+{
+       return appcore_base_on_trim_memory();
+}