1 #include "PUI_internal.h"
2 #include "PUI_backend.h"
5 #include <wayland-tbm-client.h>
6 #include <tbm_surface_internal.h>
10 #ifndef PUI_MODULE_DIR
11 #define PUI_MODULE_DIR "/usr/lib"
14 static int _pui_init_count = 0;
15 static pui_module_data *pui_module = NULL;
17 int PUI_EVENT_ANI_STARTED = 0;
18 int PUI_EVENT_ANI_STOPPED = 0;
19 int PUI_EVENT_ANI_PAUSED = 0;
20 int PUI_EVENT_ANI_READY_TO_START = 0;
21 int PUI_EVENT_ANI_READY_TO_RESUME = 0;
22 int PUI_EVENT_ANI_FRAME_DONE = 0;
23 int PUI_EVENT_ANI_BUFFER_RELEASED = 0;
26 pui_error_to_string(pui_error e)
28 pui_error_string str = NULL;
36 case PUI_ERROR_INVALID_ANI_HANDLE:
37 str = "PUI_Invalid_Animation_Handle";
40 case PUI_ERROR_INVALID_ANI_CMD:
41 str = "PUI_Invalid_Animation_Command";
44 case PUI_ERROR_INTERNAL:
45 str = "PUI_Internal_Error";
49 str = "PUI_Unknown_Error";
56 pui_create(Ecore_Wl2_Window *win)
59 Ecore_Wl2_Display *ewd = ecore_wl2_window_display_get(win);
60 struct wayland_tbm_client *wl_tbm_client = NULL;
64 pui_err("Invalid window or display !\n");
68 wl_tbm_client = wayland_tbm_client_init(ecore_wl2_display_get(ewd));
72 pui_err("Failed to init wayland_tbm_client !\n");
76 handle = (pui_h)calloc(1, sizeof(pui_h));
83 handle->visibility = 0;
84 handle->wl_tbm_client = wl_tbm_client;
85 handle->ani_handles = NULL;
86 handle->backend_module_data = pui_module->backend_module_data;
88 handle->tbm_queue = wayland_tbm_client_create_surface_queue(handle->wl_tbm_client,
89 ecore_wl2_window_surface_get(handle->win),
90 2, 100, 100, TBM_FORMAT_ABGR8888);
92 if (!handle->tbm_queue)
94 pui_err("Failed to create a surface queue !");
107 pui_destroy(pui_h handle)
109 pui_ani_h ani_h = NULL;
114 EINA_LIST_FREE(handle->ani_handles, ani_h)
116 pui_ani_destroy(ani_h);
120 if (handle->tbm_queue)
122 tbm_surface_queue_destroy(handle->tbm_queue);
125 if (handle->wl_tbm_client)
127 wayland_tbm_client_deinit(handle->wl_tbm_client);
128 handle->wl_tbm_client = NULL;
134 #define PREFIX_LIB "libpui-"
135 #define SUFFIX_LIB ".so"
136 #define DEFAULT_LIB PREFIX_LIB"default-backend"SUFFIX_LIB
139 _pui_load_backend_module(void)
141 //char path[PATH_MAX] = {0, };
142 void *module_info = NULL;
143 pui_backend_module *backend_module_info = NULL;
144 int backend_module_major, backend_module_minor;
145 int pui_backend_major, pui_backend_minor;
147 pui_backend_module_data *backend_module_data = NULL;
150 module_info = dlopen(DEFAULT_LIB, RTLD_LAZY);
154 pui_err("Failed to dlopen(error:%s, path:%s) !\n", dlerror(), DEFAULT_LIB);
158 backend_module_info = dlsym(module_info, "pui_backend_module_info");
160 if (!backend_module_info) {
161 pui_err("Backend module(%s) doesn't have pui_backend_module_info !\n", DEFAULT_LIB);
165 pui_backend_major = PUI_BACKEND_GET_ABI_MAJOR(PUI_BACKEND_AB_VERSION_LAST);
166 pui_backend_minor = PUI_BACKEND_GET_ABI_MINOR(PUI_BACKEND_AB_VERSION_LAST);
168 backend_module_major = PUI_BACKEND_GET_ABI_MAJOR(backend_module_info->abi_version);
169 backend_module_minor = PUI_BACKEND_GET_ABI_MINOR(backend_module_info->abi_version);
171 if (backend_module_major > pui_backend_major) {
172 pui_err("PUI backend module ABI major ver(%d) is newer than the PUI's ver(%d)\n",
173 backend_module_major, pui_backend_major);
175 } else if (backend_module_minor > pui_backend_minor) {
176 pui_err("PUI backend module ABI minor ver(%d) is newer than the PUI's ver(%d)\n",
177 backend_module_minor, pui_backend_minor);
181 if (!backend_module_info->backend_init || !backend_module_info->backend_deinit)
183 pui_err("Backend module doesn't have backend_init/backend_deinit function !\n");
187 backend_module_data = backend_module_info->backend_init();
189 if (!backend_module_data)
191 pui_err("Failed to init module (%s) !\n", DEFAULT_LIB);
195 pui_module->module_info = module_info;
196 pui_module->backend_module_info = backend_module_info;
197 pui_module->backend_module_data = backend_module_data;
202 if (backend_module_info && backend_module_info->backend_init)
203 backend_module_info->backend_deinit(backend_module_data);
206 dlclose(module_info);
212 _pui_unload_backend_module(void)
216 pui_err("Invalid pui module !\n");
220 if (pui_module->backend_module_info)
222 pui_module->backend_module_info->backend_deinit(pui_module->backend_module_data);
223 pui_module->backend_module_data = NULL;
224 pui_module->backend_module_info = NULL;
227 if (pui_module->module_info)
228 dlclose(pui_module->module_info);
234 _pui_load_backend_module();
240 _pui_unload_backend_module();
244 _pui_event_init(void)
246 PUI_EVENT_ANI_STARTED = ecore_event_type_new();
247 PUI_EVENT_ANI_STOPPED = ecore_event_type_new();
248 PUI_EVENT_ANI_PAUSED = ecore_event_type_new();
249 PUI_EVENT_ANI_READY_TO_START = ecore_event_type_new();
250 PUI_EVENT_ANI_READY_TO_RESUME = ecore_event_type_new();
251 PUI_EVENT_ANI_FRAME_DONE = ecore_event_type_new();
252 PUI_EVENT_ANI_BUFFER_RELEASED = ecore_event_type_new();
256 _pui_event_shutdown(void)
258 ecore_event_type_flush(PUI_EVENT_ANI_STARTED,
259 PUI_EVENT_ANI_STOPPED,
260 PUI_EVENT_ANI_PAUSED,
261 PUI_EVENT_ANI_READY_TO_START,
262 PUI_EVENT_ANI_READY_TO_RESUME,
263 PUI_EVENT_ANI_FRAME_DONE,
264 PUI_EVENT_ANI_BUFFER_RELEASED);
266 PUI_EVENT_ANI_STARTED = -1;
267 PUI_EVENT_ANI_STOPPED = -1;
268 PUI_EVENT_ANI_PAUSED = -1;
269 PUI_EVENT_ANI_READY_TO_START = -1;
270 PUI_EVENT_ANI_READY_TO_RESUME = -1;
271 PUI_EVENT_ANI_FRAME_DONE = -1;
272 PUI_EVENT_ANI_BUFFER_RELEASED = -1;
278 if (++_pui_init_count != 1)
279 return _pui_init_count;
283 pui_err("Invalid calling of pui_init() !\n");
287 pui_module = (pui_module_data *)calloc(1, sizeof(pui_module_data));
291 pui_err("Failed to allocate memory for pui module data !\n");
302 return _pui_init_count;
305 return --_pui_init_count;
311 if (_pui_init_count <= 0)
313 pui_err("Invalid pui init count : %d\n", _pui_init_count);
320 pui_err("Invalid pui module data !\n");
321 return _pui_init_count;
329 _pui_event_shutdown();
331 ecore_wl2_shutdown();
335 return _pui_init_count;