9 # define LOGFN(fl, ln, fn) \
10 printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
12 # define LOGFN(fl, ln, fn)
15 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
19 # include <sys/types.h>
20 # include <sys/mman.h>
27 #include "ecore_evas_private.h"
28 #include "Ecore_Evas.h"
30 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
31 # include <Evas_Engine_Wayland_Shm.h>
32 # include <Ecore_Wayland.h>
34 /* local structures */
35 typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data;
36 struct _EE_Wl_Smart_Data
40 Evas_Coord x, y, w, h;
43 /* local function prototypes */
44 static int _ecore_evas_wl_init(void);
45 static int _ecore_evas_wl_shutdown(void);
46 static void _ecore_evas_wl_pre_free(Ecore_Evas *ee);
47 static void _ecore_evas_wl_free(Ecore_Evas *ee);
48 static void _ecore_evas_wl_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
49 static void _ecore_evas_wl_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
50 static void _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
51 static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
52 static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
53 static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
54 static void _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
55 static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y);
56 static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
57 static void _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
58 static void _ecore_evas_wl_show(Ecore_Evas *ee);
59 static void _ecore_evas_wl_hide(Ecore_Evas *ee);
60 static void _ecore_evas_wl_raise(Ecore_Evas *ee);
61 static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title);
62 static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
63 static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h);
64 static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h);
65 static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h);
66 static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h);
67 static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer);
68 static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify);
69 static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max);
70 static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full);
71 static void _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore);
72 static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
73 static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
74 static int _ecore_evas_wl_render(Ecore_Evas *ee);
75 static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h);
76 static void _ecore_evas_wl_ensure_pool_size(Ecore_Evas *ee, int w, int h);
77 static struct wl_shm_pool *_ecore_evas_wl_shm_pool_create(int size, void **data);
79 static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool);
81 static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
82 static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
83 static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
84 static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
85 static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
87 /* SMART stuff for frame */
88 static Evas_Smart *_ecore_evas_wl_smart = NULL;
90 static void _ecore_evas_wl_smart_init(void);
91 static void _ecore_evas_wl_smart_add(Evas_Object *obj);
92 static void _ecore_evas_wl_smart_del(Evas_Object *obj);
93 static void _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
94 static void _ecore_evas_wl_smart_show(Evas_Object *obj);
95 static void _ecore_evas_wl_smart_hide(Evas_Object *obj);
97 static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
100 static int _ecore_evas_wl_init_count = 0;
101 static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
103 static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
106 _ecore_evas_wl_callback_resize_set,
107 _ecore_evas_wl_callback_move_set,
110 _ecore_evas_wl_callback_delete_request_set,
112 _ecore_evas_wl_callback_focus_in_set,
113 _ecore_evas_wl_callback_focus_out_set,
114 _ecore_evas_wl_callback_mouse_in_set,
115 _ecore_evas_wl_callback_mouse_out_set,
117 NULL, // unsticky_set
118 NULL, // pre_render_set
119 NULL, // post_render_set
121 NULL, // managed_move
122 _ecore_evas_wl_resize,
123 _ecore_evas_wl_move_resize,
124 NULL, // rotation_set
128 _ecore_evas_wl_raise,
131 _ecore_evas_wl_title_set,
132 _ecore_evas_wl_name_class_set,
133 _ecore_evas_wl_size_min_set,
134 _ecore_evas_wl_size_max_set,
135 _ecore_evas_wl_size_base_set,
136 _ecore_evas_wl_size_step_set,
137 NULL, // object_cursor_set
138 _ecore_evas_wl_layer_set,
140 _ecore_evas_wl_iconified_set,
141 NULL, // borderless set
142 NULL, // override set
143 _ecore_evas_wl_maximized_set,
144 _ecore_evas_wl_fullscreen_set,
145 NULL, // func avoid_damage set
146 NULL, // func withdrawn set
147 NULL, // func sticky set
148 _ecore_evas_wl_ignore_events_set,
149 _ecore_evas_wl_alpha_set,
150 _ecore_evas_wl_transparent_set,
151 NULL, // func profiles set
152 NULL, // window group set
156 NULL, // demand attention set
157 NULL, // focus skip set
158 _ecore_evas_wl_render,
159 _ecore_evas_wl_screen_geometry_get
162 /* external variables */
164 /* external functions */
166 ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
168 Ecore_Wl_Window *p = NULL;
169 Evas_Engine_Info_Wayland_Shm *einfo;
171 int method = 0, count = 0;
173 LOGFN(__FILE__, __LINE__, __FUNCTION__);
175 if (!(method = evas_render_method_lookup("wayland_shm")))
177 ERR("Render method lookup failed for Wayland_Shm");
181 count = ecore_wl_init(disp_name);
184 ERR("Failed to initialize Ecore_Wayland");
188 ecore_wl_display_iterate();
190 if (!(ee = calloc(1, sizeof(Ecore_Evas))))
192 ERR("Failed to allocate Ecore_Evas");
197 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
199 _ecore_evas_wl_init();
201 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
203 ee->driver = "wayland_shm";
204 if (disp_name) ee->name = strdup(disp_name);
218 ee->prop.max.w = 32767;
219 ee->prop.max.h = 32767;
221 ee->prop.request_pos = 0;
223 ee->prop.draw_frame = frame;
224 ee->alpha = EINA_FALSE;
226 ee->evas = evas_new();
227 evas_data_attach_set(ee->evas, ee);
228 evas_output_method_set(ee->evas, method);
229 evas_output_size_set(ee->evas, ee->w, ee->h);
230 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
232 /* FIXME: This needs to be set based on theme & scale */
233 if (ee->prop.draw_frame)
234 evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
236 if (parent) p = ecore_wl_window_find(parent);
238 /* FIXME: Get if parent is alpha, and set */
240 ee->engine.wl.parent = p;
242 ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
243 ee->prop.window = ee->engine.wl.win->id;
245 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
247 einfo->info.rotation = ee->rotation;
248 einfo->info.destination_alpha = ee->alpha;
249 einfo->info.rotation = ee->rotation;
250 einfo->info.debug = EINA_FALSE;
251 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
253 ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
255 _ecore_evas_wl_shutdown();
262 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
264 _ecore_evas_wl_shutdown();
269 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free);
271 if (ee->prop.draw_frame)
273 ee->engine.wl.frame = _ecore_evas_wl_frame_add(ee->evas);
274 evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
275 evas_object_move(ee->engine.wl.frame, 0, 0);
278 _ecore_evas_register(ee);
279 ecore_evas_input_event_register(ee);
281 ecore_event_window_register(ee->prop.window, ee, ee->evas,
282 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
283 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
284 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
285 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
287 // evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
292 /* local functions */
294 _ecore_evas_wl_init(void)
296 LOGFN(__FILE__, __LINE__, __FUNCTION__);
298 if (++_ecore_evas_wl_init_count != 1)
299 return _ecore_evas_wl_init_count;
301 _ecore_evas_wl_event_hdls[0] =
302 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
303 _ecore_evas_wl_cb_mouse_in, NULL);
304 _ecore_evas_wl_event_hdls[1] =
305 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
306 _ecore_evas_wl_cb_mouse_out, NULL);
307 _ecore_evas_wl_event_hdls[2] =
308 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
309 _ecore_evas_wl_cb_focus_in, NULL);
310 _ecore_evas_wl_event_hdls[3] =
311 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
312 _ecore_evas_wl_cb_focus_out, NULL);
313 _ecore_evas_wl_event_hdls[4] =
314 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
315 _ecore_evas_wl_cb_window_configure, NULL);
317 ecore_event_evas_init();
319 return _ecore_evas_wl_init_count;
323 _ecore_evas_wl_shutdown(void)
327 LOGFN(__FILE__, __LINE__, __FUNCTION__);
329 if (--_ecore_evas_wl_init_count != 0)
330 return _ecore_evas_wl_init_count;
332 for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
334 if (_ecore_evas_wl_event_hdls[i])
335 ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
338 ecore_event_evas_shutdown();
340 return _ecore_evas_wl_init_count;
344 _ecore_evas_wl_pre_free(Ecore_Evas *ee)
346 LOGFN(__FILE__, __LINE__, __FUNCTION__);
349 if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
353 _ecore_evas_wl_free(Ecore_Evas *ee)
355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
357 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
358 ee->engine.wl.buffer = NULL;
360 if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
361 ee->engine.wl.win = NULL;
363 ecore_event_window_unregister(ee->prop.window);
364 ecore_evas_input_event_unregister(ee);
366 _ecore_evas_wl_shutdown();
371 _ecore_evas_wl_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
373 LOGFN(__FILE__, __LINE__, __FUNCTION__);
376 ee->func.fn_resize = func;
380 _ecore_evas_wl_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
382 LOGFN(__FILE__, __LINE__, __FUNCTION__);
385 ee->func.fn_move = func;
389 _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
391 LOGFN(__FILE__, __LINE__, __FUNCTION__);
394 ee->func.fn_delete_request = func;
398 _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
400 LOGFN(__FILE__, __LINE__, __FUNCTION__);
403 ee->func.fn_focus_in = func;
407 _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
409 LOGFN(__FILE__, __LINE__, __FUNCTION__);
412 ee->func.fn_focus_out = func;
416 _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
418 LOGFN(__FILE__, __LINE__, __FUNCTION__);
421 ee->func.fn_mouse_in = func;
425 _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
427 LOGFN(__FILE__, __LINE__, __FUNCTION__);
430 ee->func.fn_mouse_out = func;
434 _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
442 if ((ee->x != x) || (ee->y != y))
446 if (ee->engine.wl.win)
447 ecore_wl_window_update_location(ee->engine.wl.win, x, y);
448 if (ee->func.fn_move) ee->func.fn_move(ee);
453 _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
455 Evas_Engine_Info_Wayland_Shm *einfo;
457 LOGFN(__FILE__, __LINE__, __FUNCTION__);
463 if (ee->prop.min.w > w) w = ee->prop.min.w;
464 else if (w > ee->prop.max.w) w = ee->prop.max.w;
465 if (ee->prop.min.h > h) h = ee->prop.min.h;
466 else if (h > ee->prop.max.h) h = ee->prop.max.h;
471 if ((ee->w != w) || (ee->h != h))
476 if ((ee->rotation == 90) || (ee->rotation == 270))
478 evas_output_size_set(ee->evas, h, w);
479 evas_output_viewport_set(ee->evas, 0, 0, h, w);
483 evas_output_size_set(ee->evas, w, h);
484 evas_output_viewport_set(ee->evas, 0, 0, w, h);
487 if (ee->prop.avoid_damage)
491 pdam = ecore_evas_avoid_damage_get(ee);
492 ecore_evas_avoid_damage_set(ee, 0);
493 ecore_evas_avoid_damage_set(ee, pdam);
496 if (ee->engine.wl.frame)
497 evas_object_resize(ee->engine.wl.frame, w, h);
499 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
500 ee->engine.wl.buffer = NULL;
502 _ecore_evas_wl_ensure_pool_size(ee, w, h);
504 if (ee->engine.wl.pool)
505 _ecore_evas_wl_buffer_new(ee, ee->engine.wl.pool);
507 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
510 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
514 einfo->info.dest = ee->engine.wl.pool_data;
515 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
517 if (ee->engine.wl.win)
519 ecore_wl_window_buffer_attach(ee->engine.wl.win,
520 ee->engine.wl.buffer, 0, 0);
521 ecore_wl_window_update_size(ee->engine.wl.win, w, h);
524 if (ee->func.fn_resize) ee->func.fn_resize(ee);
529 _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
531 LOGFN(__FILE__, __LINE__, __FUNCTION__);
534 if ((ee->x != x) || (ee->y != y))
535 _ecore_evas_wl_move(ee, x, y);
536 if ((ee->w != w) || (ee->h != h))
537 _ecore_evas_wl_resize(ee, w, h);
541 _ecore_evas_wl_ensure_pool_size(Ecore_Evas *ee, int w, int h)
546 stride = w * sizeof(int);
549 if ((ee->engine.wl.pool) && (len < ee->engine.wl.pool_size))
553 struct wl_shm_pool *pool = NULL;
557 if (ee->engine.wl.pool)
558 wl_shm_pool_destroy(ee->engine.wl.pool);
561 * Make the pool 1.5 times the current requirement to allow growth
562 * without requiring a new pool allocation
565 pool = _ecore_evas_wl_shm_pool_create(size, &data);
567 ee->engine.wl.pool = pool;
568 ee->engine.wl.pool_size = size;
569 ee->engine.wl.pool_data = data;
574 _ecore_evas_wl_show(Ecore_Evas *ee)
576 Evas_Engine_Info_Wayland_Shm *einfo;
578 LOGFN(__FILE__, __LINE__, __FUNCTION__);
580 if ((!ee) || (ee->visible)) return;
582 _ecore_evas_wl_ensure_pool_size(ee, ee->w, ee->h);
584 if (ee->engine.wl.pool)
585 _ecore_evas_wl_buffer_new(ee, ee->engine.wl.pool);
587 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
590 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
594 einfo->info.dest = ee->engine.wl.pool_data;
595 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
597 /* ecore_wl_flush(); */
599 if (ee->engine.wl.win)
601 ecore_wl_window_show(ee->engine.wl.win);
602 ecore_wl_window_buffer_attach(ee->engine.wl.win,
603 ee->engine.wl.buffer, 0, 0);
604 ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
606 if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
607 wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
609 if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
610 wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
614 if (ee->engine.wl.frame)
616 evas_object_show(ee->engine.wl.frame);
617 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
621 if (ee->func.fn_show) ee->func.fn_show(ee);
625 _ecore_evas_wl_hide(Ecore_Evas *ee)
627 Evas_Engine_Info_Wayland_Shm *einfo;
629 LOGFN(__FILE__, __LINE__, __FUNCTION__);
631 if ((!ee) || (!ee->visible)) return;
633 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
634 ee->engine.wl.buffer = NULL;
636 munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
638 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
639 if ((einfo) && (einfo->info.dest))
641 einfo->info.dest = NULL;
642 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
645 ecore_wl_window_hide(ee->engine.wl.win);
648 ee->should_be_visible = 0;
650 if (ee->func.fn_hide) ee->func.fn_hide(ee);
654 _ecore_evas_wl_raise(Ecore_Evas *ee)
656 LOGFN(__FILE__, __LINE__, __FUNCTION__);
658 if ((!ee) || (!ee->visible)) return;
659 ecore_wl_window_raise(ee->engine.wl.win);
663 _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
665 LOGFN(__FILE__, __LINE__, __FUNCTION__);
668 if (ee->prop.title) free(ee->prop.title);
669 ee->prop.title = NULL;
670 if (title) ee->prop.title = strdup(title);
671 if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
673 EE_Wl_Smart_Data *sd;
675 if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return;
676 evas_object_text_text_set(sd->text, ee->prop.title);
679 if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
680 wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
685 _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
687 LOGFN(__FILE__, __LINE__, __FUNCTION__);
690 if (ee->prop.name) free(ee->prop.name);
691 if (ee->prop.clas) free(ee->prop.clas);
692 ee->prop.name = NULL;
693 ee->prop.clas = NULL;
694 if (n) ee->prop.name = strdup(n);
695 if (c) ee->prop.clas = strdup(c);
697 if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
698 wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
703 _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h)
705 LOGFN(__FILE__, __LINE__, __FUNCTION__);
710 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
716 _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h)
718 LOGFN(__FILE__, __LINE__, __FUNCTION__);
723 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
729 _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h)
731 LOGFN(__FILE__, __LINE__, __FUNCTION__);
736 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
742 _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h)
744 LOGFN(__FILE__, __LINE__, __FUNCTION__);
749 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
755 _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer)
757 LOGFN(__FILE__, __LINE__, __FUNCTION__);
760 if (ee->prop.layer == layer) return;
761 if (layer < 1) layer = 1;
762 else if (layer > 255) layer = 255;
763 ee->prop.layer = layer;
767 _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify)
769 LOGFN(__FILE__, __LINE__, __FUNCTION__);
772 if (ee->prop.iconified == iconify) return;
773 ee->prop.iconified = iconify;
774 /* FIXME: Implement this in Wayland someshow */
778 _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max)
780 LOGFN(__FILE__, __LINE__, __FUNCTION__);
783 if (ee->prop.maximized == max) return;
784 ee->prop.maximized = max;
785 ecore_wl_window_maximized_set(ee->engine.wl.win, max);
789 _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full)
791 LOGFN(__FILE__, __LINE__, __FUNCTION__);
793 if ((!ee) || (!ee->visible)) return;
794 if (ee->prop.fullscreen == full) return;
795 ee->prop.fullscreen = full;
796 ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
800 _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore)
802 LOGFN(__FILE__, __LINE__, __FUNCTION__);
805 ee->ignore_events = ignore;
806 /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
810 _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
812 Evas_Engine_Info_Wayland_Shm *einfo;
814 LOGFN(__FILE__, __LINE__, __FUNCTION__);
817 if ((ee->alpha == alpha)) return;
819 if (ee->engine.wl.win)
820 ecore_wl_window_transparent_set(ee->engine.wl.win, alpha);
821 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
823 einfo->info.destination_alpha = alpha;
824 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
825 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
826 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
831 _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
833 Evas_Engine_Info_Wayland_Shm *einfo;
835 LOGFN(__FILE__, __LINE__, __FUNCTION__);
838 if ((ee->transparent == transparent)) return;
839 ee->transparent = transparent;
840 if (ee->engine.wl.win)
841 ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
842 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
844 einfo->info.destination_alpha = transparent;
845 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
846 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
847 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
852 _ecore_evas_wl_render(Ecore_Evas *ee)
858 evas_norender(ee->evas);
861 Eina_List *ll = NULL, *updates = NULL;
862 Ecore_Evas *ee2 = NULL;
864 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
866 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
868 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
869 if (ee2->engine.func->fn_render)
870 rend |= ee2->engine.func->fn_render(ee2);
871 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
874 if ((updates = evas_render_updates(ee->evas)))
879 LOGFN(__FILE__, __LINE__, __FUNCTION__);
881 EINA_LIST_FOREACH(updates, l, r)
882 ecore_wl_window_damage(ee->engine.wl.win,
883 r->x, r->y, r->w, r->h);
887 evas_render_updates_free(updates);
888 _ecore_evas_idle_timeout_update(ee);
892 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
898 _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
900 LOGFN(__FILE__, __LINE__, __FUNCTION__);
904 ecore_wl_screen_size_get(w, h);
907 static struct wl_shm_pool *
908 _ecore_evas_wl_shm_pool_create(int size, void **data)
911 struct wl_shm_pool *pool;
915 LOGFN(__FILE__, __LINE__, __FUNCTION__);
917 if (!(shm = ecore_wl_shm_get())) return NULL;
919 strcpy(tmp, "/tmp/ecore-evas-wayland_shm-XXXXXX");
920 if ((fd = mkstemp(tmp)) < 0)
922 ERR("Could not create temporary file.");
926 if (ftruncate(fd, size) < 0)
928 ERR("Could not truncate temporary file.");
933 *data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
936 if (*data == MAP_FAILED)
938 ERR("mmap of temporary file failed.");
943 pool = wl_shm_create_pool(shm, fd, size);
951 _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool)
956 if ((ee->alpha) || (ee->transparent))
957 format = WL_SHM_FORMAT_ARGB8888;
959 format = WL_SHM_FORMAT_XRGB8888;
961 stride = (ee->w * sizeof(int));
963 ee->engine.wl.buffer =
964 wl_shm_pool_create_buffer(pool, 0, ee->w, ee->h, stride, format);
968 _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
970 LOGFN(__FILE__, __LINE__, __FUNCTION__);
973 if (ee->engine.wl.win)
975 ee->engine.wl.win->resizing = EINA_TRUE;
976 ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
981 _ecore_evas_wayland_shm_move(Ecore_Evas *ee, int x, int y)
983 LOGFN(__FILE__, __LINE__, __FUNCTION__);
986 if (ee->engine.wl.win)
988 ee->engine.wl.win->moving = EINA_TRUE;
989 ecore_wl_window_move(ee->engine.wl.win, x, y);
994 _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
997 Ecore_Wl_Event_Mouse_In *ev;
999 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1002 ee = ecore_event_window_match(ev->window);
1003 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1004 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1007 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
1008 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
1009 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
1010 // _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
1013 return ECORE_CALLBACK_PASS_ON;
1017 _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1020 Ecore_Wl_Event_Mouse_Out *ev;
1022 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1025 ee = ecore_event_window_match(ev->window);
1026 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1027 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1030 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
1031 // _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
1032 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
1033 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
1034 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
1035 ee->in = EINA_FALSE;
1037 return ECORE_CALLBACK_PASS_ON;
1041 _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
1044 Ecore_Wl_Event_Focus_In *ev;
1046 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1049 ee = ecore_event_window_match(ev->win);
1050 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1051 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1052 ee->prop.focused = 1;
1053 evas_focus_in(ee->evas);
1054 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1055 return ECORE_CALLBACK_PASS_ON;
1059 _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1062 Ecore_Wl_Event_Focus_In *ev;
1064 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1067 ee = ecore_event_window_match(ev->win);
1068 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1069 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1070 evas_focus_out(ee->evas);
1071 ee->prop.focused = 0;
1072 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1073 return ECORE_CALLBACK_PASS_ON;
1077 _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1080 Ecore_Wl_Event_Window_Configure *ev;
1082 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1085 ee = ecore_event_window_match(ev->win);
1086 if (!ee) return ECORE_CALLBACK_PASS_ON;
1087 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1089 if ((ee->x != ev->x) || (ee->y != ev->y))
1091 /* ee->x = ev->x; */
1092 /* ee->y = ev->y; */
1095 if (ee->func.fn_move) ee->func.fn_move(ee);
1097 if ((ee->req.w != ev->w) || (ee->req.h != ev->h))
1099 /* ee->w = ev->w; */
1100 /* ee->h = ev->h; */
1103 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1106 return ECORE_CALLBACK_PASS_ON;
1110 _ecore_evas_wl_smart_init(void)
1112 if (_ecore_evas_wl_smart) return;
1114 static const Evas_Smart_Class sc =
1116 "ecore_evas_wl_frame", EVAS_SMART_CLASS_VERSION,
1117 _ecore_evas_wl_smart_add,
1118 _ecore_evas_wl_smart_del,
1120 _ecore_evas_wl_smart_resize,
1121 _ecore_evas_wl_smart_show,
1122 _ecore_evas_wl_smart_hide,
1123 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
1125 _ecore_evas_wl_smart = evas_smart_class_new(&sc);
1130 _ecore_evas_wl_smart_add(Evas_Object *obj)
1132 EE_Wl_Smart_Data *sd;
1135 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1137 if (!(sd = calloc(1, sizeof(EE_Wl_Smart_Data)))) return;
1139 evas = evas_object_evas_get(obj);
1146 sd->frame = evas_object_rectangle_add(evas);
1147 evas_object_is_frame_object_set(sd->frame, EINA_TRUE);
1148 evas_object_color_set(sd->frame, 249, 249, 249, 255);
1149 evas_object_smart_member_add(sd->frame, obj);
1151 sd->text = evas_object_text_add(evas);
1152 evas_object_color_set(sd->text, 0, 0, 0, 255);
1153 evas_object_text_style_set(sd->text, EVAS_TEXT_STYLE_PLAIN);
1154 evas_object_text_font_set(sd->text, "Sans", 10);
1155 evas_object_text_text_set(sd->text, "Smart Test");
1157 evas_object_smart_data_set(obj, sd);
1161 _ecore_evas_wl_smart_del(Evas_Object *obj)
1163 EE_Wl_Smart_Data *sd;
1165 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1167 if (!(sd = evas_object_smart_data_get(obj))) return;
1168 evas_object_del(sd->text);
1169 evas_object_del(sd->frame);
1174 _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
1176 EE_Wl_Smart_Data *sd;
1178 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1180 if (!(sd = evas_object_smart_data_get(obj))) return;
1181 if ((sd->w == w) && (sd->h == h)) return;
1184 evas_object_resize(sd->frame, w, h);
1188 _ecore_evas_wl_smart_show(Evas_Object *obj)
1190 EE_Wl_Smart_Data *sd;
1192 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1194 if (!(sd = evas_object_smart_data_get(obj))) return;
1195 evas_object_show(sd->frame);
1196 evas_object_show(sd->text);
1200 _ecore_evas_wl_smart_hide(Evas_Object *obj)
1202 EE_Wl_Smart_Data *sd;
1204 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1206 if (!(sd = evas_object_smart_data_get(obj))) return;
1207 evas_object_hide(sd->text);
1208 evas_object_hide(sd->frame);
1211 static Evas_Object *
1212 _ecore_evas_wl_frame_add(Evas *evas)
1214 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1216 _ecore_evas_wl_smart_init();
1217 return evas_object_smart_add(evas, _ecore_evas_wl_smart);
1222 ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, unsigned int parent __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, Eina_Bool frame __UNUSED__)