Release version 1.3.14
[platform/core/appfw/appcore-widget.git] / src / efl_base / widget_app.c
index 6197b31..174195f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <bundle.h>
 #include <aul.h>
+#include <aul_widget.h>
 #include <dlog.h>
 #include <Elementary.h>
 #include <widget_errno.h>
 #endif
 
 #define LOG_TAG "CAPI_WIDGET_APPLICATION"
+#define ICONIFY_TIMEOUT 500
 
 struct instance_data {
        Evas_Object *win;
+       guint iconify_timer;
+       bool is_iconified;
 };
 
 struct app_cb_info {
@@ -114,6 +118,8 @@ static int __class_create(widget_base_instance_h instance_h, bundle *content,
                ret = callback_data->callback.create(
                                (widget_context_h)instance_h,
                                content, w, h, callback_data->user_data);
+               aul_widget_write_log(LOG_TAG, "[%s:%d]  ret : %d",
+                       __FUNCTION__, __LINE__, ret);
        }
        return ret;
 }
@@ -130,12 +136,16 @@ static int __class_destroy(widget_base_instance_h instance_h,
        if (callback_data && callback_data->callback.destroy) {
                ret = callback_data->callback.destroy(
                                (widget_context_h)instance_h,
-                               reason, content, callback_data->user_data);
+                               reason, content, callback_data->user_data);
+               aul_widget_write_log(LOG_TAG, "[%s:%d]  ret : %d",
+                       __FUNCTION__, __LINE__, ret);
        }
 
        data = (struct instance_data *)widget_base_context_get_user_data(instance_h);
        if (data != NULL) {
                widget_base_context_set_user_data(instance_h, NULL);
+               if (data->iconify_timer > 0)
+                       g_source_remove(data->iconify_timer);
                free(data);
        }
 
@@ -144,11 +154,36 @@ static int __class_destroy(widget_base_instance_h instance_h,
        return ret;
 }
 
+static gboolean __iconify_timeout_cb(gpointer user_data)
+{
+       struct instance_data *data = user_data;
+       Ecore_Wl2_Window *win = ecore_evas_wayland2_window_get(
+                       ecore_evas_ecore_evas_get(evas_object_evas_get(data->win)));
+
+       if (win) {
+               ecore_wl2_window_iconified_set(win, EINA_TRUE);
+               data->is_iconified = true;
+               _D("set iconify true");
+       }
+
+       data->iconify_timer = 0;
+
+       return G_SOURCE_REMOVE;
+}
+
 static int __class_pause(widget_base_instance_h instance_h, void *class_data)
 {
        int ret = 0;
        struct app_class_cb_info *callback_data =
                        (struct app_class_cb_info *)class_data;
+       struct instance_data *data = (struct instance_data *)
+                       widget_base_context_get_user_data(instance_h);
+
+       if (data->iconify_timer > 0)
+               g_source_remove(data->iconify_timer);
+
+       data->iconify_timer = g_timeout_add(ICONIFY_TIMEOUT,
+                       __iconify_timeout_cb, data);
 
        widget_base_class_on_pause(instance_h);
        if (callback_data && callback_data->callback.pause) {
@@ -165,6 +200,24 @@ static int __class_resume(widget_base_instance_h instance_h, void *class_data)
        int ret = 0;
        struct app_class_cb_info *callback_data =
                        (struct app_class_cb_info *)class_data;
+       Ecore_Wl2_Window *win;
+       struct instance_data *data = (struct instance_data *)
+                       widget_base_context_get_user_data(instance_h);
+
+       if (data->iconify_timer > 0) {
+               g_source_remove(data->iconify_timer);
+               data->iconify_timer = 0;
+       }
+
+       if (data->is_iconified) {
+               win = ecore_evas_wayland2_window_get(
+                       ecore_evas_ecore_evas_get(evas_object_evas_get(data->win)));
+               if (win) {
+                       ecore_wl2_window_iconified_set(win, EINA_FALSE);
+                       data->is_iconified = false;
+                       _D("set iconify false");
+               }
+       }
 
        widget_base_class_on_resume(instance_h);
        if (callback_data && callback_data->callback.resume) {
@@ -189,6 +242,7 @@ static int __widget_app_create(void *data)
                        return -1;
                }
                _D("widget app is created");
+               aul_widget_write_log(LOG_TAG, "[%s:%d]", __FUNCTION__, __LINE__);
                return 0;
        }
 
@@ -205,7 +259,7 @@ static int __widget_app_terminate(void *data)
                callback->terminate(cb_info->user_data);
                widget_base_on_terminate();
                _D("widget app is terminated");
-
+               aul_widget_write_log(LOG_TAG, "[%s:%d]", __FUNCTION__, __LINE__);
                return 0;
        }
 
@@ -234,6 +288,13 @@ static void __widget_app_exit(void *data)
        elm_exit();
 }
 
+static void __widget_app_trim_memory(void *data)
+{
+       _D("Trim memory");
+       elm_cache_all_flush();
+       widget_base_on_trim_memory();
+}
+
 EXPORT_API int widget_app_main(int argc, char **argv,
                widget_app_lifecycle_callback_s *callback, void *user_data)
 {
@@ -257,18 +318,19 @@ EXPORT_API int widget_app_main(int argc, char **argv,
        ops.finish = __widget_app_finish;
        ops.run = __widget_app_run;
        ops.exit = __widget_app_exit;
+       ops.trim_memory = __widget_app_trim_memory;
 
        cb_info.callback = callback;
        cb_info.user_data = user_data;
 
        r = widget_base_init(ops, argc, argv, &cb_info);
+       widget_base_fini();
+
        if (__class_data_list) {
                g_list_free_full(__class_data_list, free);
                __class_data_list = NULL;
        }
 
-       widget_base_fini();
-
        return r;
 }
 
@@ -334,7 +396,7 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context,
                                        Evas_Object **win)
 {
        Evas_Object *ret_win = NULL;
-       Ecore_Wl_Window *wl_win;
+       Ecore_Wl2_Window *wl_win;
        struct instance_data *data;
        char buffer[256];
        int rots[3] = {0};
@@ -361,13 +423,13 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context,
        elm_win_wm_rotation_preferred_rotation_set(ret_win, -1);
        elm_win_wm_rotation_available_rotations_set(ret_win, rots, 1);
 
-       wl_win = elm_win_wl_window_get(ret_win);
+       wl_win = ecore_evas_wayland2_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(ret_win)));
        if (wl_win == NULL) {
                _E("failed to get wayland window"); /* LCOV_EXCL_LINE */
                goto fault;
        }
 
-       ecore_wl_window_class_name_set(wl_win, id);
+       ecore_wl2_window_class_set(wl_win, id);
        elm_win_aux_hint_add(ret_win, "wm.policy.win.user.geometry", "1");
        widget_base_context_window_bind((widget_base_instance_h)context,        id, wl_win);
 
@@ -376,7 +438,7 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context,
        evas_object_data_set(ret_win, "___PLUGID", strdup(buffer));
        evas_object_event_callback_add(ret_win, EVAS_CALLBACK_DEL, __win_del_cb, NULL);
 
-       win_id = ecore_wl_window_id_get(wl_win);
+       win_id = ecore_wl2_window_id_get(wl_win);
        _D("window created: %d", win_id);
 
        data = (struct instance_data *)widget_base_context_get_user_data(