2 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
24 #include <glib-object.h>
28 #include "appcore_base.h"
29 #include "appcore_multiwindow_base.h"
30 #include "appcore_multiwindow_base_private.h"
32 extern appcore_multiwindow_base_context _appcore_mw_context;
34 static gint __comp(gconstpointer a, gconstpointer b)
36 const appcore_multiwindow_base_class *cls = a;
38 return strcmp(cls->id, b);
41 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_run(const char *class_id, const char *id, void *extra)
43 appcore_multiwindow_base_instance *inst;
44 GList * class_node = g_list_find_custom(_appcore_mw_context.classes, class_id, __comp);
49 if (appcore_multiwindow_base_instance_find(id)) {
54 inst = malloc(sizeof(appcore_multiwindow_base_instance));
58 inst->shell = class_node->data;
60 inst->id = strdup(id);
62 inst->is_resumed = false;
64 _appcore_mw_context.instances = g_list_append(_appcore_mw_context.instances, inst);
65 if (inst->shell->create)
66 inst->shell->create(inst, inst->shell->data);
71 EXPORT_API void appcore_multiwindow_base_instance_exit(appcore_multiwindow_base_instance_h context)
73 appcore_multiwindow_base_instance *inst = context;
75 appcore_multiwindow_base_instance_pause(inst);
76 if (inst->shell->terminate)
77 inst->shell->terminate(inst, inst->shell->data);
79 _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
84 EXPORT_API void appcore_multiwindow_base_instance_drop(appcore_multiwindow_base_instance_h context)
86 appcore_multiwindow_base_instance *inst = context;
88 inst->shell->terminate(inst, inst->shell->data);
90 _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
95 EXPORT_API void *appcore_multiwindow_base_instance_get_extra(appcore_multiwindow_base_instance_h context)
97 appcore_multiwindow_base_instance *inst = context;
102 EXPORT_API void appcore_multiwindow_base_instance_set_extra(appcore_multiwindow_base_instance_h context, void *extra)
104 appcore_multiwindow_base_instance *inst = context;
109 EXPORT_API bool appcore_multiwindow_base_instance_is_resumed(appcore_multiwindow_base_instance_h context)
111 appcore_multiwindow_base_instance *inst = context;
113 return inst->is_resumed;
116 EXPORT_API void appcore_multiwindow_base_instance_pause(appcore_multiwindow_base_instance_h context)
118 appcore_multiwindow_base_instance *inst = context;
120 if (!inst->is_resumed)
123 if (inst->shell->pause)
124 inst->shell->pause(inst, inst->shell->data);
125 inst->is_resumed = false;
128 EXPORT_API void appcore_multiwindow_base_instance_resume(appcore_multiwindow_base_instance_h context)
130 appcore_multiwindow_base_instance *inst = context;
132 if (inst->is_resumed)
135 if (inst->shell->resume)
136 inst->shell->resume(inst, inst->shell->data);
137 inst->is_resumed = true;
140 EXPORT_API const char *appcore_multiwindow_base_instance_get_id(appcore_multiwindow_base_instance_h context)
142 appcore_multiwindow_base_instance *inst = context;
147 EXPORT_API const char *appcore_multiwindow_base_instance_get_class_id(appcore_multiwindow_base_instance_h context)
149 appcore_multiwindow_base_instance *inst = context;
151 return inst->shell->id;
154 EXPORT_API const appcore_multiwindow_base_class *appcore_multiwindow_base_instance_get_class(appcore_multiwindow_base_instance_h context)
156 appcore_multiwindow_base_instance *inst = context;
161 static gint __comp_id(gconstpointer a, gconstpointer b)
163 const appcore_multiwindow_base_instance *inst = a;
165 return strcmp(inst->id, b);
168 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_find(const char *id)
170 GList * inst_node = g_list_find_custom(_appcore_mw_context.instances, id, __comp_id);
175 return inst_node->data;
178 EXPORT_API void appcore_multiwindow_base_instance_foreach(const char *class_id,
179 appcore_multiwindow_base_instance_cb cb, void *data)
181 GList * inst_node = _appcore_mw_context.instances;
182 appcore_multiwindow_base_instance *inst;
184 if (!class_id || !cb)
188 inst = inst_node->data;
190 if (!strcmp(class_id, inst->shell->id))
191 cb(class_id, inst->id, inst, data);
193 inst_node = g_list_next(inst_node);
197 EXPORT_API void appcore_multiwindow_base_instance_foreach_full(appcore_multiwindow_base_instance_cb cb,
200 GList * inst_node = _appcore_mw_context.instances;
201 appcore_multiwindow_base_instance *inst;
207 inst = inst_node->data;
208 cb(inst->shell->id, inst->id, inst, data);
209 inst_node = g_list_next(inst_node);
213 EXPORT_API int appcore_multiwindow_base_instance_get_cnt(void)
215 return g_list_length(_appcore_mw_context.instances);