Add APIs for multi-window app core
[platform/core/appfw/app-core.git] / src / multiwindow_base / appcore_multiwindow_base_instance.c
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <stdio.h>
18 #include <stdarg.h>
19 #include <string.h>
20 #include <stdlib.h>
21 #include <stdbool.h>
22 #include <malloc.h>
23
24 #include <Ecore_Wayland.h>
25 #include <glib-object.h>
26 #include <glib.h>
27 #include <gio/gio.h>
28
29 #include "appcore_base.h"
30 #include "appcore_multiwindow_base.h"
31 #include "appcore_multiwindow_base_private.h"
32
33 extern appcore_multiwindow_base_context _appcore_mw_context;
34
35 static gint __comp(gconstpointer a, gconstpointer b)
36 {
37         const appcore_multiwindow_base_class *cls = a;
38
39         return strcmp(cls->id, b);
40 }
41
42 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_run(const char *class_id, const char *id, void *extra)
43 {
44         appcore_multiwindow_base_instance *inst;
45         GList * class_node = g_list_find_custom(_appcore_mw_context.classes, class_id, __comp);
46
47         if (!class_node)
48                 return NULL;
49         inst = malloc(sizeof(appcore_multiwindow_base_instance));
50         if (!inst)
51                 return NULL;
52
53         inst->shell = class_node->data;
54         inst->window_id = 0;
55         inst->id = strdup(id);
56         inst->extra = extra;
57         inst->is_resumed = false;
58
59         _appcore_mw_context.instances = g_list_append(_appcore_mw_context.instances, inst);
60         if (inst->shell->create)
61                 inst->shell->create(inst, inst->shell->data);
62
63         return inst;
64 }
65
66 EXPORT_API void appcore_multiwindow_base_instance_exit(appcore_multiwindow_base_instance_h context)
67 {
68         appcore_multiwindow_base_instance *inst = context;
69
70         appcore_multiwindow_base_instance_pause(inst);
71         if (inst->shell->terminate)
72                 inst->shell->terminate(inst, inst->shell->data);
73
74         _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
75         free(inst->id);
76         free(inst);
77 }
78
79 EXPORT_API void appcore_multiwindow_base_instance_drop(appcore_multiwindow_base_instance_h context)
80 {
81         appcore_multiwindow_base_instance *inst = context;
82
83         inst->shell->terminate(inst, inst->shell->data);
84
85         _appcore_mw_context.instances = g_list_remove(_appcore_mw_context.instances, inst);
86         free(inst->id);
87         free(inst);
88 }
89
90 EXPORT_API void *appcore_multiwindow_base_instance_get_extra(appcore_multiwindow_base_instance_h context)
91 {
92         appcore_multiwindow_base_instance *inst = context;
93
94         return inst->extra;
95 }
96
97 EXPORT_API void appcore_multiwindow_base_instance_set_extra(appcore_multiwindow_base_instance_h context, void *extra)
98 {
99         appcore_multiwindow_base_instance *inst = context;
100
101         inst->extra = extra;
102 }
103
104 EXPORT_API bool appcore_multiwindow_base_instance_is_resumed(appcore_multiwindow_base_instance_h context)
105 {
106         appcore_multiwindow_base_instance *inst = context;
107
108         return inst->is_resumed;
109 }
110
111 EXPORT_API void appcore_multiwindow_base_instance_pause(appcore_multiwindow_base_instance_h context)
112 {
113         appcore_multiwindow_base_instance *inst = context;
114
115         if (!inst->is_resumed)
116                 return;
117
118         if (inst->shell->pause)
119                 inst->shell->pause(inst, inst->shell->data);
120         inst->is_resumed = false;
121 }
122
123 EXPORT_API void appcore_multiwindow_base_instance_resume(appcore_multiwindow_base_instance_h context)
124 {
125         appcore_multiwindow_base_instance *inst = context;
126
127         if (inst->is_resumed)
128                 return;
129
130         if (inst->shell->resume)
131                 inst->shell->resume(inst, inst->shell->data);
132         inst->is_resumed = true;
133 }
134
135 EXPORT_API const char *appcore_multiwindow_base_instance_get_id(appcore_multiwindow_base_instance_h context)
136 {
137         appcore_multiwindow_base_instance *inst = context;
138
139         return inst->id;
140 }
141
142 EXPORT_API const char *appcore_multiwindow_base_instance_get_class_id(appcore_multiwindow_base_instance_h context)
143 {
144         appcore_multiwindow_base_instance *inst = context;
145
146         return inst->shell->id;
147 }
148
149 EXPORT_API const appcore_multiwindow_base_class *appcore_multiwindow_base_instance_get_class(appcore_multiwindow_base_instance_h context)
150 {
151         appcore_multiwindow_base_instance *inst = context;
152
153         return inst->shell;
154 }
155
156 static gint __comp_id(gconstpointer a, gconstpointer b)
157 {
158         const appcore_multiwindow_base_instance *inst = a;
159
160         return strcmp(inst->id, b);
161 }
162
163 EXPORT_API appcore_multiwindow_base_instance_h appcore_multiwindow_base_instance_find(const char *id)
164 {
165         GList * inst_node = g_list_find_custom(_appcore_mw_context.instances, id, __comp_id);
166
167         if (!inst_node)
168                 return NULL;
169
170         return inst_node->data;
171 }
172
173 EXPORT_API void appcore_multiwindow_base_instance_foreach(const char *class_id,
174                 appcore_multiwindow_base_instance_cb cb, void *data)
175 {
176         GList * inst_node = _appcore_mw_context.instances;
177         appcore_multiwindow_base_instance *inst;
178
179         if (!class_id || !cb)
180                 return;
181
182         while (inst_node) {
183                 inst = inst_node->data;
184
185                 if (!strcmp(class_id, inst->shell->id))
186                         cb(class_id, inst->id, inst, data);
187
188                 inst_node = g_list_next(inst_node);
189         }
190 }
191
192 EXPORT_API void appcore_multiwindow_base_instance_foreach_full(appcore_multiwindow_base_instance_cb cb,
193                 void *data)
194 {
195         GList * inst_node = _appcore_mw_context.instances;
196         appcore_multiwindow_base_instance *inst;
197
198         if (!cb)
199                 return;
200
201         while (inst_node) {
202                 inst = inst_node->data;
203                 cb(inst->shell->id, inst->id, inst, data);
204                 inst_node = g_list_next(inst_node);
205         }
206 }
207
208 EXPORT_API int appcore_multiwindow_base_instance_get_cnt(void)
209 {
210         return g_list_length(_appcore_mw_context.instances);
211 }
212
213