1 #include <Ecore_Evas.h>
5 #include <livebox-errno.h>
11 #define PUBLIC __attribute__((visibility("default")))
14 * Abstracted Data Type of Virtual Window
17 char *id; /*!< Identification */
18 int width; /*!< Width */
19 int height; /*!< Height */
20 struct livebox_buffer *handle; /*!< Livebox buffer handle */
21 Evas_Object *window; /*!< Parent evas object - WARN: Incompatible with the elm_win object */
22 int is_hw; /*!< 1 if a buffer is created on the H/W accelerated place or 0 */
27 * Every user event (mouse) on the buffer will be passed via this event callback
29 static int event_handler_cb(struct livebox_buffer *handler, enum buffer_event evt, double timestamp, double x, double y, void *data)
31 struct info *info = data;
37 /* Just ignore this event */
43 * Calculate the event occurred X & Y on the buffer
46 iy = info->height * y;
48 e = evas_object_evas_get(info->window);
55 case BUFFER_EVENT_ENTER:
56 evas_event_feed_mouse_in(e, timestamp, NULL);
58 case BUFFER_EVENT_LEAVE:
59 evas_event_feed_mouse_out(e, timestamp, NULL);
61 case BUFFER_EVENT_DOWN:
62 evas_event_feed_mouse_in(e, timestamp, NULL);
63 evas_event_feed_mouse_move(e, ix, iy, timestamp + 0.01f, NULL); /* + 0.1f just for fake event */
64 evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 0.02f, NULL); /* + 0.2f just for fake event */
66 case BUFFER_EVENT_MOVE:
67 evas_event_feed_mouse_move(e, ix, iy, timestamp, NULL);
70 evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp, NULL);
71 evas_event_feed_mouse_out(e, timestamp + 0.01f, NULL); /* + 0.1f just for fake event */
74 LOGD("Unhandled buffer event (%d)\n", evt);
81 static void *alloc_fb(void *data, int size)
83 struct info *info = data;
87 * Acquire a buffer for canvas.
89 info->handle = livebox_acquire_buffer(info->id, IS_PD,
90 info->width, info->height,
91 event_handler_cb, info);
94 * If it supports the H/W accelerated buffer,
97 if (livebox_support_hw_buffer(info->handle)) {
98 if (livebox_create_hw_buffer(info->handle) == 0) {
99 buffer = livebox_buffer_hw_buffer(info->handle);
101 LOGD("HW Accelerated buffer is created\n");
107 LOGE("Failed to allocate HW Accelerated buffer\n");
111 * Or use the buffer of a S/W backend.
113 buffer = livebox_ref_buffer(info->handle);
114 LOGD("SW buffer is created\n");
119 static void free_fb(void *data, void *ptr)
121 struct info *info = data;
127 if (livebox_destroy_hw_buffer(info->handle) == 0) {
128 LOGD("HW Accelerated buffer is destroyed\n");
133 livebox_unref_buffer(ptr);
134 LOGD("SW buffer is destroyed\n");
136 livebox_release_buffer(info->handle);
140 static void resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
142 struct info *info = data;
145 ee = ecore_evas_ecore_evas_get(e);
149 evas_object_geometry_get(obj, NULL, NULL, &info->width, &info->height);
150 LOGD("Resize to %dx%d\n", info->width, info->height);
152 * Box(parent object) is resized.
153 * Try to resize the canvas too.
155 ecore_evas_resize(ee, info->width, info->height);
159 * If a canvas is destroyed,
160 * Free all buffer of canvas.
162 static void del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
165 struct info *info = data;
167 ee = ecore_evas_ecore_evas_get(e);
171 LOGD("Try to release the ECORE_EVAS\n");
175 LOGD("ECORE_EVAS is released\n");
178 static void pre_render_cb(void *data, Evas *e, void *event_info)
180 struct info *info = data;
186 livebox_buffer_pre_render(info->handle);
189 static void post_render_cb(void *data, Evas *e, void *event_info)
191 struct info *info = data;
197 livebox_buffer_post_render(info->handle);
199 livebox_sync_buffer(info->handle);
202 PUBLIC Evas_Object *livebox_virtual_window_add(const char *id, int width, int height)
208 info = calloc(1, sizeof(*info));
213 info->id = strdup(id);
220 info->height = height;
222 ee = ecore_evas_buffer_allocfunc_new(width, height, alloc_fb, free_fb, info);
229 pre_render_cb(info, NULL, NULL);
230 ecore_evas_alpha_set(ee, EINA_TRUE);
231 post_render_cb(info, NULL, NULL);
233 ecore_evas_manual_render_set(ee, EINA_FALSE);
234 ecore_evas_resize(ee, width, height);
236 e = ecore_evas_get(ee);
242 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, post_render_cb, info);
243 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, pre_render_cb, info);
245 info->window = evas_object_rectangle_add(e);
251 evas_object_resize(info->window, width, height);
252 evas_object_color_set(info->window, 0, 0, 0, 0);
253 evas_object_event_callback_add(info->window, EVAS_CALLBACK_DEL, del_cb, info);
254 evas_object_event_callback_add(info->window, EVAS_CALLBACK_RESIZE, resize_cb, info);
259 PUBLIC int livebox_virtual_window_del(Evas_Object *virtual_win)
261 evas_object_del(virtual_win);
262 return LB_STATUS_SUCCESS;