From 72213bf7f0971e6ff5876d015b3f0590b8fe22fb Mon Sep 17 00:00:00 2001 From: "SukHyung, Kang" Date: Thu, 14 Jan 2016 10:05:40 +0900 Subject: [PATCH 01/16] change doc files to sync tizen 2.4 for API references Change-Id: I67d460b11ae48482f411125a9c22be1385111e25 Signed-off-by: SukHyung, Kang --- doc/appcore-widget_doc.h | 15 +++++++++------ doc/images/widget_app_lifecycle.png | Bin 18154 -> 22048 bytes 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/appcore-widget_doc.h b/doc/appcore-widget_doc.h index a6833ee..e9fe5a5 100755 --- a/doc/appcore-widget_doc.h +++ b/doc/appcore-widget_doc.h @@ -79,38 +79,38 @@ * Description * * - * widget_obj_create_cb() + * widget_instance_create_cb() * Called after widget instance is created. * In this callback, you can initialize resources for this instance. * If parameter 'content' is not NULL, You should restore the pervious status. * * * - * widget_obj_destroy_cb() + * widget_instance_destroy_cb() * Called before widget instance is destroyed. * In this callback, you can finalize resources for this instance. * * * - * widget_obj_pause_cb() + * widget_instance_pause_cb() * Called when the widget is invisible. * The paused instance may be destroyed by framework * * * - * widget_obj_resume_cb() + * widget_instance_resume_cb() * Called when the widget is visible. * The callback function is called when the widget is visible. * * * - * widget_obj_resize_cb() + * widget_instance_resize_cb() * Called before the widget size is changed. * The callback function is called before the widget size is changed. * * * - * widget_obj_update_cb() + * widget_instance_update_cb() * Called when the event for updating widget is received. * The callback function is called when the event for updating widget is received. * @@ -121,6 +121,9 @@ * Please refer to the following state diagram to see the possible transitions and callbacks that are called while transition. * @image html widget_obj_lifecycle.png "Widget Instance States" * + * @section CAPI_WIDGET_APP_MODULE_RELATED_FEATURES Related Features + * This API is related with the following feature: + * - http://tizen.org/feature/shell.appwidget * * */ diff --git a/doc/images/widget_app_lifecycle.png b/doc/images/widget_app_lifecycle.png index 9b1d87cfb4753375651512e0d3e43ab35581568c..923dd25eb4ab810fa0a2a74e26120e0baf86b25a 100755 GIT binary patch literal 22048 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 HQDOfBh-@q7 literal 18154 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 Ib4q9e0RCkO^Z)<= -- 2.7.4 From 79e75769d76403cca9848899f84416454900a17a Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Tue, 19 Jan 2016 11:44:52 +0900 Subject: [PATCH 02/16] fix warning Change-Id: If56e793e74dafe05b05bcb02f20be462ec6db92d Signed-off-by: Daehyeon Jung --- src/widget_app.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 5e7d2e2..eff8ab3 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -29,6 +30,8 @@ #include #include #include +#include +#include #include "widget_app.h" #include "widget-log.h" @@ -123,6 +126,8 @@ static int __send_update_status(const char *class_id, const char *instance_id, if (extra == NULL) bundle_free(b); + + return 0; } static int __instance_create(widget_class_h handle, const char *id, bundle *b) -- 2.7.4 From 0827f6ee9c2e35f743b7d91b7b59d781b88d2a88 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 29 Jan 2016 17:23:04 +0900 Subject: [PATCH 03/16] Check invalid parameter Change-Id: I17e6b7593210b7a4c4b0ef4d3491777af67a14f6 --- src/widget_app.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index eff8ab3..1c3c855 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -431,6 +431,9 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { + if (!cb) + return WIDGET_ERROR_INVALID_PARAMETER; + return WIDGET_ERROR_NONE; } @@ -439,18 +442,42 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, void *user_data) { /* TODO */ - return 0; + if (!event_handler || !callback) + return WIDGET_ERROR_INVALID_PARAMETER; + + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + case APP_EVENT_LOW_BATTERY: + case APP_EVENT_LANGUAGE_CHANGED: + case APP_EVENT_DEVICE_ORIENTATION_CHANGED: + case APP_EVENT_REGION_FORMAT_CHANGED: + case APP_EVENT_SUSPENDED_STATE_CHANGED: + + break; + default: + return WIDGET_ERROR_INVALID_PARAMETER; + } + + return WIDGET_ERROR_NONE; } EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { /* TODO */ - return 0; + if (!event_handler) + return WIDGET_ERROR_INVALID_PARAMETER; + + return WIDGET_ERROR_NONE; } EXPORT_API const char* widget_app_get_id(widget_context_h context) { + if (!context) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + return context->id; } @@ -574,8 +601,12 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) { /* TODO - may use widget status update, or use surface title set. + call elm_win_title_set() */ - return 0; + + if (!context || !title) + return WIDGET_ERROR_INVALID_PARAMETER; + + return WIDGET_ERROR_NONE; } -- 2.7.4 From add47d6698911638a2abbd9e8c4f70441a9f1ef8 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Thu, 25 Feb 2016 13:17:30 +0900 Subject: [PATCH 04/16] check widget feature first Change-Id: I35deb1006d0b4734bdf592cb90a126cc6f2fe056 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index 1c3c855..b77fe74 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "widget_app.h" #include "widget-log.h" @@ -93,6 +94,27 @@ static widget_class_h class_provider = NULL; static GList *contexts = NULL; static char *viewer_endpoint = NULL; +static inline bool _is_widget_feature_enabled(void) +{ + static bool feature = false; + static bool retrieved = false; + int ret; + + if (retrieved == true) + return feature; + + ret = system_info_get_platform_bool( + "http://tizen.org/feature/shell.appwidget", &feature); + if (ret != SYSTEM_INFO_ERROR_NONE) { + _E("failed to get system info"); + return false; + } + + retrieved = true; + + return feature; +} + static gint __comp_by_id(gconstpointer a, gconstpointer b) { widget_context_s *wc = (widget_context_s*)a; @@ -369,6 +391,11 @@ EXPORT_API int widget_app_main(int argc, char **argv, { int r; + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (argc <= 0 || argv == NULL || callback == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -390,6 +417,11 @@ EXPORT_API int widget_app_main(int argc, char **argv, EXPORT_API int widget_app_exit(void) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + ecore_main_loop_quit(); return WIDGET_ERROR_NONE; @@ -422,6 +454,11 @@ static gboolean __finish_event_cb(gpointer user_data) EXPORT_API int widget_app_terminate_context(widget_context_h context) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -431,6 +468,11 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (!cb) return WIDGET_ERROR_INVALID_PARAMETER; @@ -441,6 +483,11 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, app_event_cb callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO */ if (!event_handler || !callback) return WIDGET_ERROR_INVALID_PARAMETER; @@ -464,6 +511,11 @@ EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO */ if (!event_handler) return WIDGET_ERROR_INVALID_PARAMETER; @@ -473,6 +525,12 @@ EXPORT_API int widget_app_remove_event_handler(app_event_handler_h EXPORT_API const char* widget_app_get_id(widget_context_h context) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + if (!context) { set_last_result(WIDGET_ERROR_INVALID_PARAMETER); return NULL; @@ -484,13 +542,18 @@ EXPORT_API const char* widget_app_get_id(widget_context_h context) EXPORT_API int widget_app_get_elm_win(widget_context_h context, Evas_Object **win) { - if (context == NULL || win == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - widget_context_s *cxt = (widget_context_s*)context; Evas_Object *ret_win; Ecore_Wl_Window *wl_win; + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + + if (context == NULL || win == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + ret_win = elm_win_add(NULL, cxt->id, ELM_WIN_BASIC); if (ret_win == NULL) { _E("failed to create window"); @@ -515,6 +578,12 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_NOT_SUPPORTED); + return NULL; + } + widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); if (wc == NULL) { @@ -540,6 +609,12 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + if (class_id == NULL) { set_last_result(WIDGET_ERROR_INVALID_PARAMETER); return NULL; @@ -550,11 +625,21 @@ EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, cons EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) { + if (!_is_widget_feature_enabled()) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + return _widget_class_create(class_provider, appid, callback, user_data); } EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -565,6 +650,11 @@ EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL || tag == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -577,6 +667,12 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun { const char *class_id = NULL; int ret = 0; + + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + if (context == NULL || content_info == NULL) return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); @@ -600,6 +696,11 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) { + if (!_is_widget_feature_enabled()) { + _E("not supported"); + return WIDGET_ERROR_NOT_SUPPORTED; + } + /* TODO call elm_win_title_set() */ -- 2.7.4 From 5cb01bf9f4f90bc6a5e2b75b400de61977c21e71 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 26 Feb 2016 15:57:48 +0900 Subject: [PATCH 05/16] Fix the exception about checking widget feature Change-Id: I5ab197ba3ec80bae9a37d1a6cc0b45f4d1f46c5a Signed-off-by: Hwankyu Jhun --- src/widget_app.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index b77fe74..905b186 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -119,7 +119,7 @@ static gint __comp_by_id(gconstpointer a, gconstpointer b) { widget_context_s *wc = (widget_context_s*)a; - return strcmp(wc->id, (const char*)b); + return strcmp(wc->id, (const char*)b); } static widget_context_s* __find_context_by_id(const char *id) @@ -173,13 +173,11 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) bundle_get_str(b, WIDGET_K_WIDTH, &w_str); bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); - if (w_str) { + if (w_str) w = (int)g_ascii_strtoll(w_str, &remain, 10); - } - if (h_str) { + if (h_str) h = (int)g_ascii_strtoll(h_str, &remain, 10); - } contexts = g_list_append(contexts, wc); @@ -578,14 +576,20 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { + widget_class_s *wc; + if (!_is_widget_feature_enabled()) { _E("not supported"); set_last_result(WIDGET_ERROR_NOT_SUPPORTED); return NULL; } - widget_class_s *wc = (widget_class_s*)malloc(sizeof(widget_class_s)); + if (class_id == NULL) { + set_last_result(WIDGET_ERROR_INVALID_PARAMETER); + return NULL; + } + wc = (widget_class_s *)malloc(sizeof(widget_class_s)); if (wc == NULL) { _E("failed to malloc : %s", __FUNCTION__); set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); @@ -609,27 +613,11 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { - if (!_is_widget_feature_enabled()) { - _E("not supported"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (class_id == NULL) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - return _widget_class_create(widget_class, class_id, callback, user_data); } EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) { - if (!_is_widget_feature_enabled()) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - return _widget_class_create(class_provider, appid, callback, user_data); } -- 2.7.4 From cf58e4b97a8c72028d7a88649854cb33d7c0400a Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Wed, 9 Mar 2016 12:06:26 +0900 Subject: [PATCH 06/16] Enable compiler option -Werror Change-Id: I28bb59cb233d9f988f80086301188229a54d46ac Signed-off-by: Junghoon Park --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 495fac4..d57515e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_SKIP_BUILD_RPATH TRUE) -- 2.7.4 From 95a4e10ca6d551b1830e97e1763062615af74a9e Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 30 Mar 2016 20:01:03 +0900 Subject: [PATCH 07/16] fix widget status notify Change-Id: I7d4792423d1c67891d67b93172a1f638cae556e6 --- src/widget_app.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/widget_app.c b/src/widget_app.c index 905b186..b856c16 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -144,6 +144,7 @@ static int __send_update_status(const char *class_id, const char *instance_id, bundle_add_str(b, WIDGET_K_INSTANCE, instance_id); bundle_add_byte(b, WIDGET_K_STATUS, &status, sizeof(int)); + _E("send update %s(%d) to %s", instance_id, status, viewer_endpoint); aul_app_com_send(viewer_endpoint, b); if (extra == NULL) @@ -182,7 +183,6 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) contexts = g_list_append(contexts, wc); handle->ops.create(wc, b, w, h, handle->user_data); - ret = __send_update_status(handle->classid, wc->id, WIDGET_INSTANCE_EVENT_CREATE, b, 0); return ret; @@ -336,6 +336,8 @@ static int __before_loop(int argc, char **argv) bundle_get_str(kb, AUL_K_WAYLAND_WORKING_DIR, &xdg_runtime_dir); bundle_get_str(kb, AUL_K_WAYLAND_DISPLAY, &wayland_display); bundle_get_str(kb, WIDGET_K_ENDPOINT, &viewer_endpoint); + _E("viewer endpoint :%s", viewer_endpoint); + viewer_endpoint = strdup(viewer_endpoint); if (xdg_runtime_dir) setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); @@ -381,6 +383,9 @@ static void __after_loop() if (app_ops->terminate) app_ops->terminate(app_user_data); + if (viewer_endpoint) + free(viewer_endpoint); + elm_shutdown(); } -- 2.7.4 From 013d5c1e938cd23dbeed7bbf019f634d7ec5c506 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 30 Mar 2016 21:10:11 +0900 Subject: [PATCH 08/16] Add NULL check for endpoint Change-Id: I3d1819d9f30784c785fd680593b5e9cb1c4cc65f --- src/widget_app.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index b856c16..f515704 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -336,8 +336,12 @@ static int __before_loop(int argc, char **argv) bundle_get_str(kb, AUL_K_WAYLAND_WORKING_DIR, &xdg_runtime_dir); bundle_get_str(kb, AUL_K_WAYLAND_DISPLAY, &wayland_display); bundle_get_str(kb, WIDGET_K_ENDPOINT, &viewer_endpoint); - _E("viewer endpoint :%s", viewer_endpoint); - viewer_endpoint = strdup(viewer_endpoint); + if (viewer_endpoint) { + _E("viewer endpoint :%s", viewer_endpoint); + viewer_endpoint = strdup(viewer_endpoint); + } else { + _E("endpoint is missing"); + } if (xdg_runtime_dir) setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); -- 2.7.4 From f23e0188ab8db88c7d98391f1e4b451a8cd02951 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 25 Mar 2016 21:48:38 +0900 Subject: [PATCH 09/16] Adjust coding rules Change-Id: Id7b804be392640d7459a91019e180f08a83f1a52 Signed-off-by: Hwankyu Jhun --- doc/appcore-widget_doc.h | 2 +- include/widget_app.h | 17 ++++--- include/widget_app_efl.h | 5 +- include/widget_app_internal.h | 31 +++++------- src/widget-i18n.c | 14 +++--- src/widget-log.h | 72 ++++++++++++++-------------- src/widget-private.h | 7 +-- src/widget_app.c | 109 ++++++++++++++++++++++++++---------------- src/widget_error.c | 32 ++++--------- 9 files changed, 150 insertions(+), 139 deletions(-) diff --git a/doc/appcore-widget_doc.h b/doc/appcore-widget_doc.h index e9fe5a5..1a83d63 100755 --- a/doc/appcore-widget_doc.h +++ b/doc/appcore-widget_doc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/include/widget_app.h b/include/widget_app.h index 67b6457..3c935cd 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -51,13 +51,13 @@ typedef enum widget_app_destroy_type { * @brief The handle for widget class. * @since_tizen 2.3.1 */ -typedef struct _widget_class* widget_class_h; +typedef struct _widget_class *widget_class_h; /** * @brief The handle for widget context. * @since_tizen 2.3.1 */ -typedef struct _widget_context* widget_context_h; +typedef struct _widget_context *widget_context_h; /** * @brief Called when the widget instance starts. @@ -164,8 +164,7 @@ typedef int (*widget_instance_update_cb)(widget_context_h context, bundle *conte * @brief The structure for lifecycle of a widget instance. * @since_tizen 2.3.1 */ -typedef struct -{ +typedef struct { widget_instance_create_cb create; /**< The callback function is called after widget instance is created. */ widget_instance_destroy_cb destroy; /**< The callback function is called before widget instance is destroyed. */ widget_instance_pause_cb pause; /**< The callback function is called when the widget is invisible. */ @@ -213,8 +212,7 @@ typedef void (*widget_app_terminate_cb)(void *user_data); * @brief The structure for lifecycle of a widget application. * @since_tizen 2.3.1 */ -typedef struct -{ +typedef struct { widget_app_create_cb create; /**< The callback function is called before the main loop of the application starts. */ widget_app_terminate_cb terminate; /**< This callback function is called once after the main loop of the application exits. */ } widget_app_lifecycle_callback_s; @@ -321,7 +319,7 @@ int widget_app_foreach_context(widget_context_cb callback, void *data); * @see watch_app_remove_event_handler() */ int widget_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, - app_event_cb callback, void *user_data); + app_event_cb callback, void *user_data); /** * @brief Removes registered event handler. @@ -352,7 +350,7 @@ int widget_app_remove_event_handler(app_event_handler_h event_handler); * @remark You must not free returned Widget ID * @see get_last_result() */ -const char* widget_app_get_id(widget_context_h context); +const char *widget_app_get_id(widget_context_h context); /** * @brief Makes a class for widget instances. @@ -456,3 +454,4 @@ widget_class_h widget_app_class_add(widget_class_h widget_class, const char *cla #endif #endif /* __TIZEN_APPFW_WIDGET_APP_H__ */ + diff --git a/include/widget_app_efl.h b/include/widget_app_efl.h index 4bd1765..fd1a0c0 100644 --- a/include/widget_app_efl.h +++ b/include/widget_app_efl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -52,4 +52,5 @@ int widget_app_get_elm_win(widget_context_h context, Evas_Object **win); } #endif -#endif +#endif /* __TIZEN_APPFW_WIDGET_APP_EFL_H__ */ + diff --git a/include/widget_app_internal.h b/include/widget_app_internal.h index 260f4f3..024cfa9 100644 --- a/include/widget_app_internal.h +++ b/include/widget_app_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -27,18 +27,14 @@ extern "C" { * For in-house applications * */ - -typedef struct -{ - struct __pointer - { +typedef struct { + struct __pointer { double x; double y; int down; } pointer; - struct __part - { + struct __part { double sx; double sy; double ex; @@ -47,28 +43,27 @@ typedef struct } widget_obj_event_info_s; -typedef int (*widget_instance_text_signal_cb)(widget_context_h context, const char *signal_name, - const char *source, widget_obj_event_info_s *info, void *user_data); +typedef int (*widget_instance_text_signal_cb)(widget_context_h context, + const char *signal_name, const char *source, + widget_obj_event_info_s *info, void *user_data); -typedef struct _widget_obj_private_ops -{ +typedef struct _widget_obj_private_ops { widget_instance_text_signal_cb text_signal; } widget_obj_private_ops_s; typedef struct _widget_class_factory_full widget_class_factory_full_s; -typedef const widget_class_factory_full_s* (*widget_class_factory_override_text_signal)(widget_instance_text_signal_cb op); - +typedef const widget_class_factory_full_s *(*widget_class_factory_override_text_signal)(widget_instance_text_signal_cb op); typedef widget_class_h (*_widget_class_factory_operation_make)(widget_instance_lifecycle_callback_s callback); -struct _widget_class_factory_full -{ +struct _widget_class_factory_full { widget_class_factory_override_text_signal override_text_signal; }; -const widget_class_factory_full_s* widget_app_get_class_factory(void); +const widget_class_factory_full_s *widget_app_get_class_factory(void); #ifdef __cplusplus } #endif -#endif +#endif /* __TIZEN_APPFW_WIDGET_APP_INTERNAL_H__ */ + diff --git a/src/widget-i18n.c b/src/widget-i18n.c index 23cbd3b..91804e2 100755 --- a/src/widget-i18n.c +++ b/src/widget-i18n.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -33,18 +33,17 @@ void _update_lang(void) { + char *r; char *lang = vconf_get_str(VCONFKEY_LANGSET); if (lang) { setenv("LANG", lang, 1); setenv("LC_MESSAGES", lang, 1); - char *r = setlocale(LC_ALL, ""); + r = setlocale(LC_ALL, ""); if (r == NULL) { r = setlocale(LC_ALL, lang); - if (r) _D("*****appcore setlocale=%s\n", r); - } free(lang); } else { @@ -70,8 +69,8 @@ void _update_region(void) setenv("LC_TELEPHONE", region, 1); setenv("LC_MEASUREMENT", region, 1); setenv("LC_IDENTIFICATION", region, 1); - r = setlocale(LC_ALL, ""); + r = setlocale(LC_ALL, ""); if (r != NULL) _D("*****appcore setlocale=%s\n", r); @@ -85,6 +84,7 @@ static int __set_i18n(const char *domain) { char *r; char dirname[PATH_MAX] = {0, }; + char *lang; if (domain == NULL) { errno = EINVAL; @@ -97,15 +97,13 @@ static int __set_i18n(const char *domain) r = setlocale(LC_ALL, ""); /* if locale is not set properly, try again to set as language base */ if (r == NULL) { - char *lang = vconf_get_str(VCONFKEY_LANGSET); + lang = vconf_get_str(VCONFKEY_LANGSET); r = setlocale(LC_ALL, lang); - if (r) _D("*****appcore setlocale=%s\n", r); if (lang) free(lang); - } if (r == NULL) _E("appcore: setlocale() error"); diff --git a/src/widget-log.h b/src/widget-log.h index e8eb56d..980f3e3 100755 --- a/src/widget-log.h +++ b/src/widget-log.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -45,37 +45,39 @@ #define _W(...) LOGW(__VA_ARGS__) #endif -#define _warn_if(expr, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - } \ - } while (0) - -#define _ret_if(expr) do { \ - if (expr) { \ - return; \ - } \ - } while (0) - -#define _retv_if(expr, val) do { \ - if (expr) { \ - return (val); \ - } \ - } while (0) - -#define _retm_if(expr, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - return; \ - } \ - } while (0) - -#define _retvm_if(expr, val, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - return (val); \ - } \ - } while (0) - - -#endif //__APPFW_WIDGET_LOG_H_ +#define _warn_if(expr, fmt, arg...) \ + do { \ + if (expr) \ + _ERR(fmt, ##arg); \ + } while (0) + +#define _ret_if(expr) \ + do { \ + if (expr) \ + return; \ + } while (0) + +#define _retv_if(expr, val) \ + do { \ + if (expr) \ + return (val); \ + } while (0) + +#define _retm_if(expr, fmt, arg...) \ + do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return; \ + } \ + } while (0) + +#define _retvm_if(expr, val, fmt, arg...) \ + do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return (val); \ + } \ + } while (0) + +#endif /* __APPFW_WIDGET_LOG_H_ */ + diff --git a/src/widget-private.h b/src/widget-private.h index 662b734..ef6d32c 100644 --- a/src/widget-private.h +++ b/src/widget-private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -24,10 +24,11 @@ #define FEATURE_SHELL_APPWIDGET "http://tizen.org/feature/shell.appwidget" - int _set_i18n(const char *domainname); void _update_lang(void); void _update_region(void); -int widget_app_error(widget_error_e error, const char* function, const char *description); +int widget_app_error(widget_error_e error, const char *function, + const char *description); #endif /* __APPCORE_WIDGET_PRIVATE_H__ */ + diff --git a/src/widget_app.c b/src/widget_app.c index f515704..82f1f89 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -117,14 +117,14 @@ static inline bool _is_widget_feature_enabled(void) static gint __comp_by_id(gconstpointer a, gconstpointer b) { - widget_context_s *wc = (widget_context_s*)a; + widget_context_s *wc = (widget_context_s *)a; - return strcmp(wc->id, (const char*)b); + return strcmp(wc->id, (const char *)b); } -static widget_context_s* __find_context_by_id(const char *id) +static widget_context_s *__find_context_by_id(const char *id) { - GList* ret = g_list_find_custom(contexts, id, __comp_by_id); + GList *ret = g_list_find_custom(contexts, id, __comp_by_id); if (ret == NULL) return NULL; @@ -183,21 +183,25 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) contexts = g_list_append(contexts, wc); handle->ops.create(wc, b, w, h, handle->user_data); - ret = __send_update_status(handle->classid, wc->id, WIDGET_INSTANCE_EVENT_CREATE, b, 0); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_CREATE, b, 0); return ret; } -static int __instance_destroy(widget_class_h handle, const char *id, widget_destroy_type_e reason, bundle *b) +static int __instance_destroy(widget_class_h handle, const char *id, + widget_destroy_type_e reason, bundle *b) { widget_context_s *wc = __find_context_by_id(id); int ret = 0; if (wc) { wc->state = WC_TERMINATED; - handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, handle->user_data); + handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, + handle->user_data); - ret = __send_update_status(handle->classid, id, WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); + ret = __send_update_status(handle->classid, id, + WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); contexts = g_list_remove(contexts, wc); @@ -212,7 +216,8 @@ static int __instance_destroy(widget_class_h handle, const char *id, widget_dest return ret; } -static widget_class_h __find_class_handler(const char *class_id, widget_class_h handle) +static widget_class_h __find_class_handler(const char *class_id, + widget_class_h handle) { if (!class_id || !handle) return NULL; @@ -267,7 +272,8 @@ static void __control(bundle *b) } else if (strcmp(operation, "destroy") == 0) { bundle_get_str(b, WIDGET_K_REASON, &reason); if (reason) - destroy_type = (int)g_ascii_strtoll(reason, &remain, 10); + destroy_type = (int)g_ascii_strtoll(reason, &remain, + 10); __instance_destroy(handle, id, destroy_type, b); } else if (strcmp(operation, "resume") == 0) { @@ -296,9 +302,10 @@ static int __aul_handler(aul_type type, bundle *b, void *data) case AUL_START: if (b) { bundle_get_str(b, WIDGET_K_CALLER, &caller); - if (caller) - caller_pid = g_ascii_strtoll(caller, &remain, 10); - else { + if (caller) { + caller_pid = g_ascii_strtoll(caller, &remain, + 10); + } else { /* using caller appid and query pid using caller appid? */ _E("no caller pid"); } @@ -359,14 +366,16 @@ static int __before_loop(int argc, char **argv) r = aul_launch_init(__aul_handler, NULL); if (r < 0) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call the aul_launch_init"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call the aul_launch_init"); } r = aul_launch_argv_handler(argc, argv); if (r < 0) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "Fail to call the aul_launch_argv_handler"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call the aul_launch_argv_handler"); } r = app_get_id(&appid); @@ -375,8 +384,8 @@ static int __before_loop(int argc, char **argv) class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, - "widget_class is NULL"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, "widget_class is NULL"); } return WIDGET_ERROR_NONE; @@ -394,7 +403,7 @@ static void __after_loop() } EXPORT_API int widget_app_main(int argc, char **argv, - widget_app_lifecycle_callback_s *callback, void *user_data) + widget_app_lifecycle_callback_s *callback, void *user_data) { int r; @@ -404,10 +413,14 @@ EXPORT_API int widget_app_main(int argc, char **argv, } if (argc <= 0 || argv == NULL || callback == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); if (callback->create == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, "widget_app_create_cb() callback must be registered"); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "widget_app_create_cb() callback must be " + "registered"); app_ops = callback; app_user_data = user_data; @@ -467,7 +480,8 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) } if (context == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); g_idle_add(__finish_event_cb, context); return WIDGET_ERROR_NONE; @@ -487,8 +501,8 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) } EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, - app_event_type_e event_type, app_event_cb callback, - void *user_data) + app_event_type_e event_type, app_event_cb callback, + void *user_data) { if (!_is_widget_feature_enabled()) { _E("not supported"); @@ -530,7 +544,7 @@ EXPORT_API int widget_app_remove_event_handler(app_event_handler_h return WIDGET_ERROR_NONE; } -EXPORT_API const char* widget_app_get_id(widget_context_h context) +EXPORT_API const char *widget_app_get_id(widget_context_h context) { if (!_is_widget_feature_enabled()) { _E("not supported"); @@ -549,7 +563,7 @@ EXPORT_API const char* widget_app_get_id(widget_context_h context) EXPORT_API int widget_app_get_elm_win(widget_context_h context, Evas_Object **win) { - widget_context_s *cxt = (widget_context_s*)context; + widget_context_s *cxt = (widget_context_s *)context; Evas_Object *ret_win; Ecore_Wl_Window *wl_win; @@ -559,7 +573,8 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, } if (context == NULL || win == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); ret_win = elm_win_add(NULL, cxt->id, ELM_WIN_BASIC); if (ret_win == NULL) { @@ -619,13 +634,16 @@ widget_class_h _widget_class_create(widget_class_s *prev, const char *class_id, return wc; } -EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, const char *class_id, +EXPORT_API widget_class_h widget_app_class_add(widget_class_h widget_class, + const char *class_id, widget_instance_lifecycle_callback_s callback, void *user_data) { - return _widget_class_create(widget_class, class_id, callback, user_data); + return _widget_class_create(widget_class, class_id, callback, + user_data); } -EXPORT_API widget_class_h widget_app_class_create(widget_instance_lifecycle_callback_s callback, void *user_data) +EXPORT_API widget_class_h widget_app_class_create( + widget_instance_lifecycle_callback_s callback, void *user_data) { return _widget_class_create(class_provider, appid, callback, user_data); } @@ -638,7 +656,8 @@ EXPORT_API int widget_app_context_set_tag(widget_context_h context, void *tag) } if (context == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); context->tag = tag; @@ -653,14 +672,16 @@ EXPORT_API int widget_app_context_get_tag(widget_context_h context, void **tag) } if (context == NULL || tag == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); *tag = context->tag; return WIDGET_ERROR_NONE; } -EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bundle *content_info) +EXPORT_API int widget_app_context_set_content_info(widget_context_h context, + bundle *content_info) { const char *class_id = NULL; int ret = 0; @@ -671,27 +692,33 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, bun } if (context == NULL || content_info == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); if (context->provider == NULL) - return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); class_id = context->provider->classid; if (class_id == NULL) return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); - ret = __send_update_status(class_id, context->id, WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); + ret = __send_update_status(class_id, context->id, + WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); if (ret < 0) { - _E("failed to send content info: %s of %s (%d)", context->id, class_id, ret); - return widget_app_error(WIDGET_ERROR_IO_ERROR, __FUNCTION__, NULL); + _E("failed to send content info: %s of %s (%d)", context->id, + class_id, ret); + return widget_app_error(WIDGET_ERROR_IO_ERROR, __FUNCTION__, + NULL); } return WIDGET_ERROR_NONE; } -EXPORT_API int widget_app_context_set_title(widget_context_h context, const char *title) +EXPORT_API int widget_app_context_set_title(widget_context_h context, + const char *title) { if (!_is_widget_feature_enabled()) { _E("not supported"); diff --git a/src/widget_error.c b/src/widget_error.c index 010adb0..b6a63cc 100755 --- a/src/widget_error.c +++ b/src/widget_error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. @@ -29,68 +29,56 @@ #define LOG_TAG "CAPI_WIDGET_APPLICATIO" -static const char* widget_app_error_to_string(widget_error_e error) +static const char *widget_app_error_to_string(widget_error_e error) { switch (error) { case WIDGET_ERROR_NONE: return "NONE"; - case WIDGET_ERROR_INVALID_PARAMETER: return "INVALID_PARAMETER"; - case WIDGET_ERROR_OUT_OF_MEMORY: return "OUT_OF_MEMORY"; - case WIDGET_ERROR_RESOURCE_BUSY: return "RESOURCE_BUSY"; - case WIDGET_ERROR_PERMISSION_DENIED: return "PERMISSION_DENIED"; - case WIDGET_ERROR_CANCELED: return "CANCELED"; - case WIDGET_ERROR_IO_ERROR: return "IO_ERROR"; - case WIDGET_ERROR_TIMED_OUT: return "TIMED_OUT"; - case WIDGET_ERROR_NOT_SUPPORTED: return "NOT_SUPPORTED"; - case WIDGET_ERROR_FILE_NO_SPACE_ON_DEVICE: return "FILE_NO_SPACE_ON_DEVICE"; - case WIDGET_ERROR_FAULT: return "FAULT"; - case WIDGET_ERROR_ALREADY_EXIST: return "ALREADY_EXIST"; - case WIDGET_ERROR_ALREADY_STARTED: return "ALREADY_STARTED"; - case WIDGET_ERROR_NOT_EXIST: return "NOT_EXIST"; - case WIDGET_ERROR_DISABLED: return "DISABLED"; - default: return "UNKNOWN"; } } -int widget_app_error(widget_error_e error, const char* function, - const char *description) +int widget_app_error(widget_error_e error, const char *function, + const char *description) { if (description) { - LOGE("[%s] %s(0x%08x) : %s", function, widget_app_error_to_string(error), error, - description); + LOGE("[%s] %s(0x%08x) : %s", function, + widget_app_error_to_string(error), error, + description); } else { - LOGE("[%s] %s(0x%08x)", function, widget_app_error_to_string(error), error); + LOGE("[%s] %s(0x%08x)", function, + widget_app_error_to_string(error), error); } return error; } + -- 2.7.4 From bf69959df3783f311c5ae27e05a9b7b1a0b54694 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 8 Apr 2016 18:00:03 +0900 Subject: [PATCH 10/16] Fix widget_app_destroy_type_e Change-Id: I77c1fb8a1e6db6138d08285ff9f1c97d87ffb582 --- include/widget_app.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/include/widget_app.h b/include/widget_app.h index 3c935cd..3b49868 100755 --- a/include/widget_app.h +++ b/include/widget_app.h @@ -38,13 +38,8 @@ extern "C" { * @since_tizen 2.3.1 */ typedef enum widget_app_destroy_type { - WIDGET_APP_DESTROY_TYPE_DEFAULT = 0x00, /**< Deleted */ - WIDGET_APP_DESTROY_TYPE_UPGRADE = 0x01, /**< Deleted for upgrading */ - WIDGET_APP_DESTROY_TYPE_UNINSTALL = 0x02, /**< Deleted by uninstalling */ - WIDGET_APP_DESTROY_TYPE_TERMINATE = 0x03, /**< Deleted for reboot device */ - WIDGET_APP_DESTROY_TYPE_FAULT = 0x04, /**< Deleted by system-fault */ - WIDGET_APP_DESTROY_TYPE_TEMPORARY = 0x05, /**< Temporarly deleted, will be created again */ - WIDGET_APP_DESTROY_TYPE_UNKNOWN = 0x06 /**< Undefined reason */ + WIDGET_APP_DESTROY_TYPE_PERMANENT = 0x00, /* User deleted this widget from the viewer */ + WIDGET_APP_DESTROY_TYPE_TEMPORARY = 0x01, /* Widget is deleted because of other reasons (e.g. widget process is terminated temporarily by the system) */ } widget_app_destroy_type_e; /**< Delete type */ /** @@ -83,7 +78,7 @@ typedef int (*widget_instance_create_cb)(widget_context_h context, bundle *conte * * @details The callback function is called before widget instance is destroyed. * In this callback, you can finalize resources for this instance. - * If reason is not #WIDGET_APP_DESTROY_TYPE_DEFAULT, It should store the current status by using incoming bundle. + * If reason is not #WIDGET_APP_DESTROY_TYPE_TEMPORARY, It should store the current status by using incoming bundle. * * @param[in] context The context of widget instance. * @param[in] reason The reason for destruction -- 2.7.4 From 0d73d4df19bbea7d7d71f055406b51673a409532 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Tue, 12 Apr 2016 13:53:50 +0900 Subject: [PATCH 11/16] Fix gettext error Change-Id: I0e78c041f2c79db7c0801f84452987e80c1734f5 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 82f1f89..d337d64 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -326,6 +326,28 @@ static int __aul_handler(aul_type type, bundle *b, void *data) return 0; } +static char *__get_domain_name(char *appid) +{ + char *name_token; + + if (appid == NULL) { + _E("appid is NULL"); + return NULL; + } + + name_token = strrchr(appid, '.'); + + if (name_token == NULL) { + _E("appid is invalid"); + return appid; + } + + name_token++; + + return name_token; +} + +extern int _set_i18n(const char *name); static int __before_loop(int argc, char **argv) { @@ -333,6 +355,7 @@ static int __before_loop(int argc, char **argv) bundle *kb = NULL; char *wayland_display = NULL; char *xdg_runtime_dir = NULL; + char *name; #if !(GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); @@ -382,6 +405,22 @@ static int __before_loop(int argc, char **argv) if (r != APP_ERROR_NONE) return r; + name = __get_domain_name(appid); + + if (name == NULL) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call __get_domain_name"); + } + + r = _set_i18n(name); + + if (r < 0) { + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, + __FUNCTION__, + "Fail to call _set_i18n"); + } + class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, -- 2.7.4 From ed46e42fcfe01b3d38459e06c6bf572848666495 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 18 Apr 2016 17:46:46 +0900 Subject: [PATCH 12/16] Fix the widget_app_get_id() - Set the result Change-Id: I10a03805e042ad3ebce8780329d8a4e519b15458 Signed-off-by: Hwankyu Jhun --- src/widget_app.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widget_app.c b/src/widget_app.c index d337d64..38cda3d 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -596,6 +596,7 @@ EXPORT_API const char *widget_app_get_id(widget_context_h context) return NULL; } + set_last_result(WIDGET_ERROR_NONE); return context->id; } -- 2.7.4 From 49cfed7131365b3b6a23594a619752a343cd027b Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Mon, 18 Apr 2016 18:13:07 +0900 Subject: [PATCH 13/16] implement widget_context_foreach, add window cb Change-Id: I112c0e502ae7906e8cf4614377b32f7f4ac5f231 Signed-off-by: Daehyeon Jung --- src/widget_app.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/widget_app.c b/src/widget_app.c index 38cda3d..96212dc 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -293,6 +293,41 @@ static void __show_all() LOGD("resume"); } +static Eina_Bool __show_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Show *ev = event; + LOGD("show %d %d", (unsigned int)ev->win, (unsigned int)ev->data[0]); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __hide_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Hide *ev = event; + LOGD("hide %d", (unsigned int)ev->win); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __visibility_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Visibility_Change *ev = event; + LOGD("visiblity change: %d %d", (unsigned int)ev->win, (unsigned int)ev->fully_obscured); + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __lower_cb(void *data, int type, void *event) +{ + LOGD("lower"); + return ECORE_CALLBACK_RENEW; +} + +static void __add_climsg() +{ + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __show_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __hide_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __lower_cb, NULL); +} + static int __aul_handler(aul_type type, bundle *b, void *data) { char *caller = NULL; @@ -421,6 +456,8 @@ static int __before_loop(int argc, char **argv) "Fail to call _set_i18n"); } + __add_climsg(); + class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, @@ -528,6 +565,9 @@ EXPORT_API int widget_app_terminate_context(widget_context_h context) EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) { + GList *list; + widget_context_s *wc; + if (!_is_widget_feature_enabled()) { _E("not supported"); return WIDGET_ERROR_NOT_SUPPORTED; @@ -536,6 +576,17 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) if (!cb) return WIDGET_ERROR_INVALID_PARAMETER; + list = g_list_first(contexts); + + while (list) { + wc = (widget_context_s *)list->data; + if (wc) { + if (!cb(wc, data)) + break; + } + list = list->next; + } + return WIDGET_ERROR_NONE; } -- 2.7.4 From 782ef2dfa646d2673132cc73bfaefb5a8c6c4f3d Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Wed, 27 Apr 2016 17:02:48 +0900 Subject: [PATCH 14/16] fix set title Change-Id: I52191e195fb9ec316a0208ff1045008a7481a9bd --- src/widget_app.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index 96212dc..50be7da 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -816,13 +816,12 @@ EXPORT_API int widget_app_context_set_title(widget_context_h context, return WIDGET_ERROR_NOT_SUPPORTED; } - /* TODO - call elm_win_title_set() - */ - if (!context || !title) return WIDGET_ERROR_INVALID_PARAMETER; + if (context->win) + elm_win_title_set(context->win, title); + return WIDGET_ERROR_NONE; } -- 2.7.4 From 16315dfb6b7cc68bc75a6e0c6bfb425620cc10b2 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Tue, 10 May 2016 15:37:17 +0900 Subject: [PATCH 15/16] Implements system and lifecycle events - Status updates only supports partial events, and will be fixed later - App common event handler are adopted from 2.x implementation - Lifecycle handler are not yet completed Change-Id: I5b9956cf26b7cf516c943227a4fda1d36cfc2f09 Signed-off-by: Daehyeon Jung --- CMakeLists.txt | 1 + packaging/appcore-widget.spec | 1 + src/widget_app.c | 579 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 539 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d57515e..652d965 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ pkg_check_modules(pkg_widget REQUIRED aul dlog capi-appfw-app-control + appcore-common capi-appfw-app-common vconf elementary diff --git a/packaging/appcore-widget.spec b/packaging/appcore-widget.spec index 1fbbb9f..71da10d 100644 --- a/packaging/appcore-widget.spec +++ b/packaging/appcore-widget.spec @@ -13,6 +13,7 @@ BuildRequires: pkgconfig(vconf) BuildRequires: pkgconfig(vconf-internal-keys) BuildRequires: pkgconfig(alarm-service) BuildRequires: pkgconfig(capi-appfw-app-control) +BuildRequires: pkgconfig(appcore-common) BuildRequires: pkgconfig(capi-appfw-app-common) BuildRequires: pkgconfig(widget_service) BuildRequires: pkgconfig(capi-system-info) diff --git a/src/widget_app.c b/src/widget_app.c index 50be7da..491ca1c 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -29,10 +29,13 @@ #include #include #include +#include #include #include #include #include +#include +#include #include "widget_app.h" #include "widget-log.h" @@ -54,6 +57,14 @@ typedef enum _widget_obj_state_e { WC_TERMINATED = 3 } widget_obj_state_e; +struct _widget_class { + void *user_data; + widget_instance_lifecycle_callback_s ops; + char *classid; + struct _widget_class *next; + struct _widget_class *prev; +}; + struct app_event_handler { app_event_type_e type; app_event_cb cb; @@ -65,20 +76,13 @@ struct app_event_info { void *value; }; -struct _widget_class { - void *user_data; - widget_instance_lifecycle_callback_s ops; - char *classid; - struct _widget_class *next; - struct _widget_class *prev; -}; - struct _widget_context { char *id; struct _widget_class *provider; int state; void *tag; Evas_Object *win; + int win_id; bundle *content; widget_instance_lifecycle_callback_s ops; }; @@ -86,6 +90,9 @@ struct _widget_context { typedef struct _widget_class widget_class_s; typedef struct _widget_context widget_context_s; +#define WIDGET_APP_EVENT_MAX 5 +static GList *handler_list[WIDGET_APP_EVENT_MAX] = {NULL, }; + static int caller_pid = 0; static widget_app_lifecycle_callback_s *app_ops; static void *app_user_data = NULL; @@ -94,6 +101,25 @@ static widget_class_h class_provider = NULL; static GList *contexts = NULL; static char *viewer_endpoint = NULL; +static void _widget_core_set_appcore_event_cb(void); +static void _widget_core_unset_appcore_event_cb(void); + +static void __free_handler_cb(gpointer data) +{ + if (data) + free(data); +} + +static void __free_handler_list(void) +{ + int i; + + for (i = 0; i < WIDGET_APP_EVENT_MAX; i++) { + g_list_free_full(handler_list[i], __free_handler_cb); + handler_list[i] = NULL; + } +} + static inline bool _is_widget_feature_enabled(void) { static bool feature = false; @@ -132,10 +158,54 @@ static widget_context_s *__find_context_by_id(const char *id) return ret->data; } +static gint __comp_by_win(gconstpointer a, gconstpointer b) +{ + int win = GPOINTER_TO_INT(b); + widget_context_s *wc = (widget_context_s *)a; + + return (wc && wc->win_id == win) ? 0 : -1; +} + +static widget_context_s *__find_context_by_win(int win) +{ + GList *ret = g_list_find_custom(contexts, GINT_TO_POINTER(win), __comp_by_win); + + if (ret == NULL) + return NULL; + + return ret->data; +} + +static int __send_lifecycle_event(const char *class_id, const char *instance_id, + int status) +{ + bundle *b = bundle_create(); + int ret; + + if (b == NULL) { + _E("out of memory"); + return -1; + } + + bundle_add_str(b, WIDGET_K_ID, class_id); + bundle_add_str(b, WIDGET_K_INSTANCE, instance_id); + bundle_add_byte(b, WIDGET_K_STATUS, &status, sizeof(int)); + + _D("send lifecycle %s(%d)", instance_id, status); + ret = aul_app_com_send("widget.status", b); + if (ret < 0) + _E("send lifecycle error:%d", ret); + + bundle_free(b); + + return ret; +} + static int __send_update_status(const char *class_id, const char *instance_id, int status, bundle *extra, int internal_only) { bundle *b = extra; + int lifecycle = -1; if (b == NULL) b = bundle_create(); @@ -144,15 +214,142 @@ static int __send_update_status(const char *class_id, const char *instance_id, bundle_add_str(b, WIDGET_K_INSTANCE, instance_id); bundle_add_byte(b, WIDGET_K_STATUS, &status, sizeof(int)); - _E("send update %s(%d) to %s", instance_id, status, viewer_endpoint); + _D("send update %s(%d) to %s", instance_id, status, viewer_endpoint); aul_app_com_send(viewer_endpoint, b); + switch (status) { + case WIDGET_INSTANCE_EVENT_CREATE: + lifecycle = WIDGET_LIFE_CYCLE_EVENT_CREATE; + break; + case WIDGET_INSTANCE_EVENT_DESTROY: + lifecycle = WIDGET_LIFE_CYCLE_EVENT_DESTROY; + break; + case WIDGET_INSTANCE_EVENT_PAUSE: + lifecycle = WIDGET_LIFE_CYCLE_EVENT_PAUSE; + break; + case WIDGET_INSTANCE_EVENT_RESUME: + lifecycle = WIDGET_LIFE_CYCLE_EVENT_RESUME; + break; + } + + if (lifecycle > -1) + __send_lifecycle_event(class_id, instance_id, lifecycle); + if (extra == NULL) bundle_free(b); return 0; } +static int __instance_resume(widget_class_h handle, const char *id, bundle *b) +{ + widget_context_s *wc = __find_context_by_id(id); + int ret; + + if (wc) { + if (handle->ops.resume) + handle->ops.resume(wc, handle->user_data); + + wc->state = WC_RUNNING; + _D("%s is resumed", id); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_RESUME, NULL, 0); + } else { + _E("context not found: %s", id); + ret = -1; + } + + return ret; +} + +static int __instance_pause(widget_class_h handle, const char *id, bundle *b) +{ + widget_context_s *wc = __find_context_by_id(id); + int ret; + + if (wc) { + if (handle->ops.pause) + handle->ops.pause(wc, handle->user_data); + + wc->state = WC_PAUSED; + _D("%s is paused", id); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_PAUSE, NULL, 0); + } else { + _E("context not found: %s", id); + ret = -1; + } + + return ret; +} + +static int __instance_resize(widget_class_h handle, const char *id, bundle *b) +{ + widget_context_s *wc = __find_context_by_id(id); + int ret; + int w; + int h; + char *w_str = NULL; + char *h_str = NULL; + char *remain = NULL; + + if (wc) { + bundle_get_str(b, WIDGET_K_WIDTH, &w_str); + bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); + + if (w_str) + w = (int)g_ascii_strtoll(w_str, &remain, 10); + else + w = -1; + + if (h_str) + h = (int)g_ascii_strtoll(h_str, &remain, 10); + else + h = -1; + + if (handle->ops.resize) + handle->ops.resize(wc, w, h, handle->user_data); + _D("%s is resized to %dx%d", id, w, h); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_SIZE_CHANGED, NULL, 0); + } else { + _E("context not found: %s", id); + ret = -1; + } + + return ret; +} + +static int __instance_update(widget_class_h handle, const char *id, bundle *b) +{ + widget_context_s *wc = __find_context_by_id(id); + int ret; + int force; + char *force_str = NULL; + + if (!wc) { + _E("context not found: %s", id); + return -1; + } + + if (handle->ops.update) { + if (b) + bundle_get_str(b, WIDGET_K_FORCE, &force_str); + + if (force_str && strcmp(force_str, "true") == 0) + force = 1; + else + force = 0; + + handle->ops.update(wc, b, force, handle->user_data); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_UPDATE, b, 0); + _D("updated:%s", id); + } + + return ret; +} + static int __instance_create(widget_class_h handle, const char *id, bundle *b) { widget_context_s *wc = NULL; @@ -169,6 +366,7 @@ static int __instance_create(widget_class_h handle, const char *id, bundle *b) wc->id = g_strdup(id); wc->provider = handle; wc->win = NULL; + wc->win_id = -1; wc->content = bundle_dup(b); bundle_get_str(b, WIDGET_K_WIDTH, &w_str); @@ -266,9 +464,9 @@ static void __control(bundle *b) if (strcmp(operation, "create") == 0) { __instance_create(handle, id, b); } else if (strcmp(operation, "resize") == 0) { - /* TODO */ + __instance_resize(handle, id, b); } else if (strcmp(operation, "update") == 0) { - /* TODO */ + __instance_update(handle, id, b); } else if (strcmp(operation, "destroy") == 0) { bundle_get_str(b, WIDGET_K_REASON, &reason); if (reason) @@ -277,9 +475,9 @@ static void __control(bundle *b) __instance_destroy(handle, id, destroy_type, b); } else if (strcmp(operation, "resume") == 0) { - /* TODO */ + __instance_resume(handle, id, b); } else if (strcmp(operation, "pause") == 0) { - /* TODO */ + __instance_pause(handle, id, b); } return; @@ -288,22 +486,96 @@ error: return; } -static void __show_all() +static void __resume_cb(const char *id, void *data) { - LOGD("resume"); + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) + __instance_resume(cxt->provider, id, NULL); + else + _E("invalid context id:%s", id); + +} + +static void __pause_cb(const char *id, void *data) +{ + widget_context_s *cxt = __find_context_by_id(id); + + if (cxt) + __instance_pause(cxt->provider, id, NULL); + else + _E("invalid context id:%s", id); +} + +static void __pause_all() +{ + GList *iter = g_list_first(contexts); + + while (iter != NULL) { + widget_context_s *cxt = (widget_context_s *)iter->data; + const char *id = cxt->id; + + switch (cxt->state) { + case WC_READY: + __resume_cb(id, NULL); + __pause_cb(id, NULL); + break; + case WC_RUNNING: + __pause_cb(id, NULL); + break; + } + iter = g_list_next(iter); + } +} + +static void __resume_all() +{ + GList *iter = g_list_first(contexts); + + while (iter != NULL) { + widget_context_s *cxt = (widget_context_s *)iter->data; + const char *id = cxt->id; + + switch (cxt->state) { + case WC_READY: + __resume_cb(id, NULL); + break; + case WC_PAUSED: + __resume_cb(id, NULL); + break; + } + iter = g_list_next(iter); + } } static Eina_Bool __show_cb(void *data, int type, void *event) { Ecore_Wl_Event_Window_Show *ev = event; + widget_context_s *cxt = __find_context_by_win(ev->win); + LOGD("show %d %d", (unsigned int)ev->win, (unsigned int)ev->data[0]); + + if (cxt) + __instance_resume(cxt->provider, cxt->id, NULL); + else + LOGE("unknown window error: %d", ev->win); + return ECORE_CALLBACK_RENEW; } static Eina_Bool __hide_cb(void *data, int type, void *event) { Ecore_Wl_Event_Window_Hide *ev = event; + widget_context_s *cxt = __find_context_by_win(ev->win); + + LOGD("hide %d", (unsigned int)ev->win); + + if (cxt) + __instance_pause(cxt->provider, cxt->id, NULL); + else + LOGE("unknown window error: %d", ev->win); + return ECORE_CALLBACK_RENEW; } @@ -311,6 +583,7 @@ static Eina_Bool __visibility_cb(void *data, int type, void *event) { Ecore_Wl_Event_Window_Visibility_Change *ev = event; LOGD("visiblity change: %d %d", (unsigned int)ev->win, (unsigned int)ev->fully_obscured); + /* this is not working so far*/ return ECORE_CALLBACK_RENEW; } @@ -349,7 +622,7 @@ static int __aul_handler(aul_type type, bundle *b, void *data) __control(b); break; case AUL_RESUME: - __show_all(); + __resume_all(); break; case AUL_TERMINATE: widget_app_exit(); @@ -382,6 +655,25 @@ static char *__get_domain_name(char *appid) return name_token; } +static void __on_poweroff(keynode_t *key, void *data) +{ + int val; + + val = vconf_keynode_get_int(key); + switch (val) { + case VCONFKEY_SYSMAN_POWER_OFF_DIRECT: + case VCONFKEY_SYSMAN_POWER_OFF_RESTART: + _I("power off changed: %d", val); + widget_app_exit(); + break; + case VCONFKEY_SYSMAN_POWER_OFF_NONE: + case VCONFKEY_SYSMAN_POWER_OFF_POPUP: + default: + /* DO NOTHING */ + break; + } +} + extern int _set_i18n(const char *name); static int __before_loop(int argc, char **argv) @@ -458,26 +750,186 @@ static int __before_loop(int argc, char **argv) __add_climsg(); + _widget_core_set_appcore_event_cb(); + class_provider = app_ops->create(app_user_data); if (class_provider == NULL) { return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, "widget_class is NULL"); } + vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, __on_poweroff, NULL); + return WIDGET_ERROR_NONE; } static void __after_loop() { + vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, __on_poweroff); + + __pause_all(); + if (app_ops->terminate) app_ops->terminate(app_user_data); if (viewer_endpoint) free(viewer_endpoint); + _widget_core_unset_appcore_event_cb(); + __free_handler_list(); elm_shutdown(); } +static void __on_low_memory(keynode_t *key, void *data) +{ + int val; + + val = vconf_keynode_get_int(key); + if (val == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) { + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_low_memory"); + + event.type = APP_EVENT_LOW_MEMORY; + event.value = (void *)&val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LOW_MEMORY]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } + } +} + +static void __on_low_battery(keynode_t *key, void *data) +{ + int val; + + val = vconf_keynode_get_int(key); + if (val <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) { + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_low_battery"); + + event.type = APP_EVENT_LOW_BATTERY; + event.value = (void *)&val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LOW_BATTERY]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } + } +} + +static void __on_lang_changed(keynode_t *key, void *data) +{ + char *val; + + _update_lang(); + val = vconf_keynode_get_str(key); + + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_lang_changed"); + + event.type = APP_EVENT_LANGUAGE_CHANGED; + event.value = (void *)val; + + GList *iter = g_list_first(handler_list[APP_EVENT_LANGUAGE_CHANGED]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } +} + +static void __on_region_changed(keynode_t *key, void *data) +{ + char *val; + + _update_region(); + val = vconf_keynode_get_str(key); + + app_event_handler_h handler; + struct app_event_info event; + + _I("widget_app_region_changed"); + + event.type = APP_EVENT_REGION_FORMAT_CHANGED; + event.value = (void *)val; + + GList *iter = g_list_first(handler_list[APP_EVENT_REGION_FORMAT_CHANGED]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + handler->cb(&event, handler->data); + iter = g_list_next(iter); + } +} + +static void __register_event(int event_type) +{ + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory, NULL); + break; + + case APP_EVENT_LOW_BATTERY: + vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, NULL); + break; + + case APP_EVENT_LANGUAGE_CHANGED: + vconf_notify_key_changed(VCONFKEY_LANGSET, __on_lang_changed, NULL); + break; + + case APP_EVENT_REGION_FORMAT_CHANGED: + vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed, NULL); + break; + } +} + +static void __unregister_event(int event_type) +{ + switch (event_type) { + case APP_EVENT_LOW_MEMORY: + vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory); + break; + + case APP_EVENT_LOW_BATTERY: + vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery); + break; + + case APP_EVENT_LANGUAGE_CHANGED: + vconf_ignore_key_changed(VCONFKEY_LANGSET, __on_lang_changed); + break; + + case APP_EVENT_REGION_FORMAT_CHANGED: + vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __on_region_changed); + break; + } +} + +static void _widget_core_set_appcore_event_cb(void) +{ + __register_event(APP_EVENT_LANGUAGE_CHANGED); + __register_event(APP_EVENT_REGION_FORMAT_CHANGED); +} + +static void _widget_core_unset_appcore_event_cb(void) +{ + __unregister_event(APP_EVENT_LANGUAGE_CHANGED); + __unregister_event(APP_EVENT_REGION_FORMAT_CHANGED); +} + EXPORT_API int widget_app_main(int argc, char **argv, widget_app_lifecycle_callback_s *callback, void *user_data) { @@ -544,7 +996,6 @@ static gboolean __finish_event_cb(gpointer user_data) break; } - return FALSE; } @@ -591,45 +1042,86 @@ EXPORT_API int widget_app_foreach_context(widget_context_cb cb, void *data) } EXPORT_API int widget_app_add_event_handler(app_event_handler_h *event_handler, - app_event_type_e event_type, app_event_cb callback, - void *user_data) + app_event_type_e event_type, app_event_cb callback, + void *user_data) { - if (!_is_widget_feature_enabled()) { - _E("not supported"); + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) return WIDGET_ERROR_NOT_SUPPORTED; - } - /* TODO */ - if (!event_handler || !callback) - return WIDGET_ERROR_INVALID_PARAMETER; + app_event_handler_h handler; - switch (event_type) { - case APP_EVENT_LOW_MEMORY: - case APP_EVENT_LOW_BATTERY: - case APP_EVENT_LANGUAGE_CHANGED: - case APP_EVENT_DEVICE_ORIENTATION_CHANGED: - case APP_EVENT_REGION_FORMAT_CHANGED: - case APP_EVENT_SUSPENDED_STATE_CHANGED: + if (event_handler == NULL || callback == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - break; - default: - return WIDGET_ERROR_INVALID_PARAMETER; + if (event_type < APP_EVENT_LOW_MEMORY + || event_type > APP_EVENT_REGION_FORMAT_CHANGED) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + if (event_type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) + return widget_app_error(WIDGET_ERROR_NOT_SUPPORTED, __FUNCTION__, NULL); + + GList *iter = g_list_first(handler_list[event_type]); + + while (iter) { + handler = (app_event_handler_h) iter->data; + + if (handler->cb == callback) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + iter = g_list_next(iter); } + handler = calloc(1, sizeof(struct app_event_handler)); + if (!handler) + return widget_app_error(WIDGET_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + + if (g_list_length(handler_list[event_type]) == 0) + __register_event(event_type); + + handler->type = event_type; + handler->cb = callback; + handler->data = user_data; + handler_list[event_type] = g_list_append(handler_list[event_type], handler); + + *event_handler = handler; + return WIDGET_ERROR_NONE; } EXPORT_API int widget_app_remove_event_handler(app_event_handler_h event_handler) { - if (!_is_widget_feature_enabled()) { - _E("not supported"); + int r; + bool feature; + + r = system_info_get_platform_bool(FEATURE_SHELL_APPWIDGET, &feature); + if (r < 0) + return WIDGET_ERROR_FAULT; + + if (!feature) return WIDGET_ERROR_NOT_SUPPORTED; - } - /* TODO */ - if (!event_handler) - return WIDGET_ERROR_INVALID_PARAMETER; + app_event_type_e type; + + if (event_handler == NULL) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + type = event_handler->type; + if (type < APP_EVENT_LOW_MEMORY || type > APP_EVENT_REGION_FORMAT_CHANGED) + return widget_app_error(WIDGET_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + + handler_list[type] = g_list_remove(handler_list[type], event_handler); + free(event_handler); + + if (g_list_length(handler_list[type]) == 0) + __unregister_event(type); return WIDGET_ERROR_NONE; } @@ -684,6 +1176,9 @@ EXPORT_API int widget_app_get_elm_win(widget_context_h context, *win = ret_win; cxt->win = ret_win; + cxt->win_id = ecore_wl_window_id_get(wl_win); + + _D("window created: %d", cxt->win_id); return WIDGET_ERROR_NONE; } @@ -796,7 +1291,7 @@ EXPORT_API int widget_app_context_set_content_info(widget_context_h context, return widget_app_error(WIDGET_ERROR_FAULT, __FUNCTION__, NULL); ret = __send_update_status(class_id, context->id, - WIDGET_INSTANCE_EVENT_UPDATE, content_info, true); + WIDGET_INSTANCE_EVENT_EXTRA_UPDATED, content_info, true); if (ret < 0) { _E("failed to send content info: %s of %s (%d)", context->id, -- 2.7.4 From 52c08435887de74da64c77caee7adad0b67cf54a Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 20 May 2016 21:21:59 +0900 Subject: [PATCH 16/16] Implement window event callback Change-Id: I3792b4762b14ec655943d44d7d06291fc7a65e1d Signed-off-by: Daehyeon Jung --- src/widget_app.c | 216 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 147 insertions(+), 69 deletions(-) diff --git a/src/widget_app.c b/src/widget_app.c index 491ca1c..c8e3764 100755 --- a/src/widget_app.c +++ b/src/widget_app.c @@ -246,19 +246,29 @@ static int __instance_resume(widget_class_h handle, const char *id, bundle *b) widget_context_s *wc = __find_context_by_id(id); int ret; - if (wc) { - if (handle->ops.resume) - handle->ops.resume(wc, handle->user_data); - - wc->state = WC_RUNNING; - _D("%s is resumed", id); - ret = __send_update_status(handle->classid, wc->id, - WIDGET_INSTANCE_EVENT_RESUME, NULL, 0); - } else { + if (!wc) { _E("context not found: %s", id); - ret = -1; + return -1; + } + + if (wc->state == WC_RUNNING) { + _D("%s is already in running state", id); + return 0; } + if (wc->state == WC_TERMINATED) { + _D("%s is in terminated state", id); + return 0; + } + + if (handle->ops.resume) + handle->ops.resume(wc, handle->user_data); + + wc->state = WC_RUNNING; + _D("%s is resumed", id); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_RESUME, NULL, 0); + return ret; } @@ -267,56 +277,49 @@ static int __instance_pause(widget_class_h handle, const char *id, bundle *b) widget_context_s *wc = __find_context_by_id(id); int ret; - if (wc) { - if (handle->ops.pause) - handle->ops.pause(wc, handle->user_data); - - wc->state = WC_PAUSED; - _D("%s is paused", id); - ret = __send_update_status(handle->classid, wc->id, - WIDGET_INSTANCE_EVENT_PAUSE, NULL, 0); - } else { + if (!wc) { _E("context not found: %s", id); - ret = -1; + return -1; } + if (wc->state == WC_PAUSED) { + _D("%s is already in paused state", id); + return 0; + } + + if (wc->state == WC_TERMINATED) { + _D("%s is in terminated state", id); + return 0; + } + + if (handle->ops.pause) + handle->ops.pause(wc, handle->user_data); + + wc->state = WC_PAUSED; + _D("%s is paused", id); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_PAUSE, NULL, 0); + return ret; } -static int __instance_resize(widget_class_h handle, const char *id, bundle *b) +static int __instance_resize(widget_class_h handle, const char *id, int w, int h, bundle *b) { widget_context_s *wc = __find_context_by_id(id); int ret; - int w; - int h; - char *w_str = NULL; - char *h_str = NULL; - char *remain = NULL; - - if (wc) { - bundle_get_str(b, WIDGET_K_WIDTH, &w_str); - bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); - if (w_str) - w = (int)g_ascii_strtoll(w_str, &remain, 10); - else - w = -1; - - if (h_str) - h = (int)g_ascii_strtoll(h_str, &remain, 10); - else - h = -1; - - if (handle->ops.resize) - handle->ops.resize(wc, w, h, handle->user_data); - _D("%s is resized to %dx%d", id, w, h); - ret = __send_update_status(handle->classid, wc->id, - WIDGET_INSTANCE_EVENT_SIZE_CHANGED, NULL, 0); - } else { + if (!wc) { _E("context not found: %s", id); - ret = -1; + return -1; } + if (handle->ops.resize) + handle->ops.resize(wc, w, h, handle->user_data); + + _D("%s is resized to %dx%d", id, w, h); + ret = __send_update_status(handle->classid, wc->id, + WIDGET_INSTANCE_EVENT_SIZE_CHANGED, NULL, 0); + return ret; } @@ -393,23 +396,24 @@ static int __instance_destroy(widget_class_h handle, const char *id, widget_context_s *wc = __find_context_by_id(id); int ret = 0; - if (wc) { - wc->state = WC_TERMINATED; - handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, - handle->user_data); + if (!wc) { + _E("could not find widget obj: %s", id); + return WIDGET_ERROR_INVALID_PARAMETER; + } - ret = __send_update_status(handle->classid, id, - WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); + wc->state = WC_TERMINATED; + handle->ops.destroy(wc, (widget_app_destroy_type_e)reason, b, + handle->user_data); - contexts = g_list_remove(contexts, wc); + ret = __send_update_status(handle->classid, id, + WIDGET_INSTANCE_EVENT_TERMINATE, b, 0); - if (wc->id) - free(wc->id); - free(wc); - } else { - _E("could not find widget obj: %s", id); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } + contexts = g_list_remove(contexts, wc); + + if (wc->id) + free(wc->id); + + free(wc); return ret; } @@ -432,6 +436,38 @@ static widget_class_h __find_class_handler(const char *class_id, return NULL; } +static void __resize_window(char *id, bundle *b) +{ + widget_context_s *wc = __find_context_by_id(id); + char *w_str = NULL; + char *h_str = NULL; + char *remain = NULL; + int w; + int h; + + bundle_get_str(b, WIDGET_K_WIDTH, &w_str); + bundle_get_str(b, WIDGET_K_HEIGHT, &h_str); + + if (w_str) { + w = (int)g_ascii_strtoll(w_str, &remain, 10); + } else { + _E("unable to get width"); + return; + } + + if (h_str) { + h = (int)g_ascii_strtoll(h_str, &remain, 10); + } else { + _E("unable to get height"); + return; + } + + if (wc->win) + evas_object_resize(wc->win, w, h); + else + _E("unable to find window of %d", wc->id); +} + static void __control(bundle *b) { char *class_id = NULL; @@ -464,7 +500,7 @@ static void __control(bundle *b) if (strcmp(operation, "create") == 0) { __instance_create(handle, id, b); } else if (strcmp(operation, "resize") == 0) { - __instance_resize(handle, id, b); + __resize_window(id, b); } else if (strcmp(operation, "update") == 0) { __instance_update(handle, id, b); } else if (strcmp(operation, "destroy") == 0) { @@ -490,21 +526,24 @@ static void __resume_cb(const char *id, void *data) { widget_context_s *cxt = __find_context_by_id(id); - if (cxt) - __instance_resume(cxt->provider, id, NULL); - else + if (!cxt) { _E("invalid context id:%s", id); + return; + } + __instance_resume(cxt->provider, id, NULL); } static void __pause_cb(const char *id, void *data) { widget_context_s *cxt = __find_context_by_id(id); - if (cxt) - __instance_pause(cxt->provider, id, NULL); - else + if (!cxt) { _E("invalid context id:%s", id); + return; + } + + __instance_pause(cxt->provider, id, NULL); } static void __pause_all() @@ -582,8 +621,23 @@ static Eina_Bool __hide_cb(void *data, int type, void *event) static Eina_Bool __visibility_cb(void *data, int type, void *event) { Ecore_Wl_Event_Window_Visibility_Change *ev = event; + widget_context_s *cxt = __find_context_by_win(ev->win); + LOGD("visiblity change: %d %d", (unsigned int)ev->win, (unsigned int)ev->fully_obscured); - /* this is not working so far*/ + + if (!cxt) { + LOGE("unknown window error: %d", ev->win); + return ECORE_CALLBACK_RENEW; + } + + if (cxt->state == WC_PAUSED && ev->fully_obscured == 0) { + __instance_resume(cxt->provider, cxt->id, NULL); + } else if (cxt->state == WC_RUNNING && ev->fully_obscured == 1) { + __instance_pause(cxt->provider, cxt->id, NULL); + } else { + LOGD("cxt:%s state:%d obscured:%d", cxt->id, cxt->state, ev->fully_obscured); + } + return ECORE_CALLBACK_RENEW; } @@ -593,12 +647,32 @@ static Eina_Bool __lower_cb(void *data, int type, void *event) return ECORE_CALLBACK_RENEW; } +static Eina_Bool __configure_cb(void *data, int type, void *event) +{ + Ecore_Wl_Event_Window_Configure *ev = event; + widget_context_s *cxt = __find_context_by_win(ev->win); + + LOGD("configure: %d %d", ev->w, ev->h); + + if (!cxt) { + LOGE("unknown window error: %d", ev->win); + return ECORE_CALLBACK_RENEW; + } + + if (cxt->state == WC_PAUSED || cxt->state == WC_RUNNING) + __instance_resize(cxt->provider, cxt->id, ev->w, ev->h, NULL); + LOGD("cxt:%s resized to %dx%d", cxt->id, ev->w, ev->h); + + return ECORE_CALLBACK_RENEW; +} + static void __add_climsg() { ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __show_cb, NULL); ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __hide_cb, NULL); ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __lower_cb, NULL); + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE, __configure_cb, NULL); } static int __aul_handler(aul_type type, bundle *b, void *data) @@ -703,9 +777,13 @@ static int __before_loop(int argc, char **argv) if (xdg_runtime_dir) setenv("XDG_RUNTIME_DIR", xdg_runtime_dir, 1); + _D("xdg_runtime_dir:%s", xdg_runtime_dir); + if (wayland_display) setenv("WAYLAND_DISPLAY", wayland_display, 1); + _D("wayland_display:%s", wayland_display); + bundle_free(kb); kb = NULL; } else { -- 2.7.4