2 #include "PUI_internal.h"
3 #include "PUI_backend.h"
6 #define PUI_MODULE_DIR "/usr/lib"
9 #define pui_err(msg, ...) \
11 fprintf(stderr, "[ERROR][%s] " msg, __FUNCTION__, ##__VA_ARGS__); \
14 #define pui_warn(msg, ...) \
16 fprintf(stderr, "[WARNING][%s] " msg, __FUNCTION__, ##__VA_ARGS__); \
19 #define pui_info(msg, ...) \
21 fprintf(stdout, "[INFO][%s] " msg, __FUNCTION__, ##__VA_ARGS__); \
24 static int _pui_init_count = 0;
25 static pui_module_data *pui_module = NUJLL;
27 EAPI int PUI_EVENT_ANI_STARTED = 0;
28 EAPI int PUI_EVENT_ANI_STOPPED = 0;
29 EAPI int PUI_EVENT_ANI_PAUSED = 0;
30 EAPI int PUI_EVENT_ANI_READY_TO_START = 0;
31 EAPI int PUI_EVENT_ANI_READY_TO_RESUME = 0;
32 EAPI int PUI_EVENT_ANI_FRAME_DONE = 0;
33 EAPI int PUI_EVENT_ANI_BUFFER_RELEASED = 0;
35 const pui_error_string
36 pui_error_to_string(pui_error e)
38 const pui_error_string str = NULL;
46 case PUI_ERROR_INVALID_ANI_HANDLE:
47 str = "PUI_Invalid_Animation_Handle";
50 case PUI_ERROR_INVALID_ANI_CMD:
51 str = "PUI_Invalid_Animation_Command";
54 case PUI_ERROR_INVALID_ANI_OPT:
55 str = "PUI_Invalid_Animation_Option";
58 case PUI_ERROR_INTERNAL:
59 str = "PUI_Internal_Error";
63 str = "PUI_Unknown_Error";
70 _pui_cb_frame(Ecore_Wl2_Window *win, uint32_t timestamp EINA_UNUSED, void *data)
72 pui_h handle = (pui_h) data;
74 TRACE("Frame done ! (window=%p)\n", win);
82 pui_create(Ecore_Wl2_Window *win)
85 Ecore_Wl2_display *ewd = ecore_wl2_window_display_get(win);
86 struct wayland_tbm_client *wl_tbm_client = NULL;
87 Ecore_Wl2_Frame_Cb_Handle *frame_cb = NULL;
91 pui_err("Invalid window or display !");
95 wl_tbm_client = wayland_tbm_client_init(ecore_wl2_display_get(ewd));
99 pui_err("Failed to init wayland_tbm_client !");
103 handle = (pui_h)calloc(1, sizeof(pui_h));
110 handle->visibility = 0;
111 handle->wl_tbm_client = wl_tbm_client;
112 handle->ani_handles = NULL;
113 handle->backend_module_data = pui_module->backend_module_data;
115 handle->tbm_queue = wayland_tbm_client_create_surface_queue(handle->wl_tbm_client,
116 ecore_wl2_window_surface_get(handle->win),
117 2, 100, 100, TBM_FORMAT_ABGR8888);
119 if (!handle->tbm_queue)
121 pui_err("Failed to create a surface queue !");
134 pui_destroy(pui_h handle)
136 pui_ani_h *ani_h = NULL;
141 EINA_LIST_FREE(handle->ani_handles, ani_h)
143 pui_ani_destroy(ani_h);
147 if (handle->tbm_queue)
149 tbm_surface_queue_destroy(handle->tbm_queue);
150 handle->tbm_queue = NULL;
153 if (handle->wl_tbm_client)
155 wayland_tbm_client_deinit(handle->wl_tbm_client);
156 handle->wl_tbm_client = NULL;
162 #define PREFIX_LIB "libpui_"
163 #define SUFFIX_LIB ".so"
164 #define DEFAULT_LIB PREFIX_LIB"default"SUFFIX_LIB
167 _pui_load_backend_module(void)
169 //char path[PATH_MAX] = {0, };
170 void *module_info = NULL;
171 pui_backend_module *backend_module_info = NULL;
172 int backend_module_major, backend_module_minor;
173 int pui_backend_major, pui_backend_minor;
175 pui_backend_module_data *backend_module_data = NULL;
178 module_info = dlopen(DEFAULT_LIB, RTLD_LAZY);
182 pui_err("Failed to dlopen(error:%s, path:%s) !\n", dlerror(), DEFAULT_LIB);
186 backend_module_info = dlsym(module_info, "pui_backend_module_info");
188 if (!backend_module_info) {
189 pui_err("Backend module(%s) doesn't have pui_backend_module_info !\n", DEFAULT_LIB);
193 pui_backend_major = PUI_BACKEND_GET_ABI_MAJOR(PUI_BACKEND_AB_VERSION_LAST);
194 pui_backend_minor = PUI_BACKEND_GET_ABI_MINOR(PUI_BACKEND_AB_VERSION_LAST);
196 backend_module_major = PUI_BACKEND_GET_ABI_MAJOR(backend_module_info->abi_version);
197 backend_module_minor = PUI_BACKEND_GET_ABI_MINOR(backend_module_info->abi_version);
199 if (backend_module_major > pui_backend_major) {
200 TBM_ERR("PUI backend module ABI major ver(%d) is newer than the PUI's ver(%d)\n",
201 backend_module_major, pui_backend_major);
203 } else if (backend_module_minor > pui_backend_minor) {
204 TBM_ERR("PUI backend module ABI minor ver(%d) is newer than the PUI's ver(%d)\n",
205 backend_module_minor, pui_backend_minor);
209 if (!backend_module_info->backend_init || !backend_module_info->backend_deinit)
211 pui_err("Backend module doesn't have backend_init/backend_deinit function !\n");
215 backend_module_data = backend_module_info->backend_init();
217 if (!backend_module_data)
219 pui_err("Failed to init module (%s) !\n", DEFAULT_LIB);
223 pui_module->module_info = module_info;
224 pui_module->backend_module_info = backend_module_info;
225 pui_module->backend_module_data = backend_module_data;
230 if (backend_module_info)
231 backend_module_info->backend_deinit
234 dlclose(module_info);
240 _pui_unload_backend_module(void)
244 pui_err("Invalid pui module !\n");
248 if (pui_module->backend_module_info)
250 pui_module->backend_module_info->backend_deinit(pui_module->backend_module_data);
251 pui_module->backend_module_data = NULL;
252 pui_module->backend_module_info = NULL;
255 if (pui_module->module_info)
256 dlclose(pui_module->module_info);
262 _pui_load_backend_module();
268 _pui_unload_backend_module();
272 _pui_event_init(void)
274 PUI_EVENT_ANI_STARTED = ecore_event_type_new();
275 PUI_EVENT_ANI_STOPPED = ecore_event_type_new();
276 PUI_EVENT_ANI_PAUSED = ecore_event_type_new();
277 PUI_EVENT_ANI_READY_TO_START = ecore_event_type_new();
278 PUI_EVENT_ANI_READY_TO_RESUME = ecore_event_type_new();
279 PUI_EVENT_ANI_FRAME_DONE = ecore_event_type_new();
280 PUI_EVENT_ANI_BUFFER_RELEASED = ecore_event_type_new();
284 _pui_event_shutdown(void)
286 ecore_event_type_flush(PUI_EVENT_ANI_STARTED,
287 PUI_EVENT_ANI_STOPPED,
288 PUI_EVENT_ANI_PAUSED,
289 PUI_EVENT_ANI_READY_TO_START,
290 PUI_EVENT_ANI_READY_TO_RESUME,
291 PUI_EVENT_ANI_FRAME_DONE,
292 PUI_EVENT_ANI_BUFFER_RELEASED);
294 PUI_EVENT_ANI_STARTED = -1;
295 PUI_EVENT_ANI_STOPPED = -1;
296 PUI_EVENT_ANI_PAUSED = -1;
297 PUI_EVENT_ANI_READY_TO_START = -1;
298 PUI_EVENT_ANI_READY_TO_RESUME = -1;
299 PUI_EVENT_ANI_FRAME_DONE = -1;
300 PUI_EVENT_ANI_BUFFER_RELEASED = -1;
306 if (++_pui_init_count != 1)
307 return _pui_init_count;
311 pui_err("Invalid calling of pui_init() !\n");
315 pui_module = (pui_module_data *)calloc(1, sizeof(pui_module_data));
319 pui_err("Failed to allocate memory for pui module data !\n");
330 return _pui_init_count;
333 return --_pui_init_count;
339 if (_pui_init_count <= 0)
341 pui_err("Invalid pui init count : %d\n", _pui_init_count);
348 pui_err("Invalid pui module data !\n");
349 return _pui_init_count;
357 _pui_event_shutdown();
359 ecore_wl2_shutdown();
363 return _pui_init_count;