remove duplex definition
[profile/mobile/ecore.git] / src / lib / ecore_evas / ecore_evas_wayland_shm.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #ifdef STDC_HEADERS
6 # include <stdlib.h>
7 # include <stddef.h>
8 #else
9 # ifdef HAVE_STDLIB_H
10 #  include <stdlib.h>
11 # endif
12 #endif
13 #ifdef HAVE_ALLOCA_H
14 # include <alloca.h>
15 #elif !defined alloca
16 # ifdef __GNUC__
17 #  define alloca __builtin_alloca
18 # elif defined _AIX
19 #  define alloca __alloca
20 # elif defined _MSC_VER
21 #  include <malloc.h>
22 #  define alloca _alloca
23 # elif !defined HAVE_ALLOCA
24 #  ifdef  __cplusplus
25 extern "C"
26 #  endif
27 void *alloca (size_t);
28 # endif
29 #endif
30
31 //#define LOGFNS 1
32
33 #ifdef LOGFNS
34 # include <stdio.h>
35 # define LOGFN(fl, ln, fn) \
36    printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
37 #else
38 # define LOGFN(fl, ln, fn)
39 #endif
40
41 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
42 # include <stdlib.h>
43 # include <string.h>
44 # include <unistd.h>
45 # include <sys/types.h>
46 # include <sys/mman.h>
47 #endif
48
49 #include <Eina.h>
50
51 #include "Ecore_Evas.h"
52
53 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
54 # include "ecore_evas_private.h"
55 # include <Evas_Engine_Wayland_Shm.h>
56 # include <Ecore_Wayland.h>
57
58 /* local function prototypes */
59 static void _ecore_evas_wl_free(Ecore_Evas *ee);
60 static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
61 static void _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
62 static void _ecore_evas_wl_show(Ecore_Evas *ee);
63 static void _ecore_evas_wl_hide(Ecore_Evas *ee);
64 static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
65 static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
66 static int  _ecore_evas_wl_render(Ecore_Evas *ee);
67
68 /* SHM Only */
69 static void _ecore_evas_wl_shm_pool_free(Ecore_Evas *ee);
70 static void _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size);
71 static void _ecore_evas_wl_buffer_free(Ecore_Evas *ee);
72 static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h);
73
74 /* Frame listener */
75 static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t time);
76 static const struct wl_callback_listener frame_listener =
77 {
78    _ecore_evas_wl_frame_complete,
79 };
80
81 static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 
82 {
83    _ecore_evas_wl_free,
84    _ecore_evas_wl_common_callback_resize_set,
85    _ecore_evas_wl_common_callback_move_set,
86    NULL, 
87    NULL,
88    _ecore_evas_wl_common_callback_delete_request_set,
89    NULL,
90    _ecore_evas_wl_common_callback_focus_in_set,
91    _ecore_evas_wl_common_callback_focus_out_set,
92    _ecore_evas_wl_common_callback_mouse_in_set,
93    _ecore_evas_wl_common_callback_mouse_out_set,
94    NULL, // sticky_set
95    NULL, // unsticky_set
96    NULL, // pre_render_set
97    NULL, // post_render_set
98    _ecore_evas_wl_common_move,
99    NULL, // managed_move
100    _ecore_evas_wl_resize,
101    _ecore_evas_wl_move_resize,
102    NULL, // rotation_set
103    NULL, // shaped_set
104    _ecore_evas_wl_show,
105    _ecore_evas_wl_hide,
106    _ecore_evas_wl_common_raise,
107    NULL, // lower
108    NULL, // activate
109    _ecore_evas_wl_common_title_set,
110    _ecore_evas_wl_common_name_class_set,
111    _ecore_evas_wl_common_size_min_set,
112    _ecore_evas_wl_common_size_max_set,
113    _ecore_evas_wl_common_size_base_set,
114    _ecore_evas_wl_common_size_step_set,
115    NULL, // object_cursor_set
116    _ecore_evas_wl_common_layer_set,
117    NULL, // focus set
118    _ecore_evas_wl_common_iconified_set,
119    NULL, // borderless set
120    NULL, // override set
121    _ecore_evas_wl_common_maximized_set,
122    _ecore_evas_wl_common_fullscreen_set,
123    NULL, // func avoid_damage set
124    NULL, // func withdrawn set
125    NULL, // func sticky set
126    _ecore_evas_wl_common_ignore_events_set,
127    _ecore_evas_wl_alpha_set,
128    _ecore_evas_wl_transparent_set,
129    NULL, // func profiles set
130    NULL, // window group set
131    NULL, // aspect set
132    NULL, // urgent set
133    NULL, // modal set
134    NULL, // demand attention set
135    NULL, // focus skip set
136    _ecore_evas_wl_render,
137    _ecore_evas_wl_common_screen_geometry_get,
138    _ecore_evas_wl_common_screen_dpi_get,
139    NULL, // wm_rot_preferred_rotation_set
140    NULL  // wm_rot_available_rotations_set
141 };
142
143 /* external variables */
144
145 /* external functions */
146 EAPI Ecore_Evas *
147 ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
148 {
149    Ecore_Wl_Window *p = NULL;
150    Evas_Engine_Info_Wayland_Shm *einfo;
151    Ecore_Evas *ee;
152    int method = 0, count = 0;
153
154    LOGFN(__FILE__, __LINE__, __FUNCTION__);
155
156    if (!(method = evas_render_method_lookup("wayland_shm")))
157      {
158         ERR("Render method lookup failed for Wayland_Shm");
159         return NULL;
160      }
161
162    count = ecore_wl_init(disp_name);
163    if (!count)
164      {
165         ERR("Failed to initialize Ecore_Wayland");
166         return NULL;
167      }
168    else if (count == 1)
169      ecore_wl_display_iterate();
170
171    if (!(ee = calloc(1, sizeof(Ecore_Evas))))
172      {
173         ERR("Failed to allocate Ecore_Evas");
174         goto ee_err;
175      }
176
177    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
178
179    _ecore_evas_wl_common_init();
180
181    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
182
183    ee->driver = "wayland_shm";
184    if (disp_name) ee->name = strdup(disp_name);
185
186    if (w < 1) w = 1;
187    if (h < 1) h = 1;
188
189    ee->x = x;
190    ee->y = y;
191    ee->w = w;
192    ee->h = h;
193    ee->req.x = ee->x;
194    ee->req.y = ee->y;
195    ee->req.w = ee->w;
196    ee->req.h = ee->h;
197    ee->rotation = 0;
198    ee->prop.max.w = 32767;
199    ee->prop.max.h = 32767;
200    ee->prop.layer = 4;
201    ee->prop.request_pos = 0;
202    ee->prop.sticky = 0;
203    ee->prop.draw_frame = frame;
204    ee->alpha = EINA_FALSE;
205
206    ee->evas = evas_new();
207    evas_data_attach_set(ee->evas, ee);
208    evas_output_method_set(ee->evas, method);
209    evas_output_size_set(ee->evas, ee->w, ee->h);
210    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
211
212    /* FIXME: This needs to be set based on theme & scale */
213    if (ee->prop.draw_frame)
214      evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
215
216    if (parent)
217      p = ecore_wl_window_find(parent);
218
219    /* FIXME: Get if parent is alpha, and set */
220
221    ee->engine.wl.parent = p;
222    ee->engine.wl.win = 
223      ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
224    ee->prop.window = ee->engine.wl.win->id;
225
226    if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
227      {
228         einfo->info.destination_alpha = ee->alpha;
229         einfo->info.rotation = ee->rotation;
230         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
231           {
232              ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
233              goto err;
234           }
235      }
236    else 
237      {
238         ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
239         goto err;
240      }
241
242    ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_common_pre_free);
243
244    if (ee->prop.draw_frame) 
245      {
246         ee->engine.wl.frame = _ecore_evas_wl_common_frame_add(ee->evas);
247         evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
248         evas_object_move(ee->engine.wl.frame, 0, 0);
249      }
250
251    _ecore_evas_register(ee);
252    ecore_evas_input_event_register(ee);
253
254    ecore_event_window_register(ee->prop.window, ee, ee->evas, 
255                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, 
256                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process, 
257                                (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, 
258                                (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
259
260    return ee;
261
262  err:
263    ecore_evas_free(ee);
264    _ecore_evas_wl_common_shutdown();
265
266  ee_err:
267    ecore_wl_shutdown();
268    return NULL;
269 }
270
271 static void 
272 _ecore_evas_wl_free(Ecore_Evas *ee)
273 {
274    _ecore_evas_wl_buffer_free(ee);
275    _ecore_evas_wl_shm_pool_free(ee);
276    _ecore_evas_wl_common_free(ee);
277 }
278
279 static void 
280 _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
281 {
282    Evas_Engine_Info_Wayland_Shm *einfo;
283
284    LOGFN(__FILE__, __LINE__, __FUNCTION__);
285
286    if (!ee) return;
287    if (w < 1) w = 1;
288    if (h < 1) h = 1;
289
290    ee->req.w = w;
291    ee->req.h = h;
292
293    if (!ee->prop.fullscreen)
294      {
295         int fw = 0, fh = 0;
296
297         if (ee->prop.min.w > w) w = ee->prop.min.w;
298         else if (w > ee->prop.max.w) w = ee->prop.max.w;
299         if (ee->prop.min.h > h) h = ee->prop.min.h;
300         else if (h > ee->prop.max.h) h = ee->prop.max.h;
301
302         evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
303         w += fw;
304         h += fh;
305      }
306
307    if ((ee->w != w) || (ee->h != h))
308      {
309         ee->w = w;
310         ee->h = h;
311
312         if ((ee->rotation == 90) || (ee->rotation == 270))
313           {
314              evas_output_size_set(ee->evas, h, w);
315              evas_output_viewport_set(ee->evas, 0, 0, h, w);
316           }
317         else
318           {
319              evas_output_size_set(ee->evas, w, h);
320              evas_output_viewport_set(ee->evas, 0, 0, w, h);
321           }
322
323         if (ee->prop.avoid_damage)
324           {
325              int pdam = 0;
326
327              pdam = ecore_evas_avoid_damage_get(ee);
328              ecore_evas_avoid_damage_set(ee, 0);
329              ecore_evas_avoid_damage_set(ee, pdam);
330           }
331
332         if (ee->engine.wl.frame)
333           evas_object_resize(ee->engine.wl.frame, w, h);
334
335         _ecore_evas_wl_buffer_new(ee, w, h);
336
337         einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
338         if (!einfo)
339           {
340             ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
341             return;
342           }
343
344         einfo->info.dest = ee->engine.wl.pool_data;
345         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
346
347         if (ee->engine.wl.win)
348           {
349              ecore_wl_window_update_size(ee->engine.wl.win, w, h);
350              ecore_wl_window_buffer_attach(ee->engine.wl.win, 
351                                            ee->engine.wl.buffer, 0, 0);
352           }
353
354         if (ee->func.fn_resize) ee->func.fn_resize(ee);
355      }
356 }
357
358 static void 
359 _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
360 {
361    LOGFN(__FILE__, __LINE__, __FUNCTION__);
362
363    if (!ee) return;
364    if ((ee->x != x) || (ee->y != y))
365      _ecore_evas_wl_common_move(ee, x, y);
366    if ((ee->w != w) || (ee->h != h))
367      _ecore_evas_wl_resize(ee, w, h);
368 }
369
370 static void
371 _ecore_evas_wl_show(Ecore_Evas *ee)
372 {
373    Evas_Engine_Info_Wayland_Shm *einfo;
374
375    LOGFN(__FILE__, __LINE__, __FUNCTION__);
376
377    if ((!ee) || (ee->visible)) return;
378
379    _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
380
381    einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
382    if (!einfo)
383      {
384         ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
385         return;
386      }
387
388    einfo->info.dest = ee->engine.wl.pool_data;
389    evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
390
391    if (ee->engine.wl.win)
392      {
393         ecore_wl_window_show(ee->engine.wl.win);
394         ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
395         ecore_wl_window_buffer_attach(ee->engine.wl.win, 
396                                       ee->engine.wl.buffer, 0, 0);
397
398         if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
399           wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, 
400                                      ee->prop.clas);
401         if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
402           wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, 
403                                      ee->prop.title);
404      }
405
406    if (ee->engine.wl.frame)
407      {
408         evas_object_show(ee->engine.wl.frame);
409         evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
410      }
411
412    ee->visible = 1;
413    if (ee->func.fn_show) ee->func.fn_show(ee);
414 }
415
416 static void 
417 _ecore_evas_wl_hide(Ecore_Evas *ee)
418 {
419    Evas_Engine_Info_Wayland_Shm *einfo;
420
421    LOGFN(__FILE__, __LINE__, __FUNCTION__);
422
423    if ((!ee) || (!ee->visible)) return;
424
425    _ecore_evas_wl_buffer_free(ee);
426
427    munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
428
429    einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
430    if ((einfo) && (einfo->info.dest))
431      {
432         einfo->info.dest = NULL;
433         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
434      }
435
436    if (ee->engine.wl.win) 
437      ecore_wl_window_hide(ee->engine.wl.win);
438
439    ee->visible = 0;
440    ee->should_be_visible = 0;
441
442    if (ee->func.fn_hide) ee->func.fn_hide(ee);
443 }
444
445 static void 
446 _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
447 {
448    Evas_Engine_Info_Wayland_Shm *einfo;
449    Ecore_Wl_Window *win = NULL;
450
451    LOGFN(__FILE__, __LINE__, __FUNCTION__);
452
453    if (!ee) return;
454    if ((ee->alpha == alpha)) return;
455    ee->alpha = alpha;
456
457    /* FIXME: NB: We should really add a ecore_wl_window_alpha_set function
458     * but we are in API freeze, so just hack it in for now and fix when 
459     * freeze is over */
460    if ((win = ee->engine.wl.win))
461      win->alpha = alpha;
462
463    /* if (ee->engine.wl.win) */
464    /*   ecore_wl_window_transparent_set(ee->engine.wl.win, alpha); */
465
466    _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
467
468    if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
469      {
470         einfo->info.destination_alpha = alpha;
471         einfo->info.dest = ee->engine.wl.pool_data;
472         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
473           ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
474         evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
475      }
476
477    if (win)
478      {
479         ecore_wl_window_update_size(win, ee->w, ee->h);
480         ecore_wl_window_buffer_attach(win, ee->engine.wl.buffer, 0, 0);
481      }
482 }
483
484 static void 
485 _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
486 {
487    Evas_Engine_Info_Wayland_Shm *einfo;
488
489    LOGFN(__FILE__, __LINE__, __FUNCTION__);
490
491    if (!ee) return;
492    if ((ee->transparent == transparent)) return;
493    ee->transparent = transparent;
494
495    if (ee->engine.wl.win)
496      ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
497
498    _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
499
500    if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
501      {
502         einfo->info.destination_alpha = transparent;
503         einfo->info.dest = ee->engine.wl.pool_data;
504         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
505           ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
506         evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
507      }
508
509    if (ee->engine.wl.win)
510      {
511         ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
512         ecore_wl_window_buffer_attach(ee->engine.wl.win, 
513                                       ee->engine.wl.buffer, 0, 0);
514      }
515 }
516
517 static void
518 _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t time __UNUSED__)
519 {
520    Ecore_Evas *ee = data;
521    Ecore_Wl_Window *win = NULL;
522
523    if (!ee) return;
524    if (!(win = ee->engine.wl.win)) return;
525
526    win->frame_callback = NULL;
527    win->frame_pending = EINA_FALSE;
528    wl_callback_destroy(callback);
529
530    if (win->surface)
531      {
532         win->frame_callback = wl_surface_frame(win->surface);
533         wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
534      }
535 }
536
537 static int
538 _ecore_evas_wl_render(Ecore_Evas *ee)
539 {
540    int rend = 0;
541    Ecore_Wl_Window *win = NULL;
542
543    if (!ee) return 0;
544    if (!ee->visible)
545      {
546         evas_norender(ee->evas);
547         return 0;
548      }
549
550    if (!(win = ee->engine.wl.win)) return 0;
551
552    rend = _ecore_evas_wl_common_pre_render(ee);
553    if (!(win->frame_pending))
554      {
555         /* FIXME - ideally have an evas_changed_get to return the value
556          * of evas->changed to avoid creating this callback and
557          * destroying it again
558          */
559
560         if (!win->frame_callback)
561           {
562              win->frame_callback = wl_surface_frame(win->surface);
563              wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
564           }
565
566         rend |= _ecore_evas_wl_common_render_updates(ee);
567         if (rend)
568            win->frame_pending = EINA_TRUE;
569      }
570    _ecore_evas_wl_common_post_render(ee);
571    return rend;
572 }
573
574 static void
575 _ecore_evas_wl_shm_pool_free(Ecore_Evas *ee)
576 {
577    if (!ee->engine.wl.pool) return;
578
579    wl_shm_pool_destroy(ee->engine.wl.pool);
580    ee->engine.wl.pool = NULL;
581    ee->engine.wl.pool_size = 0;
582    ee->engine.wl.pool_data = NULL;
583 }
584
585 static void
586 _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
587 {
588    struct wl_shm *shm;
589    void *data;
590    char tmp[PATH_MAX];
591    int fd;
592
593    LOGFN(__FILE__, __LINE__, __FUNCTION__);
594
595    if (size <= ee->engine.wl.pool_size)
596       return;
597
598    size *= 1.5;
599    _ecore_evas_wl_shm_pool_free(ee);
600
601    if (!(shm = ecore_wl_shm_get()))
602      {
603         ERR("ecore_wl_shm_get returned NULL");
604         return;
605      }
606
607    strcpy(tmp, "/tmp/ecore-evas-wayland_shm-XXXXXX");
608    if ((fd = mkstemp(tmp)) < 0) 
609      {
610         ERR("Could not create temporary file.");
611         return;
612      }
613
614    if (ftruncate(fd, size) < 0) 
615      {
616         ERR("Could not truncate temporary file.");
617         goto end;
618      }
619
620    data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
621    unlink(tmp);
622
623    if (data == MAP_FAILED)
624      {
625         ERR("mmap of temporary file failed.");
626         goto end;
627      }
628
629    ee->engine.wl.pool_size = size;
630    ee->engine.wl.pool_data = data;
631    ee->engine.wl.pool = wl_shm_create_pool(shm, fd, size);
632
633  end:
634    close(fd);
635 }
636
637 static void
638 _ecore_evas_wl_buffer_free(Ecore_Evas *ee)
639 {
640    if (!ee->engine.wl.buffer) return;
641
642    wl_buffer_destroy(ee->engine.wl.buffer);
643    ee->engine.wl.buffer = NULL;
644 }
645
646 static void 
647 _ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h)
648 {
649    unsigned int format;
650    int stride = 0;
651
652    stride = (w * sizeof(int));
653
654    _ecore_evas_wl_shm_pool_create(ee, stride * h);
655
656    if ((ee->alpha) || (ee->transparent))
657      format = WL_SHM_FORMAT_ARGB8888;
658    else
659      format = WL_SHM_FORMAT_XRGB8888;
660
661    _ecore_evas_wl_buffer_free(ee);
662    ee->engine.wl.buffer = 
663      wl_shm_pool_create_buffer(ee->engine.wl.pool, 0, w, h, stride, format);
664 }
665
666 void 
667 _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
668 {
669    LOGFN(__FILE__, __LINE__, __FUNCTION__);
670
671    if (!ee) return;
672    if (ee->engine.wl.win) 
673      {
674         ee->engine.wl.win->resizing = EINA_TRUE;
675         ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
676      }
677 }
678 #else
679 EAPI Ecore_Evas *
680 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__)
681 {
682    return NULL;
683 }
684 #endif