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_show(Ecore_Evas *ee);
58 static void _ecore_evas_wl_hide(Ecore_Evas *ee);
59 static void _ecore_evas_wl_raise(Ecore_Evas *ee);
60 static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title);
61 static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
62 static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h);
63 static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h);
64 static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h);
65 static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h);
66 static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer);
67 static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify);
68 static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max);
69 static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full);
70 static void _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore);
71 static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
72 static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
73 static int _ecore_evas_wl_render(Ecore_Evas *ee);
74 static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h);
75 static struct wl_shm_pool *_ecore_evas_wl_shm_pool_create(int size, void **data);
77 static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool);
79 static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
80 static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
81 static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
82 static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
83 static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
85 /* SMART stuff for frame */
86 static Evas_Smart *_ecore_evas_wl_smart = NULL;
88 static void _ecore_evas_wl_smart_init(void);
89 static void _ecore_evas_wl_smart_add(Evas_Object *obj);
90 static void _ecore_evas_wl_smart_del(Evas_Object *obj);
91 static void _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
92 static void _ecore_evas_wl_smart_show(Evas_Object *obj);
93 static void _ecore_evas_wl_smart_hide(Evas_Object *obj);
95 static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
98 static int _ecore_evas_wl_init_count = 0;
99 static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
101 static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
104 _ecore_evas_wl_callback_resize_set,
105 _ecore_evas_wl_callback_move_set,
108 _ecore_evas_wl_callback_delete_request_set,
110 _ecore_evas_wl_callback_focus_in_set,
111 _ecore_evas_wl_callback_focus_out_set,
112 _ecore_evas_wl_callback_mouse_in_set,
113 _ecore_evas_wl_callback_mouse_out_set,
115 NULL, // unsticky_set
116 NULL, // pre_render_set
117 NULL, // post_render_set
119 NULL, // managed_move
120 _ecore_evas_wl_resize,
122 NULL, // rotation_set
126 _ecore_evas_wl_raise,
129 _ecore_evas_wl_title_set,
130 _ecore_evas_wl_name_class_set,
131 _ecore_evas_wl_size_min_set,
132 _ecore_evas_wl_size_max_set,
133 _ecore_evas_wl_size_base_set,
134 _ecore_evas_wl_size_step_set,
135 NULL, // object_cursor_set
136 _ecore_evas_wl_layer_set,
138 _ecore_evas_wl_iconified_set,
139 NULL, // borderless set
140 NULL, // override set
141 _ecore_evas_wl_maximized_set,
142 _ecore_evas_wl_fullscreen_set,
143 NULL, // func avoid_damage set
144 NULL, // func withdrawn set
145 NULL, // func sticky set
146 _ecore_evas_wl_ignore_events_set,
147 _ecore_evas_wl_alpha_set,
148 _ecore_evas_wl_transparent_set,
155 _ecore_evas_wl_render,
156 _ecore_evas_wl_screen_geometry_get
159 /* external variables */
161 /* external functions */
163 ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
165 Ecore_Wl_Window *p = NULL;
166 Evas_Engine_Info_Wayland_Shm *einfo;
168 int method = 0, count = 0;
170 LOGFN(__FILE__, __LINE__, __FUNCTION__);
172 if (!(method = evas_render_method_lookup("wayland_shm")))
174 ERR("Render method lookup failed for Wayland_Shm");
178 count = ecore_wl_init(disp_name);
181 ERR("Failed to initialize Ecore_Wayland");
185 ecore_wl_display_iterate();
187 if (!(ee = calloc(1, sizeof(Ecore_Evas))))
189 ERR("Failed to allocate Ecore_Evas");
194 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
196 _ecore_evas_wl_init();
198 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
200 ee->driver = "wayland_shm";
201 if (disp_name) ee->name = strdup(disp_name);
215 ee->prop.max.w = 32767;
216 ee->prop.max.h = 32767;
218 ee->prop.request_pos = 0;
220 ee->prop.draw_frame = frame;
222 ee->evas = evas_new();
223 evas_data_attach_set(ee->evas, ee);
224 evas_output_method_set(ee->evas, method);
225 evas_output_size_set(ee->evas, ee->w, ee->h);
226 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
228 /* FIXME: This needs to be set based on theme & scale */
229 if (ee->prop.draw_frame)
230 evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
233 p = ecore_wl_window_find(parent);
235 /* FIXME: Get if parent is alpha, and set */
237 ee->engine.wl.parent = p;
239 ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
240 ee->prop.window = ee->engine.wl.win->id;
242 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
244 einfo->info.rotation = ee->rotation;
245 einfo->info.debug = EINA_FALSE;
246 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
248 ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
250 _ecore_evas_wl_shutdown();
257 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
259 _ecore_evas_wl_shutdown();
264 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free);
266 if (ee->prop.draw_frame)
268 ee->engine.wl.frame = _ecore_evas_wl_frame_add(ee->evas);
269 evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
270 evas_object_move(ee->engine.wl.frame, 0, 0);
273 ecore_evas_input_event_register(ee);
274 _ecore_evas_register(ee);
276 ecore_event_window_register(ee->prop.window, ee, ee->evas,
277 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
278 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
279 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
280 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
282 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
287 /* local functions */
289 _ecore_evas_wl_init(void)
291 LOGFN(__FILE__, __LINE__, __FUNCTION__);
293 if (++_ecore_evas_wl_init_count != 1)
294 return _ecore_evas_wl_init_count;
296 _ecore_evas_wl_event_hdls[0] =
297 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
298 _ecore_evas_wl_cb_mouse_in, NULL);
299 _ecore_evas_wl_event_hdls[1] =
300 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
301 _ecore_evas_wl_cb_mouse_out, NULL);
302 _ecore_evas_wl_event_hdls[2] =
303 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
304 _ecore_evas_wl_cb_focus_in, NULL);
305 _ecore_evas_wl_event_hdls[3] =
306 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
307 _ecore_evas_wl_cb_focus_out, NULL);
308 _ecore_evas_wl_event_hdls[4] =
309 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
310 _ecore_evas_wl_cb_window_configure, NULL);
312 ecore_event_evas_init();
314 return _ecore_evas_wl_init_count;
318 _ecore_evas_wl_shutdown(void)
322 LOGFN(__FILE__, __LINE__, __FUNCTION__);
324 if (--_ecore_evas_wl_init_count != 0)
325 return _ecore_evas_wl_init_count;
327 for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
329 if (_ecore_evas_wl_event_hdls[i])
330 ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
333 ecore_event_evas_shutdown();
335 return _ecore_evas_wl_init_count;
339 _ecore_evas_wl_pre_free(Ecore_Evas *ee)
341 /* Evas_Engine_Info_Wayland_Shm *einfo; */
343 LOGFN(__FILE__, __LINE__, __FUNCTION__);
345 if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
348 /* einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); */
349 /* if ((einfo) && (einfo->info.dest)) */
353 /* ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); */
354 /* if (!ret) ERR("Failed to unmap engine destination: %m"); */
359 _ecore_evas_wl_free(Ecore_Evas *ee)
361 LOGFN(__FILE__, __LINE__, __FUNCTION__);
363 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
364 ee->engine.wl.buffer = NULL;
366 if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
367 ee->engine.wl.win = NULL;
369 ecore_event_window_unregister(ee->prop.window);
370 ecore_evas_input_event_unregister(ee);
372 _ecore_evas_wl_shutdown();
377 _ecore_evas_wl_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
379 LOGFN(__FILE__, __LINE__, __FUNCTION__);
382 ee->func.fn_resize = func;
386 _ecore_evas_wl_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
388 LOGFN(__FILE__, __LINE__, __FUNCTION__);
391 ee->func.fn_move = func;
395 _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
397 LOGFN(__FILE__, __LINE__, __FUNCTION__);
400 ee->func.fn_delete_request = func;
404 _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
406 LOGFN(__FILE__, __LINE__, __FUNCTION__);
409 ee->func.fn_focus_in = func;
413 _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
415 LOGFN(__FILE__, __LINE__, __FUNCTION__);
418 ee->func.fn_focus_out = func;
422 _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
424 LOGFN(__FILE__, __LINE__, __FUNCTION__);
427 ee->func.fn_mouse_in = func;
431 _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
433 LOGFN(__FILE__, __LINE__, __FUNCTION__);
436 ee->func.fn_mouse_out = func;
440 _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
442 LOGFN(__FILE__, __LINE__, __FUNCTION__);
449 if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y);
450 if (ee->func.fn_move) ee->func.fn_move(ee);
454 _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
456 /* Evas_Engine_Info_Wayland_Shm *einfo; */
461 // if ((ee->w == w) && (ee->h == h)) return;
463 LOGFN(__FILE__, __LINE__, __FUNCTION__);
465 if (ee->prop.min.w > w) w = ee->prop.min.w;
466 else if (w > ee->prop.max.w) w = ee->prop.max.w;
467 if (ee->prop.min.h > h) h = ee->prop.min.h;
468 else if (h > ee->prop.max.h) h = ee->prop.max.h;
476 // ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h);
478 /* einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); */
479 /* if ((einfo) && (einfo->info.dest)) */
487 /* ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); */
488 /* if (!ret) ERR("Failed to unmap engine destination: %m"); */
490 /* else if (!einfo) */
492 /* ERR("Failed to get Evas Engine Info for '%s'", ee->driver); */
496 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
497 ee->engine.wl.buffer = NULL;
499 if (ee->engine.wl.pool)
500 _ecore_evas_wl_buffer_new(ee, ee->engine.wl.pool);
502 /* change evas output & viewport sizes */
503 evas_output_size_set(ee->evas, ee->w, ee->h);
504 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
505 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
506 if (ee->engine.wl.frame)
507 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
509 /* set new engine destination */
510 /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
513 // wl_buffer_damage(ee->engine.wl.buffer, 0, 0, ee->w, ee->h);
515 if (ee->engine.wl.win)
517 ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer,
519 /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */
520 /* ecore_wl_flush(); */
521 ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
524 if (ee->func.fn_resize) ee->func.fn_resize(ee);
528 _ecore_evas_wl_show(Ecore_Evas *ee)
530 Evas_Engine_Info_Wayland_Shm *einfo;
531 struct wl_shm_pool *pool = NULL;
536 LOGFN(__FILE__, __LINE__, __FUNCTION__);
538 if ((!ee) || (ee->visible)) return;
540 if (ee->engine.wl.win)
541 ecore_wl_window_show(ee->engine.wl.win);
543 stride = ee->w * sizeof(int);
544 len = stride * ee->h;
546 if ((ee->engine.wl.pool) && (len < ee->engine.wl.pool_size))
548 pool = ee->engine.wl.pool;
549 data = ee->engine.wl.pool_data;
555 ecore_wl_screen_size_get(&w, NULL);
557 /* set a default width */
558 if (w == 0) w = 1024;
562 _ecore_evas_wl_shm_pool_create(size, &data);
563 ee->engine.wl.pool_size = size;
566 if (data != ee->engine.wl.pool_data)
568 if (ee->engine.wl.pool)
569 wl_shm_pool_destroy(ee->engine.wl.pool);
571 ee->engine.wl.pool = pool;
572 ee->engine.wl.pool_data = data;
575 _ecore_evas_wl_buffer_new(ee, pool);
577 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
580 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
584 einfo->info.dest = data;
585 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
587 /* ecore_wl_flush(); */
589 if (ee->engine.wl.win)
591 /* ecore_wl_window_show(ee->engine.wl.win); */
592 ecore_wl_window_buffer_attach(ee->engine.wl.win,
593 ee->engine.wl.buffer, 0, 0);
596 if (ee->engine.wl.frame)
598 evas_object_show(ee->engine.wl.frame);
599 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
603 if (ee->func.fn_show) ee->func.fn_show(ee);
607 _ecore_evas_wl_hide(Ecore_Evas *ee)
609 Evas_Engine_Info_Wayland_Shm *einfo;
611 LOGFN(__FILE__, __LINE__, __FUNCTION__);
613 if ((!ee) || (!ee->visible)) return;
615 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
616 ee->engine.wl.buffer = NULL;
618 munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
620 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
621 if ((einfo) && (einfo->info.dest))
623 einfo->info.dest = NULL;
624 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
627 ecore_wl_window_hide(ee->engine.wl.win);
630 ee->should_be_visible = 0;
632 if (ee->func.fn_hide) ee->func.fn_hide(ee);
636 _ecore_evas_wl_raise(Ecore_Evas *ee)
638 LOGFN(__FILE__, __LINE__, __FUNCTION__);
640 if ((!ee) || (!ee->visible)) return;
641 ecore_wl_window_raise(ee->engine.wl.win);
645 _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
647 LOGFN(__FILE__, __LINE__, __FUNCTION__);
650 if (ee->prop.title) free(ee->prop.title);
651 ee->prop.title = NULL;
652 if (title) ee->prop.title = strdup(title);
653 if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
655 EE_Wl_Smart_Data *sd;
657 if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return;
658 evas_object_text_text_set(sd->text, ee->prop.title);
663 _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
665 LOGFN(__FILE__, __LINE__, __FUNCTION__);
668 if (ee->prop.name) free(ee->prop.name);
669 if (ee->prop.clas) free(ee->prop.clas);
670 ee->prop.name = NULL;
671 ee->prop.clas = NULL;
672 if (n) ee->prop.name = strdup(n);
673 if (c) ee->prop.clas = strdup(c);
674 /* FIXME: Forward these changes to Wayland somehow */
678 _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h)
680 LOGFN(__FILE__, __LINE__, __FUNCTION__);
685 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
691 _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h)
693 LOGFN(__FILE__, __LINE__, __FUNCTION__);
698 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
704 _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h)
706 LOGFN(__FILE__, __LINE__, __FUNCTION__);
711 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
717 _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h)
719 LOGFN(__FILE__, __LINE__, __FUNCTION__);
724 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
730 _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer)
732 LOGFN(__FILE__, __LINE__, __FUNCTION__);
735 if (ee->prop.layer == layer) return;
736 if (layer < 1) layer = 1;
737 else if (layer > 255) layer = 255;
738 ee->prop.layer = layer;
742 _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify)
744 LOGFN(__FILE__, __LINE__, __FUNCTION__);
747 if (ee->prop.iconified == iconify) return;
748 ee->prop.iconified = iconify;
749 /* FIXME: Implement this in Wayland someshow */
753 _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max)
755 LOGFN(__FILE__, __LINE__, __FUNCTION__);
758 if (ee->prop.maximized == max) return;
759 ee->prop.maximized = max;
760 ecore_wl_window_maximized_set(ee->engine.wl.win, max);
764 _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full)
766 LOGFN(__FILE__, __LINE__, __FUNCTION__);
768 if ((!ee) || (!ee->visible)) return;
769 if (ee->prop.fullscreen == full) return;
770 ee->prop.fullscreen = full;
771 ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
775 _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore)
777 LOGFN(__FILE__, __LINE__, __FUNCTION__);
780 ee->ignore_events = ignore;
781 /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
785 _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
787 Evas_Engine_Info_Wayland_Shm *einfo;
789 LOGFN(__FILE__, __LINE__, __FUNCTION__);
792 if ((ee->alpha == alpha)) return;
794 if (ee->engine.wl.win)
795 ecore_wl_window_transparent_set(ee->engine.wl.win, alpha);
796 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
798 einfo->info.destination_alpha = alpha;
799 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
800 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
801 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
806 _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
808 Evas_Engine_Info_Wayland_Shm *einfo;
810 LOGFN(__FILE__, __LINE__, __FUNCTION__);
813 if ((ee->transparent == transparent)) return;
814 ee->transparent = transparent;
815 if (ee->engine.wl.win)
816 ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
817 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
819 einfo->info.destination_alpha = transparent;
820 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
821 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
822 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
827 _ecore_evas_wl_render(Ecore_Evas *ee)
833 evas_norender(ee->evas);
836 Eina_List *ll = NULL, *updates = NULL;
837 Ecore_Evas *ee2 = NULL;
839 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
841 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
843 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
844 if (ee2->engine.func->fn_render)
845 rend |= ee2->engine.func->fn_render(ee2);
846 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
849 if ((updates = evas_render_updates(ee->evas)))
854 LOGFN(__FILE__, __LINE__, __FUNCTION__);
856 EINA_LIST_FOREACH(updates, l, r)
857 ecore_wl_window_damage(ee->engine.wl.win,
858 r->x, r->y, r->w, r->h);
862 evas_render_updates_free(updates);
863 _ecore_evas_idle_timeout_update(ee);
867 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
873 _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
875 LOGFN(__FILE__, __LINE__, __FUNCTION__);
879 ecore_wl_screen_size_get(w, h);
882 static struct wl_shm_pool *
883 _ecore_evas_wl_shm_pool_create(int size, void **data)
886 struct wl_shm_pool *pool;
890 LOGFN(__FILE__, __LINE__, __FUNCTION__);
892 if (!(shm = ecore_wl_shm_get())) return NULL;
894 strcpy(tmp, "/tmp/ecore-evas-wayland_shm-XXXXXX");
895 if ((fd = mkstemp(tmp)) < 0)
897 ERR("Could not create temporary file.");
901 if (ftruncate(fd, size) < 0)
903 ERR("Could not truncate temporary file.");
908 *data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
911 if (*data == MAP_FAILED)
913 ERR("mmap of temporary file failed.");
918 pool = wl_shm_create_pool(shm, fd, size);
926 _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool)
931 if ((ee->alpha) || (ee->transparent))
932 format = WL_SHM_FORMAT_ARGB8888;
934 format = WL_SHM_FORMAT_XRGB8888;
936 stride = (ee->w * sizeof(int));
938 ee->engine.wl.buffer =
939 wl_shm_pool_create_buffer(pool, 0, ee->w, ee->h, stride, format);
943 _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
945 LOGFN(__FILE__, __LINE__, __FUNCTION__);
948 if (ee->engine.wl.win)
949 ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
953 _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
956 Ecore_Wl_Event_Mouse_In *ev;
958 LOGFN(__FILE__, __LINE__, __FUNCTION__);
961 ee = ecore_event_window_match(ev->window);
962 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
963 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
964 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
965 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
966 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
967 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
968 return ECORE_CALLBACK_PASS_ON;
972 _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
975 Ecore_Wl_Event_Mouse_Out *ev;
977 LOGFN(__FILE__, __LINE__, __FUNCTION__);
980 ee = ecore_event_window_match(ev->window);
981 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
982 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
983 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
984 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
985 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
986 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
987 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
988 return ECORE_CALLBACK_PASS_ON;
992 _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
995 Ecore_Wl_Event_Focus_In *ev;
997 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1000 ee = ecore_event_window_match(ev->win);
1001 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1002 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1003 ee->prop.focused = 1;
1004 evas_focus_in(ee->evas);
1005 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1006 return ECORE_CALLBACK_PASS_ON;
1010 _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1013 Ecore_Wl_Event_Focus_In *ev;
1015 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1018 ee = ecore_event_window_match(ev->win);
1019 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1020 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1021 evas_focus_out(ee->evas);
1022 ee->prop.focused = 0;
1023 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1024 return ECORE_CALLBACK_PASS_ON;
1028 _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1031 Ecore_Wl_Event_Window_Configure *ev;
1033 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1036 ee = ecore_event_window_match(ev->win);
1037 if (!ee) return ECORE_CALLBACK_PASS_ON;
1038 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1039 if ((ee->x != ev->x) || (ee->y != ev->y))
1045 if (ee->func.fn_move) ee->func.fn_move(ee);
1047 if ((ee->req.w != ev->w) || (ee->req.h != ev->h))
1049 /* ee->w = ev->w; */
1050 /* ee->h = ev->h; */
1053 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1056 return ECORE_CALLBACK_PASS_ON;
1060 _ecore_evas_wl_smart_init(void)
1062 if (_ecore_evas_wl_smart) return;
1064 static const Evas_Smart_Class sc =
1066 "ecore_evas_wl_frame", EVAS_SMART_CLASS_VERSION,
1067 _ecore_evas_wl_smart_add,
1068 _ecore_evas_wl_smart_del,
1070 _ecore_evas_wl_smart_resize,
1071 _ecore_evas_wl_smart_show,
1072 _ecore_evas_wl_smart_hide,
1073 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
1075 _ecore_evas_wl_smart = evas_smart_class_new(&sc);
1080 _ecore_evas_wl_smart_add(Evas_Object *obj)
1082 EE_Wl_Smart_Data *sd;
1085 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1087 if (!(sd = calloc(1, sizeof(EE_Wl_Smart_Data)))) return;
1089 evas = evas_object_evas_get(obj);
1096 sd->frame = evas_object_rectangle_add(evas);
1097 evas_object_is_frame_object_set(sd->frame, EINA_TRUE);
1098 evas_object_color_set(sd->frame, 249, 249, 249, 255);
1099 evas_object_smart_member_add(sd->frame, obj);
1101 sd->text = evas_object_text_add(evas);
1102 evas_object_color_set(sd->text, 0, 0, 0, 255);
1103 evas_object_text_style_set(sd->text, EVAS_TEXT_STYLE_PLAIN);
1104 evas_object_text_font_set(sd->text, "Sans", 10);
1105 evas_object_text_text_set(sd->text, "Smart Test");
1107 evas_object_smart_data_set(obj, sd);
1111 _ecore_evas_wl_smart_del(Evas_Object *obj)
1113 EE_Wl_Smart_Data *sd;
1115 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1117 if (!(sd = evas_object_smart_data_get(obj))) return;
1118 evas_object_del(sd->text);
1119 evas_object_del(sd->frame);
1124 _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
1126 EE_Wl_Smart_Data *sd;
1128 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1130 if (!(sd = evas_object_smart_data_get(obj))) return;
1131 if ((sd->w == w) && (sd->h == h)) return;
1134 evas_object_resize(sd->frame, w, h);
1138 _ecore_evas_wl_smart_show(Evas_Object *obj)
1140 EE_Wl_Smart_Data *sd;
1142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1144 if (!(sd = evas_object_smart_data_get(obj))) return;
1145 evas_object_show(sd->frame);
1146 evas_object_show(sd->text);
1150 _ecore_evas_wl_smart_hide(Evas_Object *obj)
1152 EE_Wl_Smart_Data *sd;
1154 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1156 if (!(sd = evas_object_smart_data_get(obj))) return;
1157 evas_object_hide(sd->text);
1158 evas_object_hide(sd->frame);
1161 static Evas_Object *
1162 _ecore_evas_wl_frame_add(Evas *evas)
1164 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1166 _ecore_evas_wl_smart_init();
1167 return evas_object_smart_add(evas, _ecore_evas_wl_smart);
1172 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__)