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, // window group set
155 NULL, // demand attention set
156 NULL, // focus skip set
157 _ecore_evas_wl_render,
158 _ecore_evas_wl_screen_geometry_get
161 /* external variables */
163 /* external functions */
165 ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
167 Ecore_Wl_Window *p = NULL;
168 Evas_Engine_Info_Wayland_Shm *einfo;
170 int method = 0, count = 0;
172 LOGFN(__FILE__, __LINE__, __FUNCTION__);
174 if (!(method = evas_render_method_lookup("wayland_shm")))
176 ERR("Render method lookup failed for Wayland_Shm");
180 count = ecore_wl_init(disp_name);
183 ERR("Failed to initialize Ecore_Wayland");
187 ecore_wl_display_iterate();
189 if (!(ee = calloc(1, sizeof(Ecore_Evas))))
191 ERR("Failed to allocate Ecore_Evas");
196 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
198 _ecore_evas_wl_init();
200 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
202 ee->driver = "wayland_shm";
203 if (disp_name) ee->name = strdup(disp_name);
217 ee->prop.max.w = 32767;
218 ee->prop.max.h = 32767;
220 ee->prop.request_pos = 0;
222 ee->prop.draw_frame = frame;
223 ee->alpha = EINA_FALSE;
225 ee->evas = evas_new();
226 evas_data_attach_set(ee->evas, ee);
227 evas_output_method_set(ee->evas, method);
228 evas_output_size_set(ee->evas, ee->w, ee->h);
229 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
231 /* FIXME: This needs to be set based on theme & scale */
232 if (ee->prop.draw_frame)
233 evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
235 if (parent) p = ecore_wl_window_find(parent);
237 /* FIXME: Get if parent is alpha, and set */
239 ee->engine.wl.parent = p;
241 ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
242 ee->prop.window = ee->engine.wl.win->id;
244 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
246 einfo->info.rotation = ee->rotation;
247 einfo->info.destination_alpha = ee->alpha;
248 einfo->info.rotation = ee->rotation;
249 einfo->info.debug = EINA_FALSE;
250 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
252 ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
254 _ecore_evas_wl_shutdown();
261 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
263 _ecore_evas_wl_shutdown();
268 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free);
270 if (ee->prop.draw_frame)
272 ee->engine.wl.frame = _ecore_evas_wl_frame_add(ee->evas);
273 evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
274 evas_object_move(ee->engine.wl.frame, 0, 0);
277 _ecore_evas_register(ee);
278 ecore_evas_input_event_register(ee);
280 ecore_event_window_register(ee->prop.window, ee, ee->evas,
281 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
282 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
283 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
284 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
286 // evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
291 /* local functions */
293 _ecore_evas_wl_init(void)
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
297 if (++_ecore_evas_wl_init_count != 1)
298 return _ecore_evas_wl_init_count;
300 _ecore_evas_wl_event_hdls[0] =
301 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
302 _ecore_evas_wl_cb_mouse_in, NULL);
303 _ecore_evas_wl_event_hdls[1] =
304 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
305 _ecore_evas_wl_cb_mouse_out, NULL);
306 _ecore_evas_wl_event_hdls[2] =
307 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
308 _ecore_evas_wl_cb_focus_in, NULL);
309 _ecore_evas_wl_event_hdls[3] =
310 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
311 _ecore_evas_wl_cb_focus_out, NULL);
312 _ecore_evas_wl_event_hdls[4] =
313 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
314 _ecore_evas_wl_cb_window_configure, NULL);
316 ecore_event_evas_init();
318 return _ecore_evas_wl_init_count;
322 _ecore_evas_wl_shutdown(void)
326 LOGFN(__FILE__, __LINE__, __FUNCTION__);
328 if (--_ecore_evas_wl_init_count != 0)
329 return _ecore_evas_wl_init_count;
331 for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
333 if (_ecore_evas_wl_event_hdls[i])
334 ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
337 ecore_event_evas_shutdown();
339 return _ecore_evas_wl_init_count;
343 _ecore_evas_wl_pre_free(Ecore_Evas *ee)
345 LOGFN(__FILE__, __LINE__, __FUNCTION__);
348 if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
352 _ecore_evas_wl_free(Ecore_Evas *ee)
354 LOGFN(__FILE__, __LINE__, __FUNCTION__);
356 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
357 ee->engine.wl.buffer = NULL;
359 if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
360 ee->engine.wl.win = NULL;
362 ecore_event_window_unregister(ee->prop.window);
363 ecore_evas_input_event_unregister(ee);
365 _ecore_evas_wl_shutdown();
370 _ecore_evas_wl_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
372 LOGFN(__FILE__, __LINE__, __FUNCTION__);
375 ee->func.fn_resize = func;
379 _ecore_evas_wl_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
381 LOGFN(__FILE__, __LINE__, __FUNCTION__);
384 ee->func.fn_move = func;
388 _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
390 LOGFN(__FILE__, __LINE__, __FUNCTION__);
393 ee->func.fn_delete_request = func;
397 _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
399 LOGFN(__FILE__, __LINE__, __FUNCTION__);
402 ee->func.fn_focus_in = func;
406 _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
408 LOGFN(__FILE__, __LINE__, __FUNCTION__);
411 ee->func.fn_focus_out = func;
415 _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
417 LOGFN(__FILE__, __LINE__, __FUNCTION__);
420 ee->func.fn_mouse_in = func;
424 _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
426 LOGFN(__FILE__, __LINE__, __FUNCTION__);
429 ee->func.fn_mouse_out = func;
433 _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
435 LOGFN(__FILE__, __LINE__, __FUNCTION__);
441 if ((ee->x != x) || (ee->y != y))
445 if (ee->engine.wl.win)
446 ecore_wl_window_update_location(ee->engine.wl.win, x, y);
447 if (ee->func.fn_move) ee->func.fn_move(ee);
452 _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
454 Evas_Engine_Info_Wayland_Shm *einfo;
456 LOGFN(__FILE__, __LINE__, __FUNCTION__);
462 if (ee->prop.min.w > w) w = ee->prop.min.w;
463 else if (w > ee->prop.max.w) w = ee->prop.max.w;
464 if (ee->prop.min.h > h) h = ee->prop.min.h;
465 else if (h > ee->prop.max.h) h = ee->prop.max.h;
470 if ((ee->w != w) || (ee->h != h))
475 if ((ee->rotation == 90) || (ee->rotation == 270))
477 evas_output_size_set(ee->evas, h, w);
478 evas_output_viewport_set(ee->evas, 0, 0, h, w);
482 evas_output_size_set(ee->evas, w, h);
483 evas_output_viewport_set(ee->evas, 0, 0, w, h);
486 if (ee->prop.avoid_damage)
490 pdam = ecore_evas_avoid_damage_get(ee);
491 ecore_evas_avoid_damage_set(ee, 0);
492 ecore_evas_avoid_damage_set(ee, pdam);
495 if (ee->engine.wl.frame)
496 evas_object_resize(ee->engine.wl.frame, w, h);
498 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
499 ee->engine.wl.buffer = NULL;
501 _ecore_evas_wl_ensure_pool_size(ee, w, h);
503 if (ee->engine.wl.pool)
504 _ecore_evas_wl_buffer_new(ee, ee->engine.wl.pool);
506 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
509 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
513 einfo->info.dest = ee->engine.wl.pool_data;
514 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
516 if (ee->engine.wl.win)
518 ecore_wl_window_buffer_attach(ee->engine.wl.win,
519 ee->engine.wl.buffer, 0, 0);
520 ecore_wl_window_update_size(ee->engine.wl.win, w, h);
523 if (ee->func.fn_resize) ee->func.fn_resize(ee);
528 _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
530 LOGFN(__FILE__, __LINE__, __FUNCTION__);
533 if ((ee->x != x) || (ee->y != y))
534 _ecore_evas_wl_move(ee, x, y);
535 if ((ee->w != w) || (ee->h != h))
536 _ecore_evas_wl_resize(ee, w, h);
540 _ecore_evas_wl_ensure_pool_size(Ecore_Evas *ee, int w, int h)
545 stride = w * sizeof(int);
548 if ((ee->engine.wl.pool) && (len < ee->engine.wl.pool_size))
552 struct wl_shm_pool *pool = NULL;
556 if (ee->engine.wl.pool)
557 wl_shm_pool_destroy(ee->engine.wl.pool);
560 * Make the pool 1.5 times the current requirement to allow growth
561 * without requiring a new pool allocation
564 pool = _ecore_evas_wl_shm_pool_create(size, &data);
566 ee->engine.wl.pool = pool;
567 ee->engine.wl.pool_size = size;
568 ee->engine.wl.pool_data = data;
573 _ecore_evas_wl_show(Ecore_Evas *ee)
575 Evas_Engine_Info_Wayland_Shm *einfo;
577 LOGFN(__FILE__, __LINE__, __FUNCTION__);
579 if ((!ee) || (ee->visible)) return;
581 _ecore_evas_wl_ensure_pool_size(ee, ee->w, ee->h);
583 if (ee->engine.wl.pool)
584 _ecore_evas_wl_buffer_new(ee, ee->engine.wl.pool);
586 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
589 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
593 einfo->info.dest = ee->engine.wl.pool_data;
594 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
596 /* ecore_wl_flush(); */
598 if (ee->engine.wl.win)
600 ecore_wl_window_show(ee->engine.wl.win);
601 ecore_wl_window_buffer_attach(ee->engine.wl.win,
602 ee->engine.wl.buffer, 0, 0);
603 ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
605 if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
606 wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
608 if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
609 wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
613 if (ee->engine.wl.frame)
615 evas_object_show(ee->engine.wl.frame);
616 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
620 if (ee->func.fn_show) ee->func.fn_show(ee);
624 _ecore_evas_wl_hide(Ecore_Evas *ee)
626 Evas_Engine_Info_Wayland_Shm *einfo;
628 LOGFN(__FILE__, __LINE__, __FUNCTION__);
630 if ((!ee) || (!ee->visible)) return;
632 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
633 ee->engine.wl.buffer = NULL;
635 munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
637 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
638 if ((einfo) && (einfo->info.dest))
640 einfo->info.dest = NULL;
641 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
644 ecore_wl_window_hide(ee->engine.wl.win);
647 ee->should_be_visible = 0;
649 if (ee->func.fn_hide) ee->func.fn_hide(ee);
653 _ecore_evas_wl_raise(Ecore_Evas *ee)
655 LOGFN(__FILE__, __LINE__, __FUNCTION__);
657 if ((!ee) || (!ee->visible)) return;
658 ecore_wl_window_raise(ee->engine.wl.win);
662 _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
664 LOGFN(__FILE__, __LINE__, __FUNCTION__);
667 if (ee->prop.title) free(ee->prop.title);
668 ee->prop.title = NULL;
669 if (title) ee->prop.title = strdup(title);
670 if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
672 EE_Wl_Smart_Data *sd;
674 if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return;
675 evas_object_text_text_set(sd->text, ee->prop.title);
678 if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
679 wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
684 _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
686 LOGFN(__FILE__, __LINE__, __FUNCTION__);
689 if (ee->prop.name) free(ee->prop.name);
690 if (ee->prop.clas) free(ee->prop.clas);
691 ee->prop.name = NULL;
692 ee->prop.clas = NULL;
693 if (n) ee->prop.name = strdup(n);
694 if (c) ee->prop.clas = strdup(c);
696 if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
697 wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
702 _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h)
704 LOGFN(__FILE__, __LINE__, __FUNCTION__);
709 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
715 _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h)
717 LOGFN(__FILE__, __LINE__, __FUNCTION__);
722 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
728 _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h)
730 LOGFN(__FILE__, __LINE__, __FUNCTION__);
735 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
741 _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h)
743 LOGFN(__FILE__, __LINE__, __FUNCTION__);
748 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
754 _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer)
756 LOGFN(__FILE__, __LINE__, __FUNCTION__);
759 if (ee->prop.layer == layer) return;
760 if (layer < 1) layer = 1;
761 else if (layer > 255) layer = 255;
762 ee->prop.layer = layer;
766 _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify)
768 LOGFN(__FILE__, __LINE__, __FUNCTION__);
771 if (ee->prop.iconified == iconify) return;
772 ee->prop.iconified = iconify;
773 /* FIXME: Implement this in Wayland someshow */
777 _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max)
779 LOGFN(__FILE__, __LINE__, __FUNCTION__);
782 if (ee->prop.maximized == max) return;
783 ee->prop.maximized = max;
784 ecore_wl_window_maximized_set(ee->engine.wl.win, max);
788 _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full)
790 LOGFN(__FILE__, __LINE__, __FUNCTION__);
792 if ((!ee) || (!ee->visible)) return;
793 if (ee->prop.fullscreen == full) return;
794 ee->prop.fullscreen = full;
795 ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
799 _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore)
801 LOGFN(__FILE__, __LINE__, __FUNCTION__);
804 ee->ignore_events = ignore;
805 /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
809 _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
811 Evas_Engine_Info_Wayland_Shm *einfo;
813 LOGFN(__FILE__, __LINE__, __FUNCTION__);
816 if ((ee->alpha == alpha)) return;
818 if (ee->engine.wl.win)
819 ecore_wl_window_transparent_set(ee->engine.wl.win, alpha);
820 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
822 einfo->info.destination_alpha = alpha;
823 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
824 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
825 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
830 _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
832 Evas_Engine_Info_Wayland_Shm *einfo;
834 LOGFN(__FILE__, __LINE__, __FUNCTION__);
837 if ((ee->transparent == transparent)) return;
838 ee->transparent = transparent;
839 if (ee->engine.wl.win)
840 ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
841 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
843 einfo->info.destination_alpha = transparent;
844 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
845 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
846 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
851 _ecore_evas_wl_render(Ecore_Evas *ee)
857 evas_norender(ee->evas);
860 Eina_List *ll = NULL, *updates = NULL;
861 Ecore_Evas *ee2 = NULL;
863 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
865 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
867 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
868 if (ee2->engine.func->fn_render)
869 rend |= ee2->engine.func->fn_render(ee2);
870 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
873 if ((updates = evas_render_updates(ee->evas)))
878 LOGFN(__FILE__, __LINE__, __FUNCTION__);
880 EINA_LIST_FOREACH(updates, l, r)
881 ecore_wl_window_damage(ee->engine.wl.win,
882 r->x, r->y, r->w, r->h);
886 evas_render_updates_free(updates);
887 _ecore_evas_idle_timeout_update(ee);
891 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
897 _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
899 LOGFN(__FILE__, __LINE__, __FUNCTION__);
903 ecore_wl_screen_size_get(w, h);
906 static struct wl_shm_pool *
907 _ecore_evas_wl_shm_pool_create(int size, void **data)
910 struct wl_shm_pool *pool;
914 LOGFN(__FILE__, __LINE__, __FUNCTION__);
916 if (!(shm = ecore_wl_shm_get())) return NULL;
918 strcpy(tmp, "/tmp/ecore-evas-wayland_shm-XXXXXX");
919 if ((fd = mkstemp(tmp)) < 0)
921 ERR("Could not create temporary file.");
925 if (ftruncate(fd, size) < 0)
927 ERR("Could not truncate temporary file.");
932 *data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
935 if (*data == MAP_FAILED)
937 ERR("mmap of temporary file failed.");
942 pool = wl_shm_create_pool(shm, fd, size);
950 _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool)
955 if ((ee->alpha) || (ee->transparent))
956 format = WL_SHM_FORMAT_ARGB8888;
958 format = WL_SHM_FORMAT_XRGB8888;
960 stride = (ee->w * sizeof(int));
962 ee->engine.wl.buffer =
963 wl_shm_pool_create_buffer(pool, 0, ee->w, ee->h, stride, format);
967 _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
969 LOGFN(__FILE__, __LINE__, __FUNCTION__);
972 if (ee->engine.wl.win)
974 ee->engine.wl.win->resizing = EINA_TRUE;
975 ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
980 _ecore_evas_wayland_shm_move(Ecore_Evas *ee, int x, int y)
982 LOGFN(__FILE__, __LINE__, __FUNCTION__);
985 if (ee->engine.wl.win)
987 ee->engine.wl.win->moving = EINA_TRUE;
988 ecore_wl_window_move(ee->engine.wl.win, x, y);
993 _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
996 Ecore_Wl_Event_Mouse_In *ev;
998 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1001 ee = ecore_event_window_match(ev->window);
1002 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1003 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1006 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
1007 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
1008 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
1009 // _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
1012 return ECORE_CALLBACK_PASS_ON;
1016 _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1019 Ecore_Wl_Event_Mouse_Out *ev;
1021 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1024 ee = ecore_event_window_match(ev->window);
1025 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1026 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1029 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
1030 // _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
1031 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
1032 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
1033 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
1034 ee->in = EINA_FALSE;
1036 return ECORE_CALLBACK_PASS_ON;
1040 _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
1043 Ecore_Wl_Event_Focus_In *ev;
1045 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1048 ee = ecore_event_window_match(ev->win);
1049 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1050 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1051 ee->prop.focused = 1;
1052 evas_focus_in(ee->evas);
1053 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1054 return ECORE_CALLBACK_PASS_ON;
1058 _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1061 Ecore_Wl_Event_Focus_In *ev;
1063 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1066 ee = ecore_event_window_match(ev->win);
1067 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1068 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1069 evas_focus_out(ee->evas);
1070 ee->prop.focused = 0;
1071 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1072 return ECORE_CALLBACK_PASS_ON;
1076 _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1079 Ecore_Wl_Event_Window_Configure *ev;
1081 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1084 ee = ecore_event_window_match(ev->win);
1085 if (!ee) return ECORE_CALLBACK_PASS_ON;
1086 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1088 if ((ee->x != ev->x) || (ee->y != ev->y))
1090 /* ee->x = ev->x; */
1091 /* ee->y = ev->y; */
1094 if (ee->func.fn_move) ee->func.fn_move(ee);
1096 if ((ee->req.w != ev->w) || (ee->req.h != ev->h))
1098 /* ee->w = ev->w; */
1099 /* ee->h = ev->h; */
1102 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1105 return ECORE_CALLBACK_PASS_ON;
1109 _ecore_evas_wl_smart_init(void)
1111 if (_ecore_evas_wl_smart) return;
1113 static const Evas_Smart_Class sc =
1115 "ecore_evas_wl_frame", EVAS_SMART_CLASS_VERSION,
1116 _ecore_evas_wl_smart_add,
1117 _ecore_evas_wl_smart_del,
1119 _ecore_evas_wl_smart_resize,
1120 _ecore_evas_wl_smart_show,
1121 _ecore_evas_wl_smart_hide,
1122 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
1124 _ecore_evas_wl_smart = evas_smart_class_new(&sc);
1129 _ecore_evas_wl_smart_add(Evas_Object *obj)
1131 EE_Wl_Smart_Data *sd;
1134 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1136 if (!(sd = calloc(1, sizeof(EE_Wl_Smart_Data)))) return;
1138 evas = evas_object_evas_get(obj);
1145 sd->frame = evas_object_rectangle_add(evas);
1146 evas_object_is_frame_object_set(sd->frame, EINA_TRUE);
1147 evas_object_color_set(sd->frame, 249, 249, 249, 255);
1148 evas_object_smart_member_add(sd->frame, obj);
1150 sd->text = evas_object_text_add(evas);
1151 evas_object_color_set(sd->text, 0, 0, 0, 255);
1152 evas_object_text_style_set(sd->text, EVAS_TEXT_STYLE_PLAIN);
1153 evas_object_text_font_set(sd->text, "Sans", 10);
1154 evas_object_text_text_set(sd->text, "Smart Test");
1156 evas_object_smart_data_set(obj, sd);
1160 _ecore_evas_wl_smart_del(Evas_Object *obj)
1162 EE_Wl_Smart_Data *sd;
1164 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1166 if (!(sd = evas_object_smart_data_get(obj))) return;
1167 evas_object_del(sd->text);
1168 evas_object_del(sd->frame);
1173 _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
1175 EE_Wl_Smart_Data *sd;
1177 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1179 if (!(sd = evas_object_smart_data_get(obj))) return;
1180 if ((sd->w == w) && (sd->h == h)) return;
1183 evas_object_resize(sd->frame, w, h);
1187 _ecore_evas_wl_smart_show(Evas_Object *obj)
1189 EE_Wl_Smart_Data *sd;
1191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1193 if (!(sd = evas_object_smart_data_get(obj))) return;
1194 evas_object_show(sd->frame);
1195 evas_object_show(sd->text);
1199 _ecore_evas_wl_smart_hide(Evas_Object *obj)
1201 EE_Wl_Smart_Data *sd;
1203 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1205 if (!(sd = evas_object_smart_data_get(obj))) return;
1206 evas_object_hide(sd->text);
1207 evas_object_hide(sd->frame);
1210 static Evas_Object *
1211 _ecore_evas_wl_frame_add(Evas *evas)
1213 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1215 _ecore_evas_wl_smart_init();
1216 return evas_object_smart_add(evas, _ecore_evas_wl_smart);
1221 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__)