From: hyunho Date: Fri, 23 Nov 2018 07:22:32 +0000 (+0900) Subject: Launch widget instance sequentially X-Git-Tag: submit/tizen/20181128.070347~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a1d0656464eb095c880aa6454ad6b46cfb657bf;p=platform%2Fcore%2Fappfw%2Fwidget-viewer.git Launch widget instance sequentially Change-Id: Ib8c948fff0846122f59c3a974020bd626ba4af50 Signed-off-by: hyunho --- diff --git a/widget_viewer_evas/src/widget_viewer_evas.c b/widget_viewer_evas/src/widget_viewer_evas.c index 1a792800..a53b3a61 100644 --- a/widget_viewer_evas/src/widget_viewer_evas.c +++ b/widget_viewer_evas/src/widget_viewer_evas.c @@ -107,7 +107,7 @@ #define ERR_BUFFER_SIZE 1024 #define WIDGET_PRIVILEGE "http://tizen.org/privilege/widget.viewer" -#define WIDGET_RESTART_TIMEOUT 5000 +#define WIDGET_LAUNCH_TIMEOUT 5000 /*! * \note @@ -129,9 +129,9 @@ static struct info { Evas_Object *win; GHashTable *widget_table; GHashTable *instance_cnt_table; - GList *restart_list; - char *restarting_instance_id; - int restart_timer; + char *launching_instance_id; + GList *launch_list; + int launch_timer; } s_info = { .w = 0, .h = 0, @@ -139,9 +139,9 @@ static struct info { .win = NULL, .widget_table = NULL, .instance_cnt_table = NULL, - .restart_list = NULL, - .restarting_instance_id = NULL, - .restart_timer = 0 + .launching_instance_id = NULL, + .launch_list = NULL, + .launch_timer = 0 }; struct pending_item { @@ -180,11 +180,11 @@ static void __flush_event_queue(struct widget_info *info); static int __default_delayed_resuming_time = 100; static bool __is_delayed_resuming_mode; static void __destroy_widget_info(gpointer data); -static gboolean __restart_timeout_cb(gpointer user_data); -static int __find_restart_info(gconstpointer a, gconstpointer b); -static void __remove_restart_info(const char *instance_id); -static void __restart_instance(void); -static void __remove_restart_timer(void); +static gboolean __launch_timeout_cb(gpointer user_data); +static int __find_launch_info(gconstpointer a, gconstpointer b); +static void __remove_launch_info(const char *instance_id); +static void __launch_instance(void); +static void __remove_launch_timer(void); static void __destroy_pending_item(gpointer data) { @@ -326,30 +326,30 @@ static void __push_pending_queue(struct widget_info *info, LOGD("instance_id(%s), event(%s)", info->instance_id, item->event); } -static void __add_restart_list(const char *instance_id) +static void __add_launch_list(const char *instance_id) { GList *list; - char *restart_instance_id; + char *dup_instance_id; if (!instance_id) { LOGE("Invalid parameter");/* LCOV_EXCL_LINE */ return;/* LCOV_EXCL_LINE */ } - list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info); + list = g_list_find_custom(s_info.launch_list, instance_id, __find_launch_info); if (list != NULL) { - LOGW("already in restart list(%s)", instance_id); + LOGW("already in launch list(%s)", instance_id); return; } - restart_instance_id = strdup(instance_id); - if (restart_instance_id == NULL) { + dup_instance_id = strdup(instance_id); + if (dup_instance_id == NULL) { LOGE("Out Of Memory"); return; } - s_info.restart_list = g_list_append(s_info.restart_list, restart_instance_id); - LOGW("add restart(%s)", instance_id); + s_info.launch_list = g_list_append(s_info.launch_list, dup_instance_id); + LOGW("add launch(%s)", dup_instance_id); } static inline bool __is_widget_feature_enabled(void) @@ -451,12 +451,11 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch LOGE("Wrong added info, appid(%s) info instance_id(%s), instance_id(%s)",/* LCOV_EXCL_LINE */ appid, info->instance_id, instance_id);/* LCOV_EXCL_LINE */ - if (s_info.restarting_instance_id && info->instance_id && - strcmp(s_info.restarting_instance_id, info->instance_id) == 0) { - __remove_restart_timer(); - __restart_instance(); + if (s_info.launching_instance_id && info->instance_id && + strcmp(s_info.launching_instance_id, info->instance_id) == 0) { + __remove_launch_timer(); + __launch_instance(); } - return;/* LCOV_EXCL_LINE */ } @@ -481,12 +480,11 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch elm_object_signal_emit(info->layout, "disable", "overlay,text"); info->state = WIDGET_STATE_ATTACHED; - - if (s_info.restarting_instance_id && - strcmp(s_info.restarting_instance_id, instance_id) == 0) { - __remove_restart_info(instance_id); - __remove_restart_timer(); - __restart_instance(); + if (s_info.launching_instance_id && + strcmp(s_info.launching_instance_id, instance_id) == 0) { + __remove_launch_info(instance_id); + __remove_launch_timer(); + __launch_instance(); } __flush_event_queue(info); /** @@ -605,7 +603,7 @@ static void __push_event_queue(struct widget_info *info, int event) g_queue_push_tail(info->event_queue, GINT_TO_POINTER(event)); } -static int __find_restart_info(gconstpointer a, gconstpointer b) +static int __find_launch_info(gconstpointer a, gconstpointer b) { if (a == NULL || b == NULL) return -1; @@ -616,45 +614,45 @@ static int __find_restart_info(gconstpointer a, gconstpointer b) return -1; } -static void __remove_restart_info(const char *instance_id) +static void __remove_launch_info(const char *instance_id) { GList *list; - char *restart_instance_id; + char *launch_instance_id; - list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info); + list = g_list_find_custom(s_info.launch_list, instance_id, __find_launch_info); if (list == NULL) return; - restart_instance_id = list->data; - s_info.restart_list = g_list_remove(s_info.restart_list, restart_instance_id); - free(restart_instance_id); + launch_instance_id = list->data; + s_info.launch_list = g_list_remove(s_info.launch_list, launch_instance_id); + free(launch_instance_id); } -static void __remove_restart_timer() +static void __remove_launch_timer() { - if (s_info.restart_timer <= 0) + if (s_info.launch_timer <= 0) return; - g_source_remove(s_info.restart_timer); - s_info.restart_timer = 0; + g_source_remove(s_info.launch_timer); + s_info.launch_timer = 0; } -static void __restart_instance() +static void __launch_instance() { struct widget_info *info; - char *restart_instance_id; + char *instance_id; int w, h; int ret; screen_connector_toolkit_evas_ops ops; - if (s_info.restart_list == NULL) { - s_info.restarting_instance_id = NULL; - s_info.restart_timer = 0; + if (s_info.launch_list == NULL) { + s_info.launch_timer = 0; + s_info.launching_instance_id = NULL; LOGW("null restart list"); return; } - restart_instance_id = s_info.restart_list->data; - info = g_hash_table_lookup(s_info.widget_table, restart_instance_id); + instance_id = s_info.launch_list->data; + info = g_hash_table_lookup(s_info.widget_table, instance_id); evas_object_geometry_get(info->layout, NULL, NULL, &w, &h); LOGD("Widget launch %s, %d, %d", info->instance_id, w, h); @@ -672,16 +670,32 @@ static void __restart_instance() SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, info); - ret = widget_instance_terminate(info->instance_id); - if (ret != 0) - LOGW("widget_instance_terminate failed: %d", ret); + if (info->restart) { + ret = widget_instance_terminate(info->instance_id); + if (ret != 0) + LOGW("widget_instance_terminate failed: %d", ret); + } info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h); info->restart = false; - s_info.restarting_instance_id = restart_instance_id; + if (info->pid < 0) { + /* LCOV_EXCL_START */ + struct widget_evas_event_info event_info; + LOGE("Failed to launch an widget"); + event_info.error = info->pid; + event_info.widget_app_id = info->widget_id; + event_info.event = WIDGET_EVENT_CREATED; - s_info.restart_timer = g_timeout_add(WIDGET_RESTART_TIMEOUT, - __restart_timeout_cb, restart_instance_id); + __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info); + __display_overlay_text(info); + __remove_launch_info(info->instance_id); + __launch_instance(); + /* LCOV_EXCL_STOP */ + } else { + s_info.launching_instance_id = info->instance_id; + s_info.launch_timer = g_timeout_add(WIDGET_LAUNCH_TIMEOUT, + __launch_timeout_cb, info->instance_id); + } } /* LCOV_EXCL_START */ @@ -713,23 +727,23 @@ static int __restart_terminated_widget(const char *widget_id) if (widget_instance_info->restart && widget_instance_info->pid == target_pid && (strcmp(widget_instance_info->widget_id, widget_id) == 0)) { - __add_restart_list(widget_instance_info->instance_id); + __add_launch_list(widget_instance_info->instance_id); } } - if (s_info.restart_timer == 0) - __restart_instance(); + if (s_info.launch_timer == 0) + __launch_instance(); return 0; } /* LCOV_EXCL_STOP */ -static gboolean __restart_timeout_cb(gpointer user_data) +static gboolean __launch_timeout_cb(gpointer user_data) { - char *restart_instance_id = (char *)user_data; + char *instance_id = (char *)user_data; - LOGW("Timeout called !! %s", restart_instance_id); - __remove_restart_info(restart_instance_id); - __restart_instance(); + LOGW("Timeout called !! %s", instance_id); + __remove_launch_info(instance_id); + __launch_instance(); return G_SOURCE_REMOVE; } @@ -1167,7 +1181,7 @@ static void __del_cb(void *data, Evas *e, Evas_Object *layout, void *event_info) g_hash_table_remove(s_info.instance_cnt_table, widget_id); } } - __remove_restart_info(instance_id); + __remove_launch_info(instance_id); free(widget_id); free(instance_id); @@ -1177,7 +1191,6 @@ static void __resize_cb(void *data, Evas *e, Evas_Object *layout, void *event_in { struct widget_info *info = data; int x, y, w, h; - screen_connector_toolkit_evas_ops ops; struct pending_item *item; evas_object_geometry_get(layout, &x, &y, &w, &h); @@ -1192,33 +1205,9 @@ static void __resize_cb(void *data, Evas *e, Evas_Object *layout, void *event_in if (!info->disable_loading) elm_object_part_text_set(layout, "text", T_("IDS_ST_POP_LOADING_ING")); - ops.added_cb = __screen_connector_toolkit_evas_added_cb; - ops.removed_cb = __screen_connector_toolkit_evas_removed_cb; - ops.updated_cb = __screen_connector_toolkit_evas_updated_cb; - - if (info->toolkit_h) { - screen_connector_toolkit_evas_remove(info->toolkit_h); - info->toolkit_h = NULL; - } - - info->toolkit_h = screen_connector_toolkit_evas_add(&ops, info->instance_id, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, info); - - LOGW("launch a widget instance: %s", info->instance_id); - info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h); - if (info->pid < 0) { - /* LCOV_EXCL_START */ - struct widget_evas_event_info event_info; - LOGE("Failed to launch an widget"); - event_info.error = info->pid; - event_info.widget_app_id = info->widget_id; - event_info.event = WIDGET_EVENT_CREATED; - - __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info); - __display_overlay_text(info); - - return; - /* LCOV_EXCL_STOP */ - } + __add_launch_list(info->instance_id); + if (s_info.launch_timer == 0) + __launch_instance(); } else { /** * @note @@ -2006,7 +1995,8 @@ API void widget_viewer_evas_disable_loading(Evas_Object *widget) API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget) { struct widget_info *info; - screen_connector_toolkit_evas_ops ops; + int w; + int h; if (!__is_widget_feature_enabled()) { set_last_result(WIDGET_ERROR_NOT_SUPPORTED);/* LCOV_EXCL_LINE */ @@ -2041,13 +2031,7 @@ API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget) aul_widget_write_log(LOG_TAG, "[%s:%d] %s pid : %d", __FUNCTION__, __LINE__, info->instance_id, info->pid); if (info->pid < 0) { - - struct widget_evas_event_info event_info; - int w; - int h; - evas_object_geometry_get(info->layout, NULL, NULL, &w, &h); - if (!info->disable_preview) { __create_preview_image(info->layout, info->widget_id); elm_object_signal_emit(info->layout, "enable", "preview"); @@ -2057,30 +2041,8 @@ API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget) elm_object_part_text_set(info->layout, "text", T_("IDS_ST_POP_LOADING_ING")); elm_object_signal_emit(info->layout, "enable", "text"); } - - ops.added_cb = __screen_connector_toolkit_evas_added_cb; - ops.removed_cb = __screen_connector_toolkit_evas_removed_cb; - ops.updated_cb = __screen_connector_toolkit_evas_updated_cb; - - if (info->toolkit_h) { - screen_connector_toolkit_evas_remove(info->toolkit_h); - info->toolkit_h = NULL; - } - - info->toolkit_h = screen_connector_toolkit_evas_add(&ops, info->instance_id, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, info); - info->is_faulted = false; - info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h); - if (info->pid < 0) { - LOGE("Failed to launch an widget"); - event_info.error = info->pid; - event_info.widget_app_id = info->widget_id; - event_info.event = WIDGET_EVENT_CREATED; - - __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info); - __display_overlay_text(info); - - return; - } + __add_launch_list(info->instance_id); + __launch_instance(); } else { /** * @note