X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fui_base%2Fappcore_ui_base.c;h=90d85a067d60ff5bfbd69404ec5af6d024b71bf3;hb=28cd6363e8e8243caefa1d6357999fd7676b4aca;hp=07b847a3f81f09ad17c11a2efd87de65a8ab50dc;hpb=9965fbe196607b8442ce686b1eec50292e61a84a;p=platform%2Fcore%2Fappfw%2Fapp-core.git diff --git a/src/ui_base/appcore_ui_base.c b/src/ui_base/appcore_ui_base.c index 07b847a..90d85a0 100644 --- a/src/ui_base/appcore_ui_base.c +++ b/src/ui_base/appcore_ui_base.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#define _GNU_SOURCE #include #include #include @@ -31,9 +32,6 @@ #include #include -#include -#include -#include #include #include #include @@ -47,6 +45,7 @@ #include "appcore_base.h" #include "appcore_ui_base.h" #include "appcore_ui_base_private.h" +#include "appcore_ui_plugin.h" enum app_state { AS_NONE, @@ -64,12 +63,14 @@ typedef struct _appcore_ui_base_context { unsigned int hint; char *below_app; char *appid; + bool bg_state; int state; Ecore_Event_Handler *hshow; Ecore_Event_Handler *hhide; Ecore_Event_Handler *hvchange; Ecore_Event_Handler *hlower; + Ecore_Event_Handler *hpvchange; } appcore_ui_base_context; @@ -87,7 +88,109 @@ static appcore_ui_base_context __context; static struct wl_display *dsp; static struct wl_registry *reg; static struct tizen_policy *tz_policy; -static bool bg_state = false; + +static void _wl_cb_conformant(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + uint32_t is_conformant) +{ + ; // nothing to do. +} + +static void _wl_cb_conformant_area(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + uint32_t conformant_part, + uint32_t state, + int32_t x, int32_t y, int32_t w, int32_t h) +{ + ; // nothing to do. +} + +static void _wl_cb_notification_done(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface, + int32_t level, + uint32_t state) +{ + ; // nothing to do. +} + +static void _wl_cb_transient_for_done(void *data, + struct tizen_policy *tizen_policy, + uint32_t child_id) +{ + ; // nothing to do. +} + +static void _wl_cb_scr_mode_done(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface, + uint32_t mode, + uint32_t state) +{ + ; // nothing to do. +} + +static void _wl_cb_iconify_state_changed(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + uint32_t iconified, + uint32_t force) +{ + ; // nothing to do. +} + +static void _wl_cb_supported_aux_hints(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + struct wl_array *hints, + uint32_t num_hints) +{ + ; // nothing to do. +} + +static void _wl_cb_allowed_aux_hint(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + int id) +{ + ; // nothing to do. +} + +static void _wl_cb_aux_message(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface_resource, + const char *key, + const char *val, + struct wl_array *options) +{ + ; // nothing to do. +} + +static void _wl_cb_conformant_region(void *data, + struct tizen_policy *tizen_policy, + struct wl_surface *surface, + uint32_t conformant_part, + uint32_t state, + int32_t x, int32_t y, int32_t w, int32_t h, + uint32_t serial) +{ + ; // nothing to do. +} + +static const struct tizen_policy_listener _tizen_policy_listener = { + _wl_cb_conformant, + _wl_cb_conformant_area, + _wl_cb_notification_done, + _wl_cb_transient_for_done, + _wl_cb_scr_mode_done, + _wl_cb_iconify_state_changed, + _wl_cb_supported_aux_hints, + _wl_cb_allowed_aux_hint, + _wl_cb_aux_message, + _wl_cb_conformant_region, +}; static void __wl_listener_cb(void *data, struct wl_registry *reg, uint32_t id, const char *interface, uint32_t ver) @@ -95,7 +198,10 @@ static void __wl_listener_cb(void *data, struct wl_registry *reg, if (interface && !strcmp(interface, "tizen_policy")) { if (!tz_policy) tz_policy = wl_registry_bind(reg, id, - &tizen_policy_interface, 1); + &tizen_policy_interface, 7); + if (tz_policy) { + tizen_policy_add_listener(tz_policy, &_tizen_policy_listener, dsp); + } } } @@ -142,6 +248,14 @@ static Eina_Bool __stub_lower_cb(void *data, int type, void *event) return ECORE_CALLBACK_RENEW; } +static Eina_Bool __stub_pre_visibility_cb(void *data, int type, void *event) +{ + if (__context.ops.window.pre_visibility) + __context.ops.window.pre_visibility(type, event, __context.data); + + return ECORE_CALLBACK_RENEW; +} + static void __prepare_to_suspend(void) { int suspend = APPCORE_BASE_SUSPENDED_STATE_WILL_ENTER_SUSPEND; @@ -165,8 +279,11 @@ static void __exit_from_suspend(void) static void __do_pause(void) { if (__context.state == AS_RUNNING) { - if (__context.ops.pause) + if (__context.ops.pause) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:PAUSE"); __context.ops.pause(__context.data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } __context.state = AS_PAUSED; __prepare_to_suspend(); @@ -180,9 +297,10 @@ static void __do_resume(void) __exit_from_suspend(); if (__context.ops.resume) { LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:start]", __context.appid); + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:RESUME"); __context.ops.resume(__context.data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:done]", __context.appid); - LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:Launching:done]", __context.appid); } if ((__context.hint & APPCORE_UI_BASE_HINT_WINDOW_STACK_CONTROL) && __context.below_app) { @@ -389,13 +507,13 @@ static void __finish_wl(void) static void __set_bg_state(void) { - if (__init_wl() < 0) + if (!tz_policy && __init_wl() < 0) return; tizen_policy_set_background_state(tz_policy, getpid()); wl_display_roundtrip(dsp); - bg_state = true; - _DBG("bg state: %d", bg_state); + __context.bg_state = true; + _DBG("bg state: %d", __context.bg_state); } static void __unset_bg_state(void) @@ -405,9 +523,8 @@ static void __unset_bg_state(void) tizen_policy_unset_background_state(tz_policy, getpid()); wl_display_roundtrip(dsp); - bg_state = false; - _DBG("bg state: %d", bg_state); - __finish_wl(); + __context.bg_state = false; + _DBG("bg state: %d", __context.bg_state); } static void __do_start(bundle *b) @@ -431,14 +548,44 @@ static void __do_start(bundle *b) return; } - if ((__context.hint & APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL) && - bg_state) { + if (__context.hint & APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL) { bg_launch = bundle_get_val(b, AUL_SVC_K_BG_LAUNCH); - if (!bg_launch || strcmp(bg_launch, "enable")) - __unset_bg_state(); + if (bg_launch && strcmp(bg_launch, "enable") == 0) { + if (!__context.bg_state && + __context.state != AS_RUNNING) + __set_bg_state(); + } else { + if (__context.bg_state) + __unset_bg_state(); + } + } + + if (__context.hint & APPCORE_UI_BASE_HINT_WINDOW_AUTO_CONTROL) { + if (!__context.bg_state) + __raise_win(); + } +} + +static int __is_legacy_lifecycle(void) +{ + static int is_legacy = -1; + const char *api_version; + + if (is_legacy != -1) + return is_legacy; + + api_version = getenv("TIZEN_API_VERSION"); + if (api_version) { + if (strverscmp("2.4", api_version) > 0 && + strverscmp("2.2.1", api_version) < 0) + is_legacy = 1; + else + is_legacy = 0; + } else { + is_legacy = 0; } - __raise_win(); + return is_legacy; } EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b) @@ -459,8 +606,16 @@ EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b) switch (type) { case AUL_START: __do_start(b); + if (__context.hint & APPCORE_UI_BASE_HINT_LEGACY_CONTROL) { + if (!__context.bg_state && __is_legacy_lifecycle()) { + _DBG("Legacy lifecycle"); + __do_resume(); + } + } break; case AUL_RESUME: + if (__context.bg_state) + __unset_bg_state(); __raise_win(); break; case AUL_TERMINATE: @@ -482,15 +637,66 @@ EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b) return 0; } -EXPORT_API int appcore_ui_base_on_create(void) +static void __add_ecore_events(void) { - appcore_base_on_create(); + __context.hshow = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, + __stub_show_cb, NULL); + if (!__context.hshow) + _ERR("Failed to add ECORE_WL_EVENT_WINDOW_SHOW event"); + + __context.hhide = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, + __stub_hide_cb, NULL); + if (!__context.hhide) + _ERR("Failed to add ECORE_WL_EVENT_WINDOW_HIDE event"); - __context.hshow = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __stub_show_cb, NULL); - __context.hhide = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __stub_hide_cb, NULL); __context.hvchange = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, - __stub_visibility_cb, NULL); - __context.hlower = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __stub_lower_cb, NULL); + __stub_visibility_cb, NULL); + if (!__context.hvchange) + _ERR("Failed to add ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE event"); + + __context.hlower = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, + __stub_lower_cb, NULL); + if (!__context.hlower) + _ERR("Failed to add ECORE_WL_EVENT_WINDOW_LOWER event"); + + __context.hpvchange = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_PRE_VISIBILITY_CHANGE, + __stub_pre_visibility_cb, NULL); + if (!__context.hpvchange) + _ERR("Failed to add ECORE_WL_EVENT_WINDOW_PRE_VISIBILITY_CHANGE event"); +} + +static void __del_ecore_events(void) +{ + if (__context.hshow) { + ecore_event_handler_del(__context.hshow); + __context.hshow = NULL; + } + + if (__context.hhide) { + ecore_event_handler_del(__context.hhide); + __context.hhide = NULL; + } + + if (__context.hvchange) { + ecore_event_handler_del(__context.hvchange); + __context.hvchange = NULL; + } + + if (__context.hlower) { + ecore_event_handler_del(__context.hlower); + __context.hlower = NULL; + } + + if (__context.hpvchange) { + ecore_event_handler_del(__context.hpvchange); + __context.hpvchange = NULL; + } +} + +EXPORT_API int appcore_ui_base_on_create(void) +{ + __add_ecore_events(); + appcore_base_on_create(); __context.state = AS_CREATED; LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:create:done]", __context.appid); @@ -505,22 +711,6 @@ EXPORT_API int appcore_ui_base_on_terminate(void) } __context.state = AS_DYING; - if (__context.hshow) - ecore_event_handler_del(__context.hshow); - if (__context.hhide) - ecore_event_handler_del(__context.hhide); - if (__context.hvchange) - ecore_event_handler_del(__context.hvchange); - if (__context.hlower) - ecore_event_handler_del(__context.hlower); - - elm_shutdown(); - - /* Check loader case */ - if (getenv("AUL_LOADER_INIT")) { - unsetenv("AUL_LOADER_INIT"); - elm_shutdown(); - } appcore_base_on_terminate(); @@ -548,10 +738,22 @@ EXPORT_API int appcore_ui_base_on_control(bundle *b) static void __group_attach() { - static bool attached = false; + if (!(__context.hint & APPCORE_UI_BASE_HINT_WINDOW_GROUP_CONTROL)) + return; + + appcore_ui_base_group_add(); +} +static void __group_lower() +{ if (!(__context.hint & APPCORE_UI_BASE_HINT_WINDOW_GROUP_CONTROL)) return; + appcore_ui_base_group_remove(); +} + +EXPORT_API void appcore_ui_base_group_add() +{ + static bool attached = false; _DBG("__group_attach"); if (attached) @@ -567,13 +769,10 @@ static void __group_attach() attached = true; } -static void __group_lower() +EXPORT_API void appcore_ui_base_group_remove() { int exit = 0; - if (!(__context.hint & APPCORE_UI_BASE_HINT_WINDOW_GROUP_CONTROL)) - return; - _DBG("__group_lower"); aul_app_group_lower(&exit); if (exit) { @@ -676,14 +875,34 @@ EXPORT_API void appcore_ui_base_window_on_visibility(int type, void *event) } +EXPORT_API void appcore_ui_base_window_on_pre_visibility(int type, void *event) +{ + Ecore_Wl_Event_Window_Pre_Visibility_Change *ev = event; + bool bvisibility; + + if (ev && ev->type == ECORE_WL_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED) { + __update_win((unsigned int)ev->win, 0, false); + bvisibility = __check_visible(); + + _DBG("bvisibility %d, b_active %d", bvisibility, b_active); + if (bvisibility && b_active == FALSE) { + _DBG(" Go to Resume state\n"); + b_active = TRUE; + __do_resume(); + } + } +} + EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **argv, void *data, unsigned int hint) { - char *hwacc; const char *bg_launch; bundle *b; char appid[PATH_MAX] = {0, }; + ecore_wl_init(NULL); + + appcore_ui_plugin_init(&ops, argc, argv, &hint); aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)); __context.ops = ops; __context.data = data; @@ -694,24 +913,6 @@ EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **ar __context.appid = strdup(appid); LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:main:done]", appid); - elm_init(argc, argv); - - if (__context.hint & APPCORE_UI_BASE_HINT_HW_ACC_CONTROL) { - hwacc = getenv("HWACC"); - - if (hwacc == NULL) { - _DBG("elm_config_accel_preference_set is not called"); - } else if (strcmp(hwacc, "USE") == 0) { - elm_config_accel_preference_set("hw"); - _DBG("elm_config_accel_preference_set : hw"); - } else if (strcmp(hwacc, "NOT_USE") == 0) { - elm_config_accel_preference_set("none"); - _DBG("elm_config_accel_preference_set : none"); - } else { - _DBG("elm_config_accel_preference_set is not called"); - } - } - if (__context.hint & APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL) { b = bundle_import_from_argv(argc, argv); if (b) { @@ -728,9 +929,15 @@ EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **ar EXPORT_API void appcore_ui_base_fini(void) { - appcore_base_fini(); + __del_ecore_events(); + __finish_wl(); + free(__context.appid); __context.appid = NULL; + + appcore_base_fini(); + appcore_ui_plugin_fini(); + ecore_wl_shutdown(); } EXPORT_API void appcore_ui_base_pause(void) @@ -754,6 +961,31 @@ EXPORT_API void appcore_ui_base_exit(void) __context.ops.base.exit(__context.data); } +EXPORT_API unsigned int appcore_ui_base_get_main_window(void) +{ + return __get_main_window(); +} + +EXPORT_API unsigned int appcore_ui_base_get_main_surface(void) +{ + return __get_main_surface(); +} + +EXPORT_API int appcore_ui_base_get_hint(void) +{ + return __context.hint; +} + +EXPORT_API bool appcore_ui_base_get_bg_state(void) +{ + return __context.bg_state; +} + +EXPORT_API void appcore_ui_base_set_bg_state(bool bg_state) +{ + __context.bg_state = bg_state; +} + static int __on_receive(aul_type type, bundle *b, void *data) { return appcore_ui_base_on_receive(type, b); @@ -799,14 +1031,9 @@ static void __window_on_visibility(int type, void *event, void *data) appcore_ui_base_window_on_visibility(type, event); } -static void __run(void *data) -{ - elm_run(); -} - -static void __exit(void *data) +static void __window_on_pre_visibility(int type, void *event, void *data) { - elm_exit(); + appcore_ui_base_window_on_pre_visibility(type, event); } EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void) @@ -819,8 +1046,10 @@ EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void) ops.base.create = __on_create; ops.base.terminate = __on_terminate; ops.base.receive = __on_receive; - ops.base.run = __run; - ops.base.exit = __exit; + ops.base.init = NULL; + ops.base.finish = NULL; + ops.base.run = NULL; + ops.base.exit = NULL; ops.pause = __on_pause; ops.resume = __on_resume; @@ -828,6 +1057,7 @@ EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void) ops.window.hide = __window_on_hide; ops.window.lower = __window_on_lower; ops.window.visibility = __window_on_visibility; + ops.window.pre_visibility = __window_on_pre_visibility; return ops; }