Support Seamless Effect
[platform/core/appfw/app-core.git] / src / ui_base / appcore_ui_base.c
index 8b83a1a..eeac2b3 100644 (file)
@@ -39,6 +39,7 @@
 #include <stdbool.h>
 #include <aul.h>
 #include <aul_svc.h>
+#include <aul_rpc_port.h>
 #include <bundle_internal.h>
 #include <ttrace.h>
 
@@ -61,6 +62,12 @@ enum win_status {
        WS_RESUME,
 };
 
+enum visibility_type {
+       VT_NONE,
+       VT_UNOBSCURED,
+       VT_FULLY_OBSCURED,
+};
+
 typedef struct _appcore_ui_base_context {
        appcore_ui_base_ops ops;
        void *data;
@@ -78,6 +85,7 @@ typedef struct _appcore_ui_base_context {
        Ecore_Event_Handler *hvchange;
        Ecore_Event_Handler *hlower;
        Ecore_Event_Handler *hpvchange;
+       Ecore_Event_Handler *hauxmsg;
 } appcore_ui_base_context;
 
 
@@ -87,7 +95,7 @@ static bool first_launch = true;
 struct win_node {
        unsigned int win;
        unsigned int surf;
-       bool bfobscured;
+       int vis;
 };
 
 static GSList *g_winnode_list;
@@ -263,6 +271,14 @@ static Eina_Bool __stub_pre_visibility_cb(void *data, int type, void *event)
        return ECORE_CALLBACK_RENEW;
 }
 
+static Eina_Bool __stub_aux_message_cb(void *data, int type, void *event)
+{
+       if (__context.ops.window.aux_message)
+               __context.ops.window.aux_message(type, event, __context.data);
+
+       return ECORE_CALLBACK_RENEW;
+}
+
 static void __prepare_to_suspend(void)
 {
        int suspend = APPCORE_BASE_SUSPENDED_STATE_WILL_ENTER_SUSPEND;
@@ -380,7 +396,7 @@ static bool __add_win(unsigned int win, unsigned int surf)
 
        t->win = win;
        t->surf = surf;
-       t->bfobscured = FALSE;
+       t->vis = VT_NONE;
 
        g_winnode_list = g_slist_append(g_winnode_list, t);
 
@@ -405,13 +421,13 @@ static bool __delete_win(unsigned int win)
        return TRUE;
 }
 
-static bool __update_win(unsigned int win, unsigned int surf, bool bfobscured)
+static bool __update_win(unsigned int win, unsigned int surf, int vis)
 {
        GSList *f;
        struct win_node *t;
 
-       _DBG("[EVENT_TEST][EVENT] __update_win WIN:%x fully_obscured %d\n", win,
-            bfobscured);
+       _DBG("[EVENT_TEST][EVENT] __update_win WIN:%x visibility %d\n",
+                       win, vis);
 
        f = __find_win(win);
        if (!f) {
@@ -424,7 +440,8 @@ static bool __update_win(unsigned int win, unsigned int surf, bool bfobscured)
        t->win = win;
        if (surf != 0)
                t->surf = surf;
-       t->bfobscured = bfobscured;
+       if (vis != VT_NONE)
+               t->vis = vis;
 
        return TRUE;
 }
@@ -535,10 +552,21 @@ static void __unset_bg_state(void)
        _DBG("bg state: %d", __context.bg_state);
 }
 
+static void __set_app_id(void)
+{
+       if (!tz_policy && __init_wl() < 0)
+               return;
+
+       tizen_policy_set_appid(tz_policy, getpid(), __context.appid);
+       wl_display_roundtrip(dsp);
+       _DBG("set appid: %s", __context.appid);
+}
+
 static void __do_start(bundle *b)
 {
        const char *bg_launch;
        const char *below_app;
+       const char *rpc_port;
 
        if (__context.hint & APPCORE_UI_BASE_HINT_WINDOW_STACK_CONTROL) {
                if (__context.below_app) {
@@ -569,8 +597,11 @@ static void __do_start(bundle *b)
        }
 
        if (__context.hint & APPCORE_UI_BASE_HINT_WINDOW_AUTO_CONTROL) {
-               if (!__context.bg_state)
-                       __raise_win();
+               if (!__context.bg_state) {
+                       rpc_port = bundle_get_val(b, AUL_K_RPC_PORT);
+                       if (!rpc_port)
+                               __raise_win();
+               }
        }
 }
 
@@ -603,7 +634,8 @@ EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b)
                return 0;
        }
 
-       if (type == AUL_TERMINATE_BGAPP && __context.state != AS_PAUSED)
+       if ((type == AUL_TERMINATE_BGAPP || type == AUL_TERMINATE_BG_INST) &&
+                       __context.state != AS_PAUSED)
                return 0;
 
        if (type == AUL_START)
@@ -628,8 +660,10 @@ EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b)
                break;
        case AUL_TERMINATE:
                break;
+       case AUL_TERMINATE_BG_INST:
+       case AUL_TERMINATE_INST:
        case AUL_TERMINATE_BGAPP:
-               _DBG("[APP %d] is paused. TERMINATE", getpid());
+               _DBG("[APP %d] TERMINATE", getpid());
                __context.state = AS_DYING;
                aul_status_update(STATUS_DYING);
                if (__context.ops.base.exit)
@@ -671,6 +705,11 @@ static void __add_ecore_events(void)
                        __stub_pre_visibility_cb, NULL);
        if (!__context.hpvchange)
                _ERR("Failed to add ECORE_WL_EVENT_WINDOW_PRE_VISIBILITY_CHANGE event");
+
+       __context.hauxmsg = ecore_event_handler_add(ECORE_WL2_EVENT_AUX_MESSAGE,
+                       __stub_aux_message_cb, NULL);
+       if (!__context.hauxmsg)
+               _ERR("Failed to add ECORE_WL2_EVENT_AUX_MESSAGE event");
 }
 
 static void __del_ecore_events(void)
@@ -699,6 +738,11 @@ static void __del_ecore_events(void)
                ecore_event_handler_del(__context.hpvchange);
                __context.hpvchange = NULL;
        }
+
+       if (__context.hauxmsg) {
+               ecore_event_handler_del(__context.hauxmsg);
+               __context.hauxmsg = NULL;
+       }
 }
 
 EXPORT_API int appcore_ui_base_on_create(void)
@@ -766,22 +810,29 @@ static void __group_lower()
        appcore_ui_base_group_remove();
 }
 
-EXPORT_API void appcore_ui_base_group_add()
+EXPORT_API int appcore_ui_base_group_add()
 {
        static bool attached = false;
+       int ret;
 
        _DBG("__group_attach");
        if (attached)
-               return;
+               return 0;
 
        int wid = __get_main_surface();
        if (wid == 0) {
                _ERR("window wasn't ready");
-               return;
+               return -1;
+       }
+
+       ret = aul_app_group_set_window(wid);
+       if (ret < 0) {
+               _ERR("Failed to set app group window. error(%d)", ret);
+               return ret;
        }
 
-       aul_app_group_set_window(wid);
        attached = true;
+       return 0;
 }
 
 EXPORT_API void appcore_ui_base_group_remove()
@@ -807,12 +858,15 @@ EXPORT_API void appcore_ui_base_window_on_show(int type, void *event)
                return;
        }
 
-       _DBG("[EVENT_TEST][EVENT] GET SHOW EVENT!!!. WIN:%x, %d\n", ev->win, ev->data[0]);
+       _DBG("[EVENT_TEST][EVENT] GET SHOW EVENT!!!. WIN:%x, %d\n",
+                       ev->win, ev->data[0]);
 
-       if (!__find_win((unsigned int)ev->win))
+       if (!__find_win((unsigned int)ev->win)) {
                __add_win((unsigned int)ev->win, (unsigned int)ev->data[0]);
-       else
-               __update_win((unsigned int)ev->win, (unsigned int)ev->data[0], FALSE);
+       } else {
+               __update_win((unsigned int)ev->win, (unsigned int)ev->data[0],
+                               VT_NONE);
+       }
 
        if (ev->data[0] != 0)
                __group_attach();
@@ -827,8 +881,8 @@ static bool __check_visible(void)
 
        for (iter = g_winnode_list; iter != NULL; iter = g_slist_next(iter)) {
                entry = iter->data;
-               _DBG("win : %x obscured : %d\n", entry->win, entry->bfobscured);
-               if (entry->bfobscured == FALSE)
+               _DBG("win : %x visibility : %d\n", entry->win, entry->vis);
+               if (entry->vis == VT_UNOBSCURED)
                        return true;
        }
 
@@ -871,7 +925,8 @@ EXPORT_API void appcore_ui_base_window_on_visibility(int type, void *event)
        int bvisibility;
 
        ev = event;
-       __update_win((unsigned int)ev->win, 0, ev->fully_obscured);
+       __update_win((unsigned int)ev->win, 0,
+                       ev->fully_obscured ? VT_FULLY_OBSCURED : VT_UNOBSCURED);
        bvisibility = __check_visible();
 
        _DBG("bvisibility %d, w_status %d", bvisibility, w_status);
@@ -903,7 +958,7 @@ EXPORT_API void appcore_ui_base_window_on_pre_visibility(int type, void *event)
        bool bvisibility;
 
        if (ev && ev->type == ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED) {
-               __update_win((unsigned int)ev->win, 0, false);
+               __update_win((unsigned int)ev->win, 0, VT_UNOBSCURED);
                bvisibility = __check_visible();
 
                _DBG("bvisibility %d, w_status %d", bvisibility, w_status);
@@ -915,6 +970,25 @@ EXPORT_API void appcore_ui_base_window_on_pre_visibility(int type, void *event)
        }
 }
 
+EXPORT_API void appcore_ui_base_window_on_aux_message(int type, void *event)
+{
+       Ecore_Wl2_Event_Aux_Message *ev = event;
+
+       if (ev->key && !strcmp(ev->key, "dpms_wm")) {
+               if (ev->val && !strcmp(ev->val, "on")) {
+                       _DBG("Display state: on");
+                       appcore_base_set_display_state(
+                                       APPCORE_BASE_DISPLAY_STATE_ON);
+               } else if (ev->val && !strcmp(ev->val, "off")) {
+                       _DBG("Display state: off");
+                       appcore_base_set_display_state(
+                                       APPCORE_BASE_DISPLAY_STATE_OFF);
+               } else {
+                       _ERR("Unknown state: %s", ev->val);
+               }
+       }
+}
+
 EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **argv,
                void *data, unsigned int hint)
 {
@@ -955,6 +1029,8 @@ EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **ar
                }
        }
 
+       __set_app_id();
+
        return appcore_base_init(ops.base, argc, argv, data);
 }
 
@@ -1074,6 +1150,11 @@ static void __window_on_pre_visibility(int type, void *event, void *data)
        appcore_ui_base_window_on_pre_visibility(type, event);
 }
 
+static void __window_on_aux_message(int type, void *event, void *data)
+{
+       appcore_ui_base_window_on_aux_message(type, event);
+}
+
 EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void)
 {
        appcore_ui_base_ops ops;
@@ -1096,6 +1177,7 @@ EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void)
        ops.window.lower = __window_on_lower;
        ops.window.visibility = __window_on_visibility;
        ops.window.pre_visibility = __window_on_pre_visibility;
+       ops.window.aux_message = __window_on_aux_message;
 
        return ops;
 }