X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fappcore-efl.c;h=2c0a8a5cbc65724bda5d3c4d611e864c6dd2c2f8;hb=94ef9ec5bdf3ca225ac231be586e0f5883dc4b84;hp=b30e865043cfadb653dedc79496c3ccd6bef3b4d;hpb=9a408929dd7d252197bcd1dcbc1bd0d497b37e72;p=platform%2Fcore%2Fappfw%2Fapp-core.git diff --git a/src/appcore-efl.c b/src/appcore-efl.c index b30e865..2c0a8a5 100644 --- a/src/appcore-efl.c +++ b/src/appcore-efl.c @@ -24,13 +24,10 @@ #include #include -#if defined(WAYLAND) #include -#elif defined(X11) -#include -#include -#include -#endif +#include +#include +#include #include #include @@ -42,27 +39,18 @@ #include #include #include +#include +#include +#include #include "appcore-internal.h" #include "appcore-efl.h" - -#define RESOURCED_PROCESS_PATH "/Org/Tizen/ResourceD/Process" -#define RESOURCED_PROCESS_INTERFACE "org.tizen.resourced.process" -#define RESOURCED_PROCSTATUS_SIGNAL "ProcStatus" +#include static pid_t _pid; static bool resource_reclaiming = TRUE; static int tmp_val = 0; -/* cgroup command type */ -enum proc_status_type { - PROC_STATUS_LAUNCH, - PROC_STATUS_RESUME, - PROC_STATUS_TERMINATE, - PROC_STATUS_FOREGRD, - PROC_STATUS_BACKGRD, -}; - struct ui_priv { const char *name; enum app_state state; @@ -70,18 +58,14 @@ struct ui_priv { Ecore_Event_Handler *hshow; Ecore_Event_Handler *hhide; Ecore_Event_Handler *hvchange; -#if defined(WAYLAND) Ecore_Event_Handler *hlower; -#endif Ecore_Event_Handler *hcmsg; /* WM_ROTATE */ Ecore_Timer *mftimer; /* Ecore Timer for memory flushing */ -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT struct appcore *app_core; void (*prepare_to_suspend) (void *data); void (*exit_from_suspend) (void *data); -#endif struct appcore_ops *ops; void (*mfcb) (void); /* Memory Flushing Callback */ @@ -92,6 +76,7 @@ struct ui_priv { void *rot_cb_data; enum appcore_rm rot_mode; bundle *pending_data; + char *below_app; }; static struct ui_priv priv; @@ -105,6 +90,7 @@ static const char *_ae_name[AE_MAX] = { [AE_RESET] = "RESET", [AE_LOWMEM_POST] = "LOWMEM_POST", [AE_MEM_FLUSH] = "MEM_FLUSH", + [AE_UPDATE_REQUESTED] = "UPDATE_REQUESTED", }; static const char *_as_name[] = { @@ -120,53 +106,109 @@ static bool first_launch = TRUE; struct win_node { unsigned int win; -#if defined(WAYLAND) unsigned int surf; -#endif bool bfobscured; }; -#if defined(X11) -static struct ui_wm_rotate wm_rotate; -#endif static Eina_Bool __visibility_cb(void *data, int type, void *event); +static GSList *g_winnode_list; + +static struct wl_display *dsp; +static struct wl_registry *reg; +static struct tizen_policy *tz_policy; +static bool bg_state = false; + +static void __wl_listener_cb(void *data, struct wl_registry *reg, + uint32_t id, const char *interface, uint32_t ver) +{ + if (interface && !strcmp(interface, "tizen_policy")) { + if (!tz_policy) + tz_policy = wl_registry_bind(reg, id, + &tizen_policy_interface, 1); + } +} -static void __send_to_resourced(enum proc_status_type type) +static void __wl_listener_remove_cb(void *data, struct wl_registry *reg, + unsigned int id) { - GDBusConnection *conn; - GError *err = NULL; + /* do nothing */ +} - conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); - if (!conn) { - _ERR("g_bus_bus_get() is failed: [%s]", err->message); - g_error_free(err); - return; +static const struct wl_registry_listener reg_listener = { + __wl_listener_cb, + __wl_listener_remove_cb +}; + +static int __init_wl(void) +{ + _DBG("initialize wayland"); + dsp = wl_display_connect(NULL); + if (dsp == NULL) { + _ERR("Failed to connect wl display"); + return -1; } - if (g_dbus_connection_emit_signal(conn, - NULL, - RESOURCED_PROCESS_PATH, - RESOURCED_PROCESS_INTERFACE, - RESOURCED_PROCSTATUS_SIGNAL, - g_variant_new("(ii)", type, _pid), - &err) == FALSE) { - _ERR("g_dbus_connection_emit_signal() is failed: [%s]", - err->message); - g_error_free(err); - return; + reg = wl_display_get_registry(dsp); + if (reg == NULL) { + _ERR("Failed to get registry"); + wl_display_disconnect(dsp); + return -1; } - if (g_dbus_connection_flush_sync(conn, NULL, &err) == FALSE) - _ERR("g_dbus_connection_flush_sync() is failed: [%s]", - err->message); + wl_registry_add_listener(reg, ®_listener, NULL); + wl_display_roundtrip(dsp); + + if (!tz_policy) { + _ERR("Failed to get tizen policy interface"); + wl_registry_destroy(reg); + wl_display_disconnect(dsp); + return -1; + } - g_clear_error(&err); - g_object_unref(conn); + return 0; } -static GSList *g_winnode_list; +static void __finish_wl(void) +{ + if (tz_policy) { + tizen_policy_destroy(tz_policy); + tz_policy = NULL; + } + + if (reg) { + wl_registry_destroy(reg); + reg = NULL; + } + + if (dsp) { + wl_display_disconnect(dsp); + dsp = NULL; + } +} + +static void __set_bg_state(void) +{ + if (__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); +} + +static void __unset_bg_state(void) +{ + if (!tz_policy) + return; + + tizen_policy_unset_background_state(tz_policy, getpid()); + wl_display_roundtrip(dsp); + bg_state = false; + _DBG("bg state: %d", bg_state); + __finish_wl(); +} -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT static void __appcore_efl_prepare_to_suspend(void *data) { struct ui_priv *ui = (struct ui_priv *)data; @@ -198,7 +240,20 @@ static void __appcore_efl_exit_from_suspend(void *data) } _DBG("[__SUSPEND__]"); } -#endif + +static void __appcore_efl_update_requested(void *data) +{ + struct ui_priv *ui = (struct ui_priv *)data; + struct sys_op *op; + int dummy = 0; + + if (ui->app_core) { + op = &ui->app_core->sops[SE_UPDATE_REQUESTED]; + if (op && op->func) + op->func((void *)&dummy, op->data); + } + _DBG("[__UPDATE_REQUESTED__]"); +} #if defined(MEMORY_FLUSH_ACTIVATE) static Eina_Bool __appcore_memory_flush_cb(void *data) @@ -209,12 +264,10 @@ static Eina_Bool __appcore_memory_flush_cb(void *data) if (ui) ui->mftimer = NULL; -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT - if (ui && ui->prepare_to_suspend) { + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT && ui && ui->prepare_to_suspend) { _DBG("[__SUSPEND__] flush case"); ui->prepare_to_suspend(ui); } -#endif return ECORE_CALLBACK_CANCEL; } @@ -259,7 +312,6 @@ static void __appcore_efl_memory_flush_cb(void) _DBG("[APP %d] __appcore_efl_memory_flush_cb()", _pid); elm_cache_all_flush(); } -#if defined(WAYLAND) static void wl_raise_win(void) { Ecore_Wl_Window *win; @@ -289,12 +341,13 @@ static void wl_pause_win(void) } } -#endif static void __do_app(enum app_event event, void *data, bundle * b) { int r = -1; struct ui_priv *ui = data; + const char *below_app; + const char *bg_launch; _DBG("[APP %d] Event: %d", _pid, event); _ret_if(ui == NULL || event >= AE_MAX); @@ -327,20 +380,12 @@ static void __do_app(enum app_event event, void *data, bundle * b) } if (event == AE_RAISE) { -#if defined(X11) - x_raise_win(getpid()); -#elif defined(WAYLAND) wl_raise_win(); -#endif return; } if (event == AE_LOWER) { -#if defined(X11) - x_pause_win(getpid()); -#elif defined(WAYLAND) wl_pause_win(); -#endif return; } @@ -349,29 +394,44 @@ static void __do_app(enum app_event event, void *data, bundle * b) switch (event) { case AE_RESET: _DBG("[APP %d] RESET", _pid); + if (ui->pending_data) + bundle_free(ui->pending_data); ui->pending_data = bundle_dup(b); LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:start]", ui->name); -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT - if (ui->exit_from_suspend) { + if (ui->below_app) { + free(ui->below_app); + ui->below_app = NULL; + } + + below_app = bundle_get_val(b, AUL_SVC_K_RELOCATE_BELOW); + if (below_app) + ui->below_app = strdup(below_app); + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT && ui->exit_from_suspend) { _DBG("[__SUSPEND__] reset case"); ui->exit_from_suspend(ui); } -#endif - if (ui->ops->reset) + if (ui->ops->reset) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, + "APPCORE:RESET"); r = ui->ops->reset(b, ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:done]", ui->name); if (first_launch) { + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT && ui->app_core->allowed_bg) + __appcore_timer_add(ui); first_launch = FALSE; } else { _INFO("[APP %d] App already running, raise the window", _pid); -#ifdef X11 - x_raise_win(getpid()); -#else + if (bg_state) { + bg_launch = bundle_get_val(b, AUL_SVC_K_BG_LAUNCH); + if (!bg_launch || strcmp(bg_launch, "enable")) + __unset_bg_state(); + } wl_raise_win(); -#endif } LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:done]", ui->name); @@ -379,33 +439,36 @@ static void __do_app(enum app_event event, void *data, bundle * b) case AE_PAUSE: if (ui->state == AS_RUNNING) { _DBG("[APP %d] PAUSE", _pid); - if (ui->ops->pause) + if (ui->ops->pause) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, + "APPCORE:PAUSE"); r = ui->ops->pause(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } ui->state = AS_PAUSED; if (r >= 0 && resource_reclaiming == TRUE) __appcore_timer_add(ui); -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT - else if (r >= 0 && resource_reclaiming == FALSE + else if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT && r >= 0 && resource_reclaiming == FALSE && ui->prepare_to_suspend) { _DBG("[__SUSPEND__] pause case"); ui->prepare_to_suspend(ui); } -#endif } /* TODO : rotation stop */ /* r = appcore_pause_rotation_cb(); */ aul_status_update(STATUS_BG); - __send_to_resourced(PROC_STATUS_BACKGRD); break; case AE_RESUME: LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:start]", ui->name); -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT - if (ui->exit_from_suspend) { - _DBG("[__SUSPEND__] resume case"); - ui->exit_from_suspend(ui); + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT) { + if (ui->exit_from_suspend) { + _DBG("[__SUSPEND__] resume case"); + ui->exit_from_suspend(ui); + } + if (ui->app_core->allowed_bg) + __appcore_timer_del(ui); } -#endif if (ui->state == AS_PAUSED || ui->state == AS_CREATED) { _DBG("[APP %d] RESUME", _pid); @@ -415,9 +478,19 @@ static void __do_app(enum app_event event, void *data, bundle * b) ui->pending_data = NULL; } - if (ui->ops->resume) + if (ui->ops->resume) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, + "APPCORE:RESUME"); ui->ops->resume(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } ui->state = AS_RUNNING; + + if (ui->below_app) { + aul_app_group_activate_below(ui->below_app); + free(ui->below_app); + ui->below_app = NULL; + } } /*TODO : rotation start*/ /* r = appcore_resume_rotation_cb(); */ @@ -426,7 +499,6 @@ static void __do_app(enum app_event event, void *data, bundle * b) LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:Launching:done]", ui->name); aul_status_update(STATUS_VISIBLE); - __send_to_resourced(PROC_STATUS_FOREGRD); break; case AE_TERMINATE_BGAPP: if (ui->state == AS_PAUSED) { @@ -440,6 +512,9 @@ static void __do_app(enum app_event event, void *data, bundle * b) _DBG("[APP %d] is another state", _pid); } break; + case AE_UPDATE_REQUESTED: + __appcore_efl_update_requested(ui); + break; default: /* do nothing */ break; @@ -482,33 +557,6 @@ static GSList *__find_win(unsigned int win) return NULL; } -#if defined(X11) -static bool __add_win(unsigned int win) -{ - struct win_node *t; - GSList *f; - - _DBG("[EVENT_TEST][EVENT] __add_win WIN:%x\n", win); - - f = __find_win(win); - if (f) { - errno = ENOENT; - _DBG("[EVENT_TEST][EVENT] ERROR There is already window : %x \n", win); - return FALSE; - } - - t = calloc(1, sizeof(struct win_node)); - if (t == NULL) - return FALSE; - - t->win = win; - t->bfobscured = FALSE; - - g_winnode_list = g_slist_append(g_winnode_list, t); - - return TRUE; -} -#elif defined(WAYLAND) static bool __add_win(unsigned int win, unsigned int surf) { struct win_node *t; @@ -535,7 +583,6 @@ static bool __add_win(unsigned int win, unsigned int surf) return TRUE; } -#endif static bool __delete_win(unsigned int win) { @@ -555,33 +602,6 @@ static bool __delete_win(unsigned int win) return TRUE; } -#if defined(X11) -static bool __update_win(unsigned int win, bool bfobscured) -{ - GSList *f; - struct win_node *t; - - _DBG("[EVENT_TEST][EVENT] __update_win WIN:%x fully_obscured %d\n", win, - bfobscured); - - f = __find_win(win); - if (!f) { - errno = ENOENT; - _DBG("[EVENT_TEST][EVENT] ERROR There is no window : %x \n", win); - return FALSE; - } - - g_winnode_list = g_slist_remove_link(g_winnode_list, f); - - t = (struct win_node *)f->data; - t->win = win; - t->bfobscured = bfobscured; - - g_winnode_list = g_slist_concat(g_winnode_list, f); - - return TRUE; -} -#elif defined(WAYLAND) static bool __update_win(unsigned int win, unsigned int surf, bool bfobscured) { GSList *f; @@ -597,85 +617,17 @@ static bool __update_win(unsigned int win, unsigned int surf, bool bfobscured) return FALSE; } - g_winnode_list = g_slist_remove_link(g_winnode_list, f); - t = (struct win_node *)f->data; t->win = win; if (surf != 0) t->surf = surf; t->bfobscured = bfobscured; - g_winnode_list = g_slist_concat(g_winnode_list, f); - return TRUE; } -#endif - -/* WM_ROTATE */ -#ifdef X11 -static Ecore_X_Atom _WM_WINDOW_ROTATION_SUPPORTED = 0; -static Ecore_X_Atom _WM_WINDOW_ROTATION_CHANGE_REQUEST = 0; - -static int __check_wm_rotation_support(void) -{ - _DBG("Disable window manager rotation"); - return -1; - - Ecore_X_Window root, win, win2; - int ret; - - if (!_WM_WINDOW_ROTATION_SUPPORTED) { - _WM_WINDOW_ROTATION_SUPPORTED = - ecore_x_atom_get("_E_WINDOW_ROTATION_SUPPORTED"); - } - - if (!_WM_WINDOW_ROTATION_CHANGE_REQUEST) { - _WM_WINDOW_ROTATION_CHANGE_REQUEST = - ecore_x_atom_get("_E_WINDOW_ROTATION_CHANGE_REQUEST"); - } - - root = ecore_x_window_root_first_get(); - ret = ecore_x_window_prop_xid_get(root, - _WM_WINDOW_ROTATION_SUPPORTED, - ECORE_X_ATOM_WINDOW, - &win, 1); - if ((ret == 1) && (win)) { - ret = ecore_x_window_prop_xid_get(win, - _WM_WINDOW_ROTATION_SUPPORTED, - ECORE_X_ATOM_WINDOW, - &win2, 1); - if ((ret == 1) && (win2 == win)) - return 0; - } - - return -1; -} - -static void __set_wm_rotation_support(unsigned int win, unsigned int set) -{ - GSList *iter = NULL; - struct win_node *entry = NULL; - - if (win == 0) { - for (iter = g_winnode_list; iter != NULL; iter = g_slist_next(iter)) { - entry = iter->data; - if (entry->win) { - ecore_x_window_prop_card32_set(entry->win, - _WM_WINDOW_ROTATION_SUPPORTED, - &set, 1); - } - } - } else { - ecore_x_window_prop_card32_set(win, - _WM_WINDOW_ROTATION_SUPPORTED, - &set, 1); - } -} -#endif static Eina_Bool __show_cb(void *data, int type, void *event) { -#if defined(WAYLAND) Ecore_Wl_Event_Window_Show *ev; ev = event; @@ -691,22 +643,6 @@ static Eina_Bool __show_cb(void *data, int type, void *event) else __update_win((unsigned int)ev->win, (unsigned int)ev->data[0], FALSE); -#elif defined(X11) - Ecore_X_Event_Window_Show *ev; - - ev = event; - - _DBG("[EVENT_TEST][EVENT] GET SHOW EVENT!!!. WIN:%x\n", ev->win); - - if (!__find_win((unsigned int)ev->win)) { - /* WM_ROTATE */ - if ((priv.wm_rot_supported) && (1 == priv.rot_started)) - __set_wm_rotation_support(ev->win, 1); - __add_win((unsigned int)ev->win); - } else { - __update_win((unsigned int)ev->win, FALSE); - } -#endif appcore_group_attach(); return ECORE_CALLBACK_RENEW; @@ -714,11 +650,7 @@ static Eina_Bool __show_cb(void *data, int type, void *event) static Eina_Bool __hide_cb(void *data, int type, void *event) { -#if defined(WAYLAND) Ecore_Wl_Event_Window_Hide *ev; -#elif defined(X11) - Ecore_X_Event_Window_Hide *ev; -#endif int bvisibility = 0; ev = event; @@ -738,7 +670,6 @@ static Eina_Bool __hide_cb(void *data, int type, void *event) return ECORE_CALLBACK_RENEW; } -#if defined(WAYLAND) static Eina_Bool __lower_cb(void *data, int type, void *event) { Ecore_Wl_Event_Window_Lower *ev; @@ -748,23 +679,13 @@ static Eina_Bool __lower_cb(void *data, int type, void *event) appcore_group_lower(); return ECORE_CALLBACK_RENEW; } -#endif static Eina_Bool __visibility_cb(void *data, int type, void *event) { -#if defined(WAYLAND) Ecore_Wl_Event_Window_Visibility_Change *ev; int bvisibility = 0; ev = event; __update_win((unsigned int)ev->win, 0, ev->fully_obscured); -#elif defined(X11) - Ecore_X_Event_Window_Visibility_Change *ev; - int bvisibility = 0; - - ev = event; - - __update_win((unsigned int)ev->win, ev->fully_obscured); -#endif bvisibility = __check_visible(); _DBG("bvisibility %d, b_active %d", bvisibility, b_active); @@ -785,59 +706,9 @@ static Eina_Bool __visibility_cb(void *data, int type, void *event) } -#if defined(X11) -/* WM_ROTATE */ -static Eina_Bool __cmsg_cb(void *data, int type, void *event) -{ - struct ui_priv *ui = (struct ui_priv *)data; - Ecore_X_Event_Client_Message *e = event; - - if (!ui) - return ECORE_CALLBACK_PASS_ON; - - if (e->format != 32) - return ECORE_CALLBACK_PASS_ON; - - if (e->message_type == _WM_WINDOW_ROTATION_CHANGE_REQUEST) { - if ((ui->wm_rot_supported == 0) - || (ui->rot_started == 0) - || (ui->rot_cb == NULL)) { - return ECORE_CALLBACK_PASS_ON; - } - - enum appcore_rm rm; - switch (e->data.l[1]) { - case 0: - rm = APPCORE_RM_PORTRAIT_NORMAL; - break; - case 90: - rm = APPCORE_RM_LANDSCAPE_REVERSE; - break; - case 180: - rm = APPCORE_RM_PORTRAIT_REVERSE; - break; - case 270: - rm = APPCORE_RM_LANDSCAPE_NORMAL; - break; - default: - rm = APPCORE_RM_UNKNOWN; - break; - } - - ui->rot_mode = rm; - - if (APPCORE_RM_UNKNOWN != rm) - ui->rot_cb((void *)&rm, rm, ui->rot_cb_data); - } - - return ECORE_CALLBACK_PASS_ON; -} -#endif - static void __add_climsg_cb(struct ui_priv *ui) { _ret_if(ui == NULL); -#if defined(WAYLAND) ui->hshow = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __show_cb, ui); ui->hhide = @@ -848,29 +719,15 @@ static void __add_climsg_cb(struct ui_priv *ui) ui->hlower = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __lower_cb, ui); -#elif defined(X11) - ui->hshow = - ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, __show_cb, ui); - ui->hhide = - ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, __hide_cb, ui); - ui->hvchange = - ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, - __visibility_cb, ui); - - /* Add client message callback for WM_ROTATE */ - if (!__check_wm_rotation_support()) { - ui->hcmsg = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, - __cmsg_cb, ui); - ui->wm_rot_supported = 1; - appcore_set_wm_rotation(&wm_rotate); - } -#endif } static int __before_loop(struct ui_priv *ui, int *argc, char ***argv) { int r; char *hwacc = NULL; + struct appcore *ac = NULL; + bundle *b; + const char *bg_launch; if (argc == NULL || argv == NULL) { _ERR("argc/argv is NULL"); @@ -899,20 +756,35 @@ static int __before_loop(struct ui_priv *ui, int *argc, char ***argv) r = appcore_init(ui->name, &efl_ops, *argc, *argv); _retv_if(r == -1, -1); -#if _APPFW_FEATURE_BACKGROUND_MANAGEMENT - appcore_get_app_core(&ac); - ui->app_core = ac; - SECURE_LOGD("[__SUSPEND__] appcore initialized, appcore addr: 0x%x", ac); -#endif + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT) { + appcore_get_app_core(&ac); + ui->app_core = ac; + SECURE_LOGD("[__SUSPEND__] appcore initialized, appcore addr: #%x", ac); + } + + b = bundle_import_from_argv(*argc, *argv); + if (b) { + bg_launch = bundle_get_val(b, AUL_SVC_K_BG_LAUNCH); + if (bg_launch && strcmp(bg_launch, "enable") == 0) + __set_bg_state(); + + bundle_free(b); + } LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:appcore_init:done]", ui->name); if (ui->ops && ui->ops->create) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:CREATE"); r = ui->ops->create(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); if (r < 0) { _ERR("create() return error"); appcore_exit(); - if (ui->ops && ui->ops->terminate) + if (ui->ops && ui->ops->terminate) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, + "APPCORE:TERMINATE"); ui->ops->terminate(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } errno = ECANCELED; return -1; } @@ -933,12 +805,19 @@ static void __after_loop(struct ui_priv *ui) if (ui->state == AS_RUNNING) { _DBG("[APP %d] PAUSE before termination", _pid); - if (ui->ops && ui->ops->pause) + if (ui->ops && ui->ops->pause) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, + "APPCORE:PAUSE"); ui->ops->pause(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } } - if (ui->ops && ui->ops->terminate) + if (ui->ops && ui->ops->terminate) { + traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:TERMINATE"); ui->ops->terminate(ui->ops->data); + traceEnd(TTRACE_TAG_APPLICATION_MANAGER); + } ui->state = AS_DYING; @@ -948,14 +827,18 @@ static void __after_loop(struct ui_priv *ui) ecore_event_handler_del(ui->hhide); if (ui->hvchange) ecore_event_handler_del(ui->hvchange); -#if defined(WAYLAND) if (ui->hlower) ecore_event_handler_del(ui->hlower); -#endif __appcore_timer_del(ui); elm_shutdown(); + + /* Check loader case */ + if (getenv("AUL_LOADER_INIT")) { + unsetenv("AUL_LOADER_INIT"); + elm_shutdown(); + } } static int __set_data(struct ui_priv *ui, const char *name, @@ -993,11 +876,11 @@ static int __set_data(struct ui_priv *ui, const char *name, ui->rot_cb_data = NULL; ui->rot_mode = APPCORE_RM_UNKNOWN; -#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT - ui->app_core = NULL; - ui->prepare_to_suspend = __appcore_efl_prepare_to_suspend; - ui->exit_from_suspend = __appcore_efl_exit_from_suspend; -#endif + if (_APPFW_FEATURE_BACKGROUND_MANAGEMENT) { + ui->app_core = NULL; + ui->prepare_to_suspend = __appcore_efl_prepare_to_suspend; + ui->exit_from_suspend = __appcore_efl_exit_from_suspend; + } return 0; } @@ -1010,78 +893,6 @@ static void __unset_data(struct ui_priv *ui) memset(ui, 0, sizeof(struct ui_priv)); } -#if defined(X11) -/* WM_ROTATE */ -static int __wm_set_rotation_cb(int (*cb) (void *event_info, enum appcore_rm, void *), void *data) -{ - if (cb == NULL) { - errno = EINVAL; - return -1; - } - - if ((priv.wm_rot_supported) && (0 == priv.rot_started)) - __set_wm_rotation_support(0, 1); - - priv.rot_cb = cb; - priv.rot_cb_data = data; - priv.rot_started = 1; - - return 0; -} - -static int __wm_unset_rotation_cb(void) -{ - if ((priv.wm_rot_supported) && (1 == priv.rot_started)) - __set_wm_rotation_support(0, 0); - - priv.rot_cb = NULL; - priv.rot_cb_data = NULL; - priv.rot_started = 0; - - return 0; -} - -static int __wm_get_rotation_state(enum appcore_rm *curr) -{ - if (curr == NULL) { - errno = EINVAL; - return -1; - } - - *curr = priv.rot_mode; - - return 0; -} - -static int __wm_pause_rotation_cb(void) -{ - if ((priv.rot_started == 1) && (priv.wm_rot_supported)) - __set_wm_rotation_support(0, 0); - - priv.rot_started = 0; - - return 0; -} - -static int __wm_resume_rotation_cb(void) -{ - if ((priv.rot_started == 0) && (priv.wm_rot_supported)) - __set_wm_rotation_support(0, 1); - - priv.rot_started = 1; - - return 0; -} - -static struct ui_wm_rotate wm_rotate = { - __wm_set_rotation_cb, - __wm_unset_rotation_cb, - __wm_get_rotation_state, - __wm_pause_rotation_cb, - __wm_resume_rotation_cb -}; -#endif - EXPORT_API int appcore_efl_init(const char *name, int *argc, char ***argv, struct appcore_ops *ops) { @@ -1153,7 +964,7 @@ EXPORT_API int appcore_set_preinit_window_name(const char *win_name) return ret; } - preinit_window = aul_get_preinit_window(win_name); + preinit_window = elm_win_precreated_object_get(); if (!preinit_window) { _ERR("Failed to get preinit window"); return ret; @@ -1183,7 +994,6 @@ EXPORT_API unsigned int appcore_get_main_window(void) return 0; } -#if defined(WAYLAND) EXPORT_API unsigned int appcore_get_main_surface(void) { struct win_node *entry = NULL; @@ -1195,4 +1005,36 @@ EXPORT_API unsigned int appcore_get_main_surface(void) return 0; } -#endif + +tizen_profile_t _get_tizen_profile() +{ + static tizen_profile_t profile = TIZEN_PROFILE_UNKNOWN; + if (__builtin_expect(profile != TIZEN_PROFILE_UNKNOWN, 1)) + return profile; + + char *profileName; + system_info_get_platform_string("http://tizen.org/feature/profile", &profileName); + switch (*profileName) { + case 'm': + case 'M': + profile = TIZEN_PROFILE_MOBILE; + break; + case 'w': + case 'W': + profile = TIZEN_PROFILE_WEARABLE; + break; + case 't': + case 'T': + profile = TIZEN_PROFILE_TV; + break; + case 'i': + case 'I': + profile = TIZEN_PROFILE_IVI; + break; + default: // common or unTIZEN_nown ==> ALL ARE COMMON. + profile = TIZEN_PROFILE_COMMON; + } + free(profileName); + + return profile; +}