static int __default_height;
static screen_connector_toolkit_evas_h __toolkit;
static screen_connector_toolkit_evas_h __rid_toolkit;
-static screen_connector_toolkit_evas_h __tmp_toolkit;
static Evas_Object *__win;
static char *__watch_appid;
static int __viewer_visibility = AUL_SCREEN_STATUS_PAUSE;
static Ecore_Event_Handler *__pre_visibility;
+struct toolkit_info_s {
+ char *appid;
+ screen_connector_toolkit_evas_h toolkit;
+};
+static GList *__toolkit_list;
+
static GList *__dead_cbs;
struct dead_cb_s {
watch_dead_signal_cb cb;
static void __manual_render_start(void);
static void __manual_render_finish(void);
+static void __destroy_toolkit_info(gpointer data)
+{
+ struct toolkit_info_s *info = data;
+
+ if (!info)
+ return;
+
+ if (info->appid)
+ free(info->appid);
+
+ free(info);
+}
+
+static struct toolkit_info_s *__create_toolkit_info(const char *appid,
+ screen_connector_toolkit_evas_h toolkit)
+{
+ struct toolkit_info_s *info;
+
+ info = malloc(sizeof(struct toolkit_info_s));
+ if (!info) {
+ _E("Out of memory");
+ return NULL;
+ }
+
+ info->appid = strdup(appid);
+ if (!info->appid) {
+ _E("Failed to duplicate appid(%s)", appid);
+ free(info);
+ return NULL;
+ }
+
+ info->toolkit = toolkit;
+
+ return info;
+}
+
+static struct toolkit_info_s *__find_toolkit_info(const char *appid)
+{
+ struct toolkit_info_s *info;
+ GList *iter;
+
+ iter = __toolkit_list;
+ while (iter) {
+ info = (struct toolkit_info_s *)iter->data;
+ if (info && !strcmp(info->appid, appid))
+ return info;
+
+ iter = g_list_next(iter);
+ }
+
+ return NULL;
+}
+
+static struct toolkit_info_s *__find_toolkit_info_by_toolkit(
+ screen_connector_toolkit_evas_h toolkit)
+{
+ struct toolkit_info_s *info;
+ GList *iter;
+
+ iter = __toolkit_list;
+ while (iter) {
+ info = (struct toolkit_info_s *)iter->data;
+ if (info && info->toolkit == toolkit)
+ return info;
+
+ iter = g_list_next(iter);
+ }
+
+ return NULL;
+}
+
static void __process_pending_status(int status, unsigned int surf)
{
int r;
Evas_Object *image, void *data)
{
Evas_Object *cur_image;
+ struct toolkit_info_s *info;
+ GList *iter;
_D("obj(%p) removed", image);
evas_object_smart_callback_call(__win, WATCH_SMART_SIGNAL_REMOVED, image);
cur_image = evas_object_data_get(__win, "tbm,watch");
if (cur_image == image) {
evas_object_data_set(__win, "tbm,watch", NULL);
- if (__toolkit)
+ if (__toolkit) {
+ info = __find_toolkit_info_by_toolkit(__toolkit);
+ if (info) {
+ __toolkit_list = g_list_remove(__toolkit_list,
+ info);
+ __destroy_toolkit_info(info);
+ }
g_idle_add(__remove_toolkit, __toolkit);
+ }
if (__rid_toolkit)
g_idle_add(__remove_toolkit, __rid_toolkit);
__toolkit = NULL;
__is_bound = false;
}
- if (__tmp_toolkit) {
- g_idle_add(__remove_toolkit, __tmp_toolkit);
- __tmp_toolkit = NULL;
+ iter = __toolkit_list;
+ while (iter) {
+ info = (struct toolkit_info_s *)iter->data;
+ iter = g_list_next(iter);
+ if (info->toolkit != __toolkit &&
+ info->toolkit != __rid_toolkit) {
+ __toolkit_list = g_list_remove(__toolkit_list, info);
+ g_idle_add(__remove_toolkit, info->toolkit);
+ __destroy_toolkit_info(info);
+ }
}
}
API int watch_manager_fini()
{
+ if (__toolkit_list) {
+ g_list_free_full(__toolkit_list, __destroy_toolkit_info);
+ __toolkit_list = NULL;
+ }
+
__watch_viewer_fini();
if (__watch_appid) {
char *viewer = NULL;
char *pid_str = NULL;
screen_connector_toolkit_evas_ops ops;
+ screen_connector_toolkit_evas_h toolkit;
+ struct toolkit_info_s *info;
bool exist;
bundle_get_str(envelope, AUL_K_WIDGET_VIEWER, &viewer);
__watch_appid, appid, pid_str);
exist = screen_connector_toolkit_is_exist(appid,
- SCREEN_CONNECTOR_SCREEN_TYPE_WATCH);
-
+ SCREEN_CONNECTOR_SCREEN_TYPE_WATCH);
if (exist) {
- screen_connector_toolkit_evas_remove(__toolkit);
+ info = __find_toolkit_info(appid);
+ if (info) {
+ __toolkit_list = g_list_remove(__toolkit_list, info);
+ screen_connector_toolkit_evas_remove(info->toolkit);
+ __destroy_toolkit_info(info);
+ }
} else {
- __tmp_toolkit = __toolkit;
- _D("Old toolkit %p", __tmp_toolkit);
+ _D("Old toolkit %p", __toolkit);
}
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;
- __toolkit = screen_connector_toolkit_evas_add(&ops, appid,
+ toolkit = screen_connector_toolkit_evas_add(&ops, appid,
SCREEN_CONNECTOR_SCREEN_TYPE_WATCH, NULL);
+ if (!toolkit) {
+ LOGE("Failed to add toolkit evas. appid(%s)", appid);
+ } else {
+ info = __create_toolkit_info(appid, toolkit);
+ if (info)
+ __toolkit_list = g_list_append(__toolkit_list, info);
+
+ __toolkit = toolkit;
+ }
if (__watch_appid)
free(__watch_appid);