19527fe94389edc940a3730e98132b85d13246ef
[pkgs/u/ui-gadget.git] / src / ug.c
1 /*
2  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * This file is part of the UI Gadget
5  * Written by Jayoun Lee <airjany@samsung.com>, Jinwoo Nam <jwoo.nam@samsung.com>
6  *
7  * PROPRIETARY/CONFIDENTIAL
8  *
9  * This software is the confidential and proprietary information of
10  * SAMSUNG ELECTRONICS (Confidential Information).
11  * You shall not disclose such Confidential Information and shall
12  * use it only in accordance with the terms of the license agreement
13  * you entered into with SAMSUNG ELECTRONICS.  SAMSUNG make no
14  * representations or warranties about the suitability
15  * of the software, either express or implied, including but not
16  * limited to the implied warranties of merchantability, fitness for a particular purpose, or non-
17  * infringement. SAMSUNG shall not be liable for any damages suffered by licensee as
18  * a result of using, modifying or distributing this software or its derivatives.
19  *
20  */
21
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25 #include <stdio.h>
26
27 #include "ug.h"
28 #include "ug-module.h"
29 #include "ug-manager.h"
30 #include "ug-dbg.h"
31
32 #ifndef UG_API
33 #define UG_API __attribute__ ((visibility("default")))
34 #endif
35
36 struct ui_gadget *ug_root_create(void)
37 {
38         struct ui_gadget *ug;
39
40         ug = calloc(1, sizeof(struct ui_gadget));
41         if (!ug) {
42                 _ERR("ug root create failed: Memory allocation failed\n");
43                 return NULL;
44         }
45
46         ug->mode = UG_MODE_FULLVIEW;
47         ug->state = UG_STATE_RUNNING;
48         ug->children = NULL;
49
50         return ug;
51 }
52
53 int ug_free(struct ui_gadget *ug)
54 {
55         if (!ug) {
56                 _ERR("ug free failed: Invalid ug\n");
57                 errno = EINVAL;
58                 return -1;
59         }
60
61         if (ug->module)
62                 ug_module_unload(ug->module);
63         if (ug->name)
64                 free((void *)ug->name);
65         if (ug->data)
66                 bundle_free(ug->data);
67         free(ug);
68         return 0;
69 }
70
71 UG_API struct ui_gadget *ug_create(struct ui_gadget *parent,
72                                    const char *name,
73                                    enum ug_mode mode,
74                                    bundle *data, struct ug_cbs *cbs)
75 {
76         if (!name) {
77                 _ERR("ug_create() failed: Invalid name\n");
78                 errno = EINVAL;
79                 return NULL;
80         }
81
82         if (mode < UG_MODE_FULLVIEW || mode >= UG_MODE_INVALID) {
83                 _ERR("ug_create() failed: Invalid mode\n");
84                 errno = EINVAL;
85                 return NULL;
86         }
87
88         return ugman_ug_load(parent, name, mode, data, cbs);
89 }
90
91 UG_API int ug_init(Display *disp, Window xid, void *win, enum ug_option opt)
92 {
93         if (!win || !xid || !disp) {
94                 _ERR("ug_init() failed: Invalid arguments\n");
95                 return -1;
96         }
97
98         if (opt < UG_OPT_INDICATOR_ENABLE || opt >= UG_OPT_MAX) {
99                 _ERR("ug_init() failed: Invalid option\n");
100                 return -1;
101         }
102
103         return ugman_init(disp, xid, win, opt);
104 }
105
106 UG_API int ug_pause(void)
107 {
108         return ugman_pause();
109 }
110
111 UG_API int ug_resume(void)
112 {
113         return ugman_resume();
114 }
115
116 UG_API int ug_destroy(struct ui_gadget *ug)
117 {
118         return ugman_ug_del(ug);
119 }
120
121 UG_API int ug_destroy_all(void)
122 {
123         return ugman_ug_del_all();
124 }
125
126 UG_API int ug_destroy_me(struct ui_gadget *ug)
127 {
128         if (!ug || !ugman_ug_exist(ug)) {
129                 _ERR("ug_destroy_me() failed: Invalid ug\n");
130                 errno = EINVAL;
131                 return -1;
132         }
133
134         if (ug->state == UG_STATE_DESTROYING) {
135                 _ERR("ug_destory_me() failed:ug is alreay on destroying");
136                 return -1;
137         }
138
139         if (!ug->cbs.destroy_cb) {
140                 _ERR("ug_destroy_me() failed: destroy callback does not "
141                         "exist\n");
142                 return -1;
143         }
144
145         ug->cbs.destroy_cb(ug, ug->cbs.priv);
146         return 0;
147 }
148
149 UG_API void *ug_get_layout(struct ui_gadget *ug)
150 {
151         if (!ug || !ugman_ug_exist(ug)) {
152                 _ERR("ug_get_layout() failed: Invalid ug\n");
153                 errno = EINVAL;
154                 return NULL;
155         }
156         return ug->layout;
157 }
158
159 UG_API void *ug_get_parent_layout(struct ui_gadget *ug)
160 {
161         struct ui_gadget *parent;
162         if (!ug || !ugman_ug_exist(ug)) {
163                 _ERR("ug_get_parent_layout() failed: Invalid ug\n");
164                 errno = EINVAL;
165                 return NULL;
166         }
167
168         parent = ug->parent;
169
170         if (parent)
171                 return parent->layout;
172         return NULL;
173 }
174
175 UG_API enum ug_mode ug_get_mode(struct ui_gadget *ug)
176 {
177         if (!ug || !ugman_ug_exist(ug)) {
178                 _ERR("ug_get_mode() failed: Invalid ug\n");
179                 errno = EINVAL;
180                 return UG_MODE_INVALID;
181         }
182
183         return ug->mode;
184 }
185
186 UG_API void *ug_get_window(void)
187 {
188         return ugman_get_window();
189 }
190
191 UG_API int ug_send_event(enum ug_event event)
192 {
193         if (event <= UG_EVENT_NONE || event >= UG_EVENT_MAX) {
194                 _ERR("ug_send_event() failed: Invalid event\n");
195                 return -1;
196         }
197
198         return ugman_send_event(event);
199 }
200
201 UG_API int ug_send_key_event(enum ug_key_event event)
202 {
203         if (event <= UG_KEY_EVENT_NONE || event >= UG_KEY_EVENT_MAX) {
204                 _ERR("ug_send_key_event() failed: Invalid event\n");
205                 return -1;
206         }
207
208         return ugman_send_key_event(event);
209 }
210
211 UG_API int ug_send_result(struct ui_gadget *ug, bundle *result)
212 {
213         bundle *result_dup = NULL;
214
215         if (!ug || !ugman_ug_exist(ug)) {
216                 _ERR("ug_send_result() failed: Invalid ug\n");
217                 errno = EINVAL;
218                 return -1;
219         }
220
221         if (!ug->cbs.result_cb) {
222                 _ERR("ug_send_result() failed: result callback does not exist\n");
223                 return -1;
224         }
225
226         if (result) {
227                 result_dup = bundle_dup(result);
228                 if (!result_dup) {
229                         _ERR("ug_send_result() failed: bundle_dup failed\n");
230                         return -1;
231                 }
232         }
233
234         ug->cbs.result_cb(ug, result_dup, ug->cbs.priv);
235
236         if (result_dup)
237                 bundle_free(result_dup);
238
239         return 0;
240 }
241
242 UG_API int ug_send_message(struct ui_gadget *ug, bundle *msg)
243 {
244         int r;
245
246         bundle *msg_dup = NULL;
247         if (msg) {
248                 msg_dup = bundle_dup(msg);
249                 if (!msg_dup) {
250                         _ERR("ug_send_message() failed: bundle_dup failed\n");
251                         return -1;
252                 }
253         }
254
255         r = ugman_send_message(ug, msg_dup);
256
257         if (msg_dup)
258                 bundle_free(msg_dup);
259
260         return r;
261 }
262
263 UG_API int ug_disable_effect(struct ui_gadget *ug)
264 {
265         if (ug->layout_state != UG_LAYOUT_INIT) {
266                 _ERR("ug_disable_effect() failed: ug has already been shown\n");
267                 return -1;
268         }
269         ug->layout_state = UG_LAYOUT_NOEFFECT;
270
271         return 0;
272 }