aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c')
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c769
1 files changed, 313 insertions, 456 deletions
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c
index e3b15c8..4c7ee2d 100644
--- a/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c
@@ -2,7 +2,7 @@
2# include "config.h" 2# include "config.h"
3#endif 3#endif
4 4
5//#define LOGFNS 1 5#define LOGFNS 1
6 6
7#ifdef LOGFNS 7#ifdef LOGFNS
8# include <stdio.h> 8# include <stdio.h>
@@ -20,12 +20,12 @@
20# include <sys/mman.h> 20# include <sys/mman.h>
21#endif 21#endif
22 22
23# include <Eina.h> 23#include <Eina.h>
24# include <Evas.h> 24#include <Evas.h>
25# include <Ecore.h> 25#include <Ecore.h>
26 26
27# include "ecore_evas_private.h" 27#include "ecore_evas_private.h"
28# include "Ecore_Evas.h" 28#include "Ecore_Evas.h"
29 29
30#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM 30#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
31# include <Evas_Engine_Wayland_Shm.h> 31# include <Evas_Engine_Wayland_Shm.h>
@@ -51,41 +51,34 @@ static void _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*fu
51static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); 51static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
52static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); 52static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
53static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); 53static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
54static void _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
54static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y); 55static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y);
55static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); 56static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
56static void _ecore_evas_wl_show(Ecore_Evas *ee); 57static void _ecore_evas_wl_show(Ecore_Evas *ee);
57static void _ecore_evas_wl_hide(Ecore_Evas *ee); 58static void _ecore_evas_wl_hide(Ecore_Evas *ee);
58static void _ecore_evas_wl_raise(Ecore_Evas *ee); 59static void _ecore_evas_wl_raise(Ecore_Evas *ee);
59static void _ecore_evas_wl_lower(Ecore_Evas *ee); 60static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title);
60static void _ecore_evas_wl_activate(Ecore_Evas *ee);
61static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t);
62static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c); 61static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
63static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); 62static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h);
64static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); 63static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h);
65static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); 64static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h);
66static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); 65static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h);
67static void _ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
68static void _ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__);
69static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer); 66static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer);
70static void _ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__);
71static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify); 67static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify);
72static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max); 68static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max);
73static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full __UNUSED__); 69static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full);
70static void _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore);
71static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
72static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
74static int _ecore_evas_wl_render(Ecore_Evas *ee); 73static int _ecore_evas_wl_render(Ecore_Evas *ee);
75static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h); 74static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h);
76static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest); 75static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest);
77 76
78static Eina_Bool _ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event); 77static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
79static Eina_Bool _ecore_evas_wl_event_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event); 78static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
80static Eina_Bool _ecore_evas_wl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event); 79static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
81static Eina_Bool _ecore_evas_wl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event); 80static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
82static Eina_Bool _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); 81static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
83static Eina_Bool _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
84static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
85static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
86
87static void _ecore_evas_wl_handle_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, uint32_t timestamp __UNUSED__, uint32_t edges __UNUSED__, int32_t width, int32_t height);
88static void _ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__);
89 82
90/* SMART stuff for frame */ 83/* SMART stuff for frame */
91static Evas_Smart *_ecore_evas_wl_smart = NULL; 84static Evas_Smart *_ecore_evas_wl_smart = NULL;
@@ -101,95 +94,94 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
101 94
102/* local variables */ 95/* local variables */
103static int _ecore_evas_wl_init_count = 0; 96static int _ecore_evas_wl_init_count = 0;
104static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[8]; 97static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
105static uint32_t _ecore_evas_wl_btn_timestamp;
106static const struct wl_shell_surface_listener _ecore_evas_wl_shell_surface_listener =
107{
108 _ecore_evas_wl_handle_configure,
109 _ecore_evas_wl_handle_popup_done
110};
111 98
112static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 99static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
113{ 100{
114 _ecore_evas_wl_free, 101 _ecore_evas_wl_free,
115 _ecore_evas_wl_callback_resize_set, 102 _ecore_evas_wl_callback_resize_set,
116 _ecore_evas_wl_callback_move_set, 103 _ecore_evas_wl_callback_move_set,
117 NULL, // callback show set 104 NULL,
118 NULL, // callback hide set 105 NULL,
119 _ecore_evas_wl_callback_delete_request_set, 106 _ecore_evas_wl_callback_delete_request_set,
120 NULL, // callback destroy set 107 NULL,
121 _ecore_evas_wl_callback_focus_in_set, 108 _ecore_evas_wl_callback_focus_in_set,
122 _ecore_evas_wl_callback_focus_out_set, 109 _ecore_evas_wl_callback_focus_out_set,
123 _ecore_evas_wl_callback_mouse_in_set, 110 _ecore_evas_wl_callback_mouse_in_set,
124 NULL, // callback mouse out set 111 _ecore_evas_wl_callback_mouse_out_set,
125 NULL, // callback sticky set 112 NULL, // sticky_set
126 NULL, // callback unsticky set 113 NULL, // unsticky_set
127 NULL, // callback pre render set 114 NULL, // pre_render_set
128 NULL, // callback post render set 115 NULL, // post_render_set
129 _ecore_evas_wl_move, 116 _ecore_evas_wl_move,
130 NULL, // func managed move 117 NULL, // managed_move
131 _ecore_evas_wl_resize, 118 _ecore_evas_wl_resize,
132 NULL, // func move_resize 119 NULL, // move_resize
133 NULL, // func rotation set 120 NULL, // rotation_set
134 NULL, // func shaped set 121 NULL, // shaped_set
135 _ecore_evas_wl_show, 122 _ecore_evas_wl_show,
136 _ecore_evas_wl_hide, 123 _ecore_evas_wl_hide,
137 _ecore_evas_wl_raise, 124 _ecore_evas_wl_raise,
138 _ecore_evas_wl_lower, 125 NULL, // lower
139 _ecore_evas_wl_activate, 126 NULL, // activate
140 _ecore_evas_wl_title_set, 127 _ecore_evas_wl_title_set,
141 _ecore_evas_wl_name_class_set, 128 _ecore_evas_wl_name_class_set,
142 _ecore_evas_wl_size_min_set, 129 _ecore_evas_wl_size_min_set,
143 _ecore_evas_wl_size_max_set, 130 _ecore_evas_wl_size_max_set,
144 _ecore_evas_wl_size_base_set, 131 _ecore_evas_wl_size_base_set,
145 _ecore_evas_wl_size_step_set, 132 _ecore_evas_wl_size_step_set,
146 _ecore_evas_wl_object_cursor_set, 133 NULL, // object_cursor_set
147 _ecore_evas_wl_layer_set, 134 _ecore_evas_wl_layer_set,
148 _ecore_evas_wl_focus_set, 135 NULL, // focus set
149 _ecore_evas_wl_iconified_set, 136 _ecore_evas_wl_iconified_set,
150 NULL, // func borderless set 137 NULL, // borderless set
151 NULL, // func override set 138 NULL, // override set
152 _ecore_evas_wl_maximized_set, 139 _ecore_evas_wl_maximized_set,
153 _ecore_evas_wl_fullscreen_set, 140 _ecore_evas_wl_fullscreen_set,
154 NULL, // func avoid_damage set 141 NULL, // func avoid_damage set
155 NULL, // func withdrawn set 142 NULL, // func withdrawn set
156 NULL, // func sticky set 143 NULL, // func sticky set
157 NULL, // func ignore_events set 144 _ecore_evas_wl_ignore_events_set,
158 NULL, // func alpha set 145 _ecore_evas_wl_alpha_set,
159 NULL, // func transparent set 146 _ecore_evas_wl_transparent_set,
147 NULL,
148 NULL,
149 NULL,
150 NULL,
151 NULL,
152 NULL,
160 _ecore_evas_wl_render, 153 _ecore_evas_wl_render,
161 _ecore_evas_wl_screen_geometry_get 154 _ecore_evas_wl_screen_geometry_get
162}; 155};
163 156
164/* external variables */ 157/* external variables */
165#endif
166 158
167#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM 159/* external functions */
168EAPI Ecore_Evas * 160EAPI Ecore_Evas *
169ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, int frame) 161ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
170{ 162{
163 Ecore_Wl_Window *p = NULL;
171 Evas_Engine_Info_Wayland_Shm *einfo; 164 Evas_Engine_Info_Wayland_Shm *einfo;
172 Ecore_Evas *ee; 165 Ecore_Evas *ee;
173 int method = 0; 166 int method = 0;
174 static int _win_id = 1;
175 167
176 LOGFN(__FILE__, __LINE__, __FUNCTION__); 168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
177 169
178 if (!(method = evas_render_method_lookup("wayland_shm"))) 170 if (!(method = evas_render_method_lookup("wayland_shm")))
179 { 171 {
180 ERR("Render method lookup failed."); 172 ERR("Render method lookup failed for Wayland_Shm");
181 return NULL; 173 return NULL;
182 } 174 }
183 175
184 if (!(ecore_wl_init(disp_name))) 176 if (!ecore_wl_init(disp_name))
185 { 177 {
186 ERR("Failed to initialize Ecore Wayland."); 178 ERR("Failed to initialize Ecore_Wayland");
187 return NULL; 179 return NULL;
188 } 180 }
189 181
190 if (!(ee = calloc(1, sizeof(Ecore_Evas)))) 182 if (!(ee = calloc(1, sizeof(Ecore_Evas))))
191 { 183 {
192 ERR("Failed to allocate Ecore_Evas."); 184 ERR("Failed to allocate Ecore_Evas");
193 ecore_wl_shutdown(); 185 ecore_wl_shutdown();
194 return NULL; 186 return NULL;
195 } 187 }
@@ -206,17 +198,21 @@ ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, in
206 if (w < 1) w = 1; 198 if (w < 1) w = 1;
207 if (h < 1) h = 1; 199 if (h < 1) h = 1;
208 200
209 ee->req.x = ee->x = x; 201 ee->x = x;
210 ee->req.y = ee->y = y; 202 ee->y = y;
211 ee->req.w = ee->w = w; 203 ee->w = w;
212 ee->req.h = ee->h = h; 204 ee->h = h;
205 ee->req.x = ee->x;
206 ee->req.y = ee->y;
207 ee->req.w = ee->w;
208 ee->req.h = ee->h;
213 ee->rotation = 0; 209 ee->rotation = 0;
214 ee->prop.max.w = ee->prop.max.h = 32767; 210 ee->prop.max.w = 32767;
211 ee->prop.max.h = 32767;
215 ee->prop.layer = 4; 212 ee->prop.layer = 4;
216 ee->prop.request_pos = 0; 213 ee->prop.request_pos = 0;
217 ee->prop.sticky = 0; 214 ee->prop.sticky = 0;
218 ee->prop.draw_frame = frame; 215 ee->prop.draw_frame = frame;
219 ee->prop.window = _win_id++;
220 216
221 ee->evas = evas_new(); 217 ee->evas = evas_new();
222 evas_data_attach_set(ee->evas, ee); 218 evas_data_attach_set(ee->evas, ee);
@@ -224,29 +220,42 @@ ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, in
224 evas_output_size_set(ee->evas, ee->w, ee->h); 220 evas_output_size_set(ee->evas, ee->w, ee->h);
225 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); 221 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
226 222
227 if (ee->prop.draw_frame) 223 /* FIXME: This needs to be set based on theme & scale */
224 if (ee->prop.draw_frame)
228 evas_output_framespace_set(ee->evas, 4, 18, 8, 22); 225 evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
229 226
230 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas))) 227 if (parent)
228 p = ecore_wl_window_find(parent);
229
230 /* FIXME: Get if parent is alpha, and set */
231
232 ee->engine.wl.parent = p;
233 ee->engine.wl.win =
234 ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
235 ee->prop.window = ee->engine.wl.win->id;
236
237 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
231 { 238 {
232 einfo->info.rotation = ee->rotation; 239 einfo->info.rotation = ee->rotation;
233 einfo->info.debug = EINA_FALSE; 240 einfo->info.debug = EINA_FALSE;
234 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) 241 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
235 { 242 {
236 ERR("Failed to set Evas Engine Info for '%s'.", ee->driver); 243 ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
237 ecore_evas_free(ee); 244 ecore_evas_free(ee);
245 _ecore_evas_wl_shutdown();
246 ecore_wl_shutdown();
238 return NULL; 247 return NULL;
239 } 248 }
240 } 249 }
241 else 250 else
242 { 251 {
243 ERR("Failed to get Evas Engine Info for '%s'.", ee->driver); 252 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
244 ecore_evas_free(ee); 253 ecore_evas_free(ee);
254 _ecore_evas_wl_shutdown();
255 ecore_wl_shutdown();
245 return NULL; 256 return NULL;
246 } 257 }
247 258
248 /* NB: we need to be notified before 'free' so we can munmap the evas
249 * engine destination */
250 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free); 259 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free);
251 260
252 if (ee->prop.draw_frame) 261 if (ee->prop.draw_frame)
@@ -279,30 +288,21 @@ _ecore_evas_wl_init(void)
279 if (++_ecore_evas_wl_init_count != 1) 288 if (++_ecore_evas_wl_init_count != 1)
280 return _ecore_evas_wl_init_count; 289 return _ecore_evas_wl_init_count;
281 290
282 _ecore_evas_wl_event_handlers[0] = 291 _ecore_evas_wl_event_hdls[0] =
283 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
284 _ecore_evas_wl_event_mouse_down, NULL);
285 _ecore_evas_wl_event_handlers[1] =
286 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
287 _ecore_evas_wl_event_mouse_up, NULL);
288 _ecore_evas_wl_event_handlers[2] =
289 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
290 _ecore_evas_wl_event_mouse_move, NULL);
291 _ecore_evas_wl_event_handlers[3] =
292 ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
293 _ecore_evas_wl_event_mouse_wheel, NULL);
294 _ecore_evas_wl_event_handlers[4] =
295 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN, 292 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
296 _ecore_evas_wl_event_mouse_in, NULL); 293 _ecore_evas_wl_cb_mouse_in, NULL);
297 _ecore_evas_wl_event_handlers[5] = 294 _ecore_evas_wl_event_hdls[1] =
298 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT, 295 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
299 _ecore_evas_wl_event_mouse_out, NULL); 296 _ecore_evas_wl_cb_mouse_out, NULL);
300 _ecore_evas_wl_event_handlers[6] = 297 _ecore_evas_wl_event_hdls[2] =
301 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, 298 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
302 _ecore_evas_wl_event_focus_in, NULL); 299 _ecore_evas_wl_cb_focus_in, NULL);
303 _ecore_evas_wl_event_handlers[7] = 300 _ecore_evas_wl_event_hdls[3] =
304 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, 301 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
305 _ecore_evas_wl_event_focus_out, NULL); 302 _ecore_evas_wl_cb_focus_out, NULL);
303 _ecore_evas_wl_event_hdls[4] =
304 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
305 _ecore_evas_wl_cb_window_configure, NULL);
306 306
307 ecore_event_evas_init(); 307 ecore_event_evas_init();
308 308
@@ -319,10 +319,10 @@ _ecore_evas_wl_shutdown(void)
319 if (--_ecore_evas_wl_init_count != 0) 319 if (--_ecore_evas_wl_init_count != 0)
320 return _ecore_evas_wl_init_count; 320 return _ecore_evas_wl_init_count;
321 321
322 for (i = 0; i < sizeof(_ecore_evas_wl_event_handlers) / sizeof(Ecore_Event_Handler *); i++) 322 for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
323 { 323 {
324 if (_ecore_evas_wl_event_handlers[i]) 324 if (_ecore_evas_wl_event_hdls[i])
325 ecore_event_handler_del(_ecore_evas_wl_event_handlers[i]); 325 ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
326 } 326 }
327 327
328 ecore_event_evas_shutdown(); 328 ecore_event_evas_shutdown();
@@ -337,17 +337,15 @@ _ecore_evas_wl_pre_free(Ecore_Evas *ee)
337 337
338 LOGFN(__FILE__, __LINE__, __FUNCTION__); 338 LOGFN(__FILE__, __LINE__, __FUNCTION__);
339 339
340 /* destroy frame */
341 if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame); 340 if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
342 341
343 /* get engine info */
344 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); 342 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
345 if ((einfo) && (einfo->info.dest)) 343 if ((einfo) && (einfo->info.dest))
346 { 344 {
347 int ret = 0; 345 int ret = 0;
348 346
349 /* munmap previous engine destination */
350 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); 347 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h));
348 if (!ret) ERR("Failed to unmap engine destination: %m");
351 } 349 }
352} 350}
353 351
@@ -356,18 +354,11 @@ _ecore_evas_wl_free(Ecore_Evas *ee)
356{ 354{
357 LOGFN(__FILE__, __LINE__, __FUNCTION__); 355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
358 356
359 /* destroy buffer */
360 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); 357 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
361 ee->engine.wl.buffer = NULL; 358 ee->engine.wl.buffer = NULL;
362 359
363 /* destroy shell surface */ 360 if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
364 if (ee->engine.wl.shell_surface) 361 ee->engine.wl.win = NULL;
365 wl_shell_surface_destroy(ee->engine.wl.shell_surface);
366 ee->engine.wl.shell_surface = NULL;
367
368 /* destroy surface */
369 if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface);
370 ee->engine.wl.surface = NULL;
371 362
372 ecore_event_window_unregister(ee->prop.window); 363 ecore_event_window_unregister(ee->prop.window);
373 ecore_evas_input_event_unregister(ee); 364 ecore_evas_input_event_unregister(ee);
@@ -431,25 +422,25 @@ _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee
431} 422}
432 423
433static void 424static void
434_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) 425_ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
426{
427 LOGFN(__FILE__, __LINE__, __FUNCTION__);
428
429 if (!ee) return;
430 ee->func.fn_mouse_out = func;
431}
432
433static void
434_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
435{ 435{
436 LOGFN(__FILE__, __LINE__, __FUNCTION__); 436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
437 437
438 if (!ee) return; 438 if (!ee) return;
439// if ((ee->x == x) && (ee->y == y)) return;
440 ee->req.x = x; 439 ee->req.x = x;
441 ee->req.y = y; 440 ee->req.y = y;
442
443 ee->x = x; 441 ee->x = x;
444 ee->y = y; 442 ee->y = y;
445 443 if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y);
446 if (ee->engine.wl.shell_surface)
447 {
448 wl_shell_surface_move(ee->engine.wl.shell_surface,
449 ecore_wl_input_device_get(),
450 _ecore_evas_wl_btn_timestamp);
451 }
452
453 if (ee->func.fn_move) ee->func.fn_move(ee); 444 if (ee->func.fn_move) ee->func.fn_move(ee);
454} 445}
455 446
@@ -458,49 +449,44 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
458{ 449{
459 Evas_Engine_Info_Wayland_Shm *einfo; 450 Evas_Engine_Info_Wayland_Shm *einfo;
460 451
461 LOGFN(__FILE__, __LINE__, __FUNCTION__);
462
463 if (!ee) return; 452 if (!ee) return;
464 if (w < 1) w = 1; 453 if (w < 1) w = 1;
465 if (h < 1) h = 1; 454 if (h < 1) h = 1;
466 if ((ee->w == w) && (ee->h == h)) return; 455// if ((ee->w == w) && (ee->h == h)) return;
456
457 LOGFN(__FILE__, __LINE__, __FUNCTION__);
458
459 if (ee->prop.min.w > w) w = ee->prop.min.w;
460 else if (w > ee->prop.max.w) w = ee->prop.max.w;
461 if (ee->prop.min.h > h) h = ee->prop.min.h;
462 else if (h > ee->prop.max.h) h = ee->prop.max.h;
467 463
468 ee->req.w = w; 464 ee->req.w = w;
469 ee->req.h = h; 465 ee->req.h = h;
470 466
471 if (ee->visible) 467// ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h);
472 {
473 /* damage old surface, if it exists */
474
475 /* NB: This removes any lingering screen artifacts in the compositor.
476 * This may be a 'HACK' if the issue is actually in the wayland
477 * compositor, but for now lets implement this so we don't have screen
478 * artifacts laying around during a resize */
479 if (ee->engine.wl.surface)
480 wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h);
481 }
482 468
483 /* get engine info */
484 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); 469 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
485 if (einfo->info.dest) 470 if ((einfo) && (einfo->info.dest))
486 { 471 {
487 int ret = 0; 472 int ret = 0;
488 473
489 /* munmap previous engine destination */
490 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); 474 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h));
475 if (!ret) ERR("Failed to unmap engine destination: %m");
476 }
477 else if (!einfo)
478 {
479 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
480 return;
491 } 481 }
492 482
493 /* free old buffer */
494 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); 483 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
495 ee->engine.wl.buffer = NULL; 484 ee->engine.wl.buffer = NULL;
496 485
497 ee->w = w; 486 ee->w = w;
498 ee->h = h; 487 ee->h = h;
499 488
500 /* create buffer @ new size (also mmaps the new destination) */
501 _ecore_evas_wl_buffer_new(ee, &einfo->info.dest); 489 _ecore_evas_wl_buffer_new(ee, &einfo->info.dest);
502
503 /* flush new buffer fd */
504 ecore_wl_flush(); 490 ecore_wl_flush();
505 491
506 /* change evas output & viewport sizes */ 492 /* change evas output & viewport sizes */
@@ -514,16 +500,13 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
514 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); 500 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
515 501
516 /* damage buffer */ 502 /* damage buffer */
517 wl_buffer_damage(ee->engine.wl.buffer, 0, 0, ee->w, ee->h); 503// wl_buffer_damage(ee->engine.wl.buffer, 0, 0, ee->w, ee->h);
518 504
519 if (ee->visible) 505 ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0);
520 { 506 /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */
521 /* damage surface */ 507 /* ecore_wl_flush(); */
522 wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h);
523 508
524 /* if visible, attach to surface */ 509 ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
525 wl_surface_attach(ee->engine.wl.surface, ee->engine.wl.buffer, 0, 0);
526 }
527 510
528 if (ee->func.fn_resize) ee->func.fn_resize(ee); 511 if (ee->func.fn_resize) ee->func.fn_resize(ee);
529} 512}
@@ -535,93 +518,64 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
535 518
536 LOGFN(__FILE__, __LINE__, __FUNCTION__); 519 LOGFN(__FILE__, __LINE__, __FUNCTION__);
537 520
538 if (!ee) return; 521 if ((!ee) || (ee->visible)) return;
539 if (ee->visible) return;
540 522
541 /* get engine info */ 523 if (ee->engine.wl.win)
542 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); 524 ecore_wl_window_show(ee->engine.wl.win);
543
544 /* create new surface */
545 ee->engine.wl.surface =
546 wl_compositor_create_surface(ecore_wl_compositor_get());
547 wl_surface_set_user_data(ee->engine.wl.surface, (void *)ee->prop.window);
548 525
549 /* get new shell surface */ 526 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
550 ee->engine.wl.shell_surface = 527 if (!einfo)
551 wl_shell_get_shell_surface(ecore_wl_shell_get(), ee->engine.wl.surface); 528 {
552 529 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
553 /* set toplevel */ 530 return;
554 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); 531 }
555 532
556 /* create buffer @ new size (also mmaps the new destination) */
557 _ecore_evas_wl_buffer_new(ee, &einfo->info.dest); 533 _ecore_evas_wl_buffer_new(ee, &einfo->info.dest);
534 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
558 535
559 if (ee->engine.wl.frame) 536 if (ee->engine.wl.frame)
560 { 537 {
561 evas_object_show(ee->engine.wl.frame); 538 evas_object_show(ee->engine.wl.frame);
562 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); 539 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
563 } 540 }
564 541
565 /* set new engine destination */
566 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
567
568 /* add configure listener for wayland resize events */
569 wl_shell_surface_add_listener(ee->engine.wl.shell_surface,
570 &_ecore_evas_wl_shell_surface_listener, ee);
571
572 /* flush new buffer fd */
573 ecore_wl_flush(); 542 ecore_wl_flush();
574 543
575 /* attach buffer to surface */ 544 if (ee->engine.wl.win)
576 wl_surface_attach(ee->engine.wl.surface, ee->engine.wl.buffer, 0, 0); 545 ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0);
577
578 /* NB: No need to do a damage here. If we do, we end up w/ screen
579 * artifacts in the compositor */
580 /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */
581 546
582 ee->visible = 1; 547 ee->visible = 1;
583 if (ee->func.fn_show) ee->func.fn_show(ee); 548 if (ee->func.fn_show) ee->func.fn_show(ee);
584} 549}
585 550
586static void 551static void
587_ecore_evas_wl_hide(Ecore_Evas *ee) 552_ecore_evas_wl_hide(Ecore_Evas *ee)
588{ 553{
589 Evas_Engine_Info_Wayland_Shm *einfo; 554 Evas_Engine_Info_Wayland_Shm *einfo;
590 555
591 LOGFN(__FILE__, __LINE__, __FUNCTION__); 556 LOGFN(__FILE__, __LINE__, __FUNCTION__);
592 557
593 if (!ee) return; 558 if ((!ee) || (!ee->visible)) return;
594 if (!ee->visible) return;
595 559
596 /* get engine info */
597 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); 560 einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
598 if (einfo->info.dest) 561 if ((einfo) && (einfo->info.dest))
599 { 562 {
600 int ret = 0; 563 int ret = 0;
601 564
602 /* munmap previous engine destination */
603 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); 565 ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h));
604 einfo->info.dest = NULL; 566 if (!ret) ERR("Failed to unmap engine destination: %m");
605 } 567 }
606 568
607 /* free old buffer */
608 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); 569 if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
609 ee->engine.wl.buffer = NULL; 570 ee->engine.wl.buffer = NULL;
610 571
611 /* set new engine destination */
612 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); 572 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
613 573
614 /* destroy shell surface */ 574 ecore_wl_window_hide(ee->engine.wl.win);
615 if (ee->engine.wl.shell_surface)
616 wl_shell_surface_destroy(ee->engine.wl.shell_surface);
617 ee->engine.wl.shell_surface = NULL;
618
619 /* destroy surface */
620 if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface);
621 ee->engine.wl.surface = NULL;
622 575
623 ee->visible = 0; 576 ee->visible = 0;
624 ee->should_be_visible = 0; 577 ee->should_be_visible = 0;
578
625 if (ee->func.fn_hide) ee->func.fn_hide(ee); 579 if (ee->func.fn_hide) ee->func.fn_hide(ee);
626} 580}
627 581
@@ -631,39 +585,18 @@ _ecore_evas_wl_raise(Ecore_Evas *ee)
631 LOGFN(__FILE__, __LINE__, __FUNCTION__); 585 LOGFN(__FILE__, __LINE__, __FUNCTION__);
632 586
633 if ((!ee) || (!ee->visible)) return; 587 if ((!ee) || (!ee->visible)) return;
634 if (!ee->engine.wl.shell_surface) return; 588 ecore_wl_window_raise(ee->engine.wl.win);
635 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface);
636} 589}
637 590
638static void 591static void
639_ecore_evas_wl_lower(Ecore_Evas *ee) 592_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
640{
641 LOGFN(__FILE__, __LINE__, __FUNCTION__);
642
643 if ((!ee) || (!ee->visible)) return;
644 /* FIXME: Need a way to tell Wayland to lower */
645}
646
647static void
648_ecore_evas_wl_activate(Ecore_Evas *ee)
649{
650 LOGFN(__FILE__, __LINE__, __FUNCTION__);
651
652 if ((!ee) || (!ee->visible)) return;
653 if (!ee->engine.wl.shell_surface) return;
654 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface);
655}
656
657static void
658_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t)
659{ 593{
660 LOGFN(__FILE__, __LINE__, __FUNCTION__); 594 LOGFN(__FILE__, __LINE__, __FUNCTION__);
661 595
662 if (!ee) return; 596 if (!ee) return;
663 if (ee->prop.title) free(ee->prop.title); 597 if (ee->prop.title) free(ee->prop.title);
664 ee->prop.title = NULL; 598 ee->prop.title = NULL;
665 if (t) ee->prop.title = strdup(t); 599 if (title) ee->prop.title = strdup(title);
666
667 if ((ee->prop.draw_frame) && (ee->engine.wl.frame)) 600 if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
668 { 601 {
669 EE_Wl_Smart_Data *sd; 602 EE_Wl_Smart_Data *sd;
@@ -741,102 +674,96 @@ _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h)
741} 674}
742 675
743static void 676static void
744_ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y) 677_ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer)
745{ 678{
746 int x = 0, y = 0;
747
748 LOGFN(__FILE__, __LINE__, __FUNCTION__); 679 LOGFN(__FILE__, __LINE__, __FUNCTION__);
749 680
750 if (!ee) return; 681 if (!ee) return;
751 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); 682 if (ee->prop.layer == layer) return;
752 ee->prop.cursor.object = NULL; 683 if (layer < 1) layer = 1;
753 684 else if (layer > 255) layer = 255;
754 if (!obj) 685 ee->prop.layer = layer;
755 {
756 ee->prop.cursor.layer = 0;
757 ee->prop.cursor.hot.x = 0;
758 ee->prop.cursor.hot.y = 0;
759 return;
760 }
761
762 ee->prop.cursor.object = obj;
763 ee->prop.cursor.layer = layer;
764 ee->prop.cursor.hot.x = hot_x;
765 ee->prop.cursor.hot.y = hot_y;
766
767 evas_pointer_output_xy_get(ee->evas, &x, &y);
768 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
769 evas_object_move(ee->prop.cursor.object,
770 x - ee->prop.cursor.hot.x, y - ee->prop.cursor.hot.y);
771 evas_object_pass_events_set(ee->prop.cursor.object, 1);
772 if (evas_pointer_inside_get(ee->evas))
773 evas_object_show(ee->prop.cursor.object);
774
775 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
776 _ecore_evas_wl_object_cursor_del, ee);
777} 686}
778 687
779static void 688static void
780_ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) 689_ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify)
781{ 690{
782 Ecore_Evas *ee; 691 LOGFN(__FILE__, __LINE__, __FUNCTION__);
783 692
784 if (!(ee = data)) return; 693 if (!ee) return;
785 ee->prop.cursor.object = NULL; 694 if (ee->prop.iconified == iconify) return;
695 ee->prop.iconified = iconify;
696 /* FIXME: Implement this in Wayland someshow */
786} 697}
787 698
788static void 699static void
789_ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) 700_ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max)
790{ 701{
791 LOGFN(__FILE__, __LINE__, __FUNCTION__); 702 LOGFN(__FILE__, __LINE__, __FUNCTION__);
792 703
793 if (!ee) return; 704 if (!ee) return;
794 if (ee->prop.layer == layer) return; 705 if (ee->prop.maximized == max) return;
795 if (layer < 1) layer = 1; 706 ee->prop.maximized = max;
796 else if (layer > 255) layer = 255; 707 ecore_wl_window_maximized_set(ee->engine.wl.win, max);
797 ee->prop.layer = layer;
798} 708}
799 709
800static void 710static void
801_ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__) 711_ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full)
802{ 712{
803 LOGFN(__FILE__, __LINE__, __FUNCTION__); 713 LOGFN(__FILE__, __LINE__, __FUNCTION__);
804 714
805 if ((!ee) || (!ee->visible)) return; 715 if ((!ee) || (!ee->visible)) return;
806 if (!ee->engine.wl.shell_surface) return; 716 if (ee->prop.fullscreen == full) return;
807 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); 717 ee->prop.fullscreen = full;
718 ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
808} 719}
809 720
810static void 721static void
811_ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify) 722_ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore)
812{ 723{
813 LOGFN(__FILE__, __LINE__, __FUNCTION__); 724 LOGFN(__FILE__, __LINE__, __FUNCTION__);
814 725
815 if (!ee) return; 726 if (!ee) return;
816 if (ee->prop.iconified == iconify) return; 727 ee->ignore_events = ignore;
817 ee->prop.iconified = iconify; 728 /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
818 /* FIXME: Implement this in Wayland someshow */
819} 729}
820 730
821static void 731static void
822_ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max) 732_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
823{ 733{
734 Evas_Engine_Info_Wayland_Shm *einfo;
735
824 LOGFN(__FILE__, __LINE__, __FUNCTION__); 736 LOGFN(__FILE__, __LINE__, __FUNCTION__);
825 737
826 if (!ee) return; 738 if (!ee) return;
827 if (ee->prop.maximized == max) return; 739 if ((ee->alpha == alpha)) return;
828 ee->prop.maximized = max; 740 ee->alpha = alpha;
829 /* FIXME: Implement this in Wayland someshow */ 741 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
742 {
743 einfo->info.destination_alpha = alpha;
744 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
745 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
746 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
747 }
830} 748}
831 749
832static void 750static void
833_ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full __UNUSED__) 751_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
834{ 752{
753 Evas_Engine_Info_Wayland_Shm *einfo;
754
835 LOGFN(__FILE__, __LINE__, __FUNCTION__); 755 LOGFN(__FILE__, __LINE__, __FUNCTION__);
836 756
837 if ((!ee) || (!ee->visible)) return; 757 if (!ee) return;
838 if (!ee->engine.wl.shell_surface) return; 758 if ((ee->transparent == transparent)) return;
839 wl_shell_surface_set_fullscreen(ee->engine.wl.shell_surface); 759 ee->transparent = transparent;
760 if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
761 {
762 einfo->info.destination_alpha = transparent;
763 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
764 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
765 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
766 }
840} 767}
841 768
842static int 769static int
@@ -845,9 +772,9 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
845 int rend = 0; 772 int rend = 0;
846 773
847 if (!ee) return 0; 774 if (!ee) return 0;
848 if (!ee->visible) 775 if (!ee->visible)
849 evas_norender(ee->evas); 776 evas_norender(ee->evas);
850 else 777 else
851 { 778 {
852 Eina_List *ll = NULL, *updates = NULL; 779 Eina_List *ll = NULL, *updates = NULL;
853 Ecore_Evas *ee2 = NULL; 780 Ecore_Evas *ee2 = NULL;
@@ -867,27 +794,27 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
867 Eina_List *l = NULL; 794 Eina_List *l = NULL;
868 Eina_Rectangle *r; 795 Eina_Rectangle *r;
869 796
797 LOGFN(__FILE__, __LINE__, __FUNCTION__);
798
870 EINA_LIST_FOREACH(updates, l, r) 799 EINA_LIST_FOREACH(updates, l, r)
871 { 800 {
872 if (ee->engine.wl.buffer) 801 if (ee->engine.wl.buffer)
873 wl_buffer_damage(ee->engine.wl.buffer, 802 wl_buffer_damage(ee->engine.wl.buffer,
874 r->x, r->y, r->w, r->h); 803 r->x, r->y, r->w, r->h);
875 804
876 if (ee->engine.wl.surface) 805 ecore_wl_window_damage(ee->engine.wl.win,
877 wl_surface_damage(ee->engine.wl.surface, 806 r->x, r->y, r->w, r->h);
878 r->x, r->y, r->w, r->h);
879 } 807 }
880 808
809 ecore_wl_flush();
810
881 evas_render_updates_free(updates); 811 evas_render_updates_free(updates);
882 _ecore_evas_idle_timeout_update(ee); 812 _ecore_evas_idle_timeout_update(ee);
883 rend = 1; 813 rend = 1;
884
885 ecore_wl_flush();
886 } 814 }
887 815
888 if (ee->func.fn_post_render) ee->func.fn_post_render(ee); 816 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
889 } 817 }
890
891 return rend; 818 return rend;
892} 819}
893 820
@@ -901,77 +828,67 @@ _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int
901 ecore_wl_screen_size_get(w, h); 828 ecore_wl_screen_size_get(w, h);
902} 829}
903 830
904static Eina_Bool 831static void
905_ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event) 832_ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest)
906{ 833{
907 Ecore_Evas *ee; 834 struct wl_shm *shm;
908 Ecore_Event_Mouse_Button *ev; 835 static unsigned int format;
836 char tmp[PATH_MAX];
837 int fd = -1, stride = 0, size = 0;
838 void *ret;
909 839
910 LOGFN(__FILE__, __LINE__, __FUNCTION__); 840 LOGFN(__FILE__, __LINE__, __FUNCTION__);
911 841
912 ev = event; 842 if (dest) *dest = NULL;
913 _ecore_evas_wl_btn_timestamp = ev->timestamp; 843 if (!(shm = ecore_wl_shm_get())) return;
914 ee = ecore_event_window_match(ev->window); 844 if (!format) format = WL_SHM_FORMAT_ARGB8888; //ecore_wl_format_get();
915 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
916 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
917 evas_event_feed_mouse_down(ee->evas, ev->buttons, ev->modifiers,
918 ev->timestamp, NULL);
919 return ECORE_CALLBACK_PASS_ON;
920}
921 845
922static Eina_Bool 846 strcpy(tmp, "/tmp/ecore-wayland_shm-XXXXXX");
923_ecore_evas_wl_event_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event) 847 if ((fd = mkstemp(tmp)) < 0)
924{ 848 {
925 Ecore_Evas *ee; 849 ERR("Could not create temporary file.");
926 Ecore_Event_Mouse_Button *ev; 850 return;
851 }
927 852
928 LOGFN(__FILE__, __LINE__, __FUNCTION__); 853 stride = (ee->w * sizeof(int));
854 size = (stride * ee->h);
855 if (ftruncate(fd, size) < 0)
856 {
857 ERR("Could not truncate temporary file.");
858 close(fd);
859 return;
860 }
929 861
930 ev = event; 862 ret = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
931 ee = ecore_event_window_match(ev->window); 863 unlink(tmp);
932 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
933 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
934 evas_event_feed_mouse_up(ee->evas, ev->buttons, ev->modifiers,
935 ev->timestamp, NULL);
936 return ECORE_CALLBACK_PASS_ON;
937}
938 864
939static Eina_Bool 865 if (ret == MAP_FAILED)
940_ecore_evas_wl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event) 866 {
941{ 867 ERR("mmap of temporary file failed.");
942 Ecore_Evas *ee; 868 close(fd);
943 Ecore_Event_Mouse_Move *ev; 869 return;
870 }
944 871
945 ev = event; 872 if (dest) *dest = ret;
946 ee = ecore_event_window_match(ev->window); 873
947 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 874 ee->engine.wl.buffer =
948 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 875 wl_shm_create_buffer(ecore_wl_shm_get(), fd, ee->w, ee->h, stride, format);
949 ee->mouse.x = ev->x; 876
950 ee->mouse.y = ev->y; 877 close(fd);
951 evas_event_feed_mouse_move(ee->evas, ev->x, ev->y, ev->timestamp, NULL);
952 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
953 return ECORE_CALLBACK_PASS_ON;
954} 878}
955 879
956static Eina_Bool 880void
957_ecore_evas_wl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event) 881_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
958{ 882{
959 Ecore_Evas *ee;
960 Ecore_Event_Mouse_Wheel *ev;
961
962 LOGFN(__FILE__, __LINE__, __FUNCTION__); 883 LOGFN(__FILE__, __LINE__, __FUNCTION__);
963 884
964 ev = event; 885 if (!ee) return;
965 ee = ecore_event_window_match(ev->window); 886 if (ee->engine.wl.win)
966 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 887 ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
967 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
968 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z,
969 ev->timestamp, NULL);
970 return ECORE_CALLBACK_PASS_ON;
971} 888}
972 889
973static Eina_Bool 890static Eina_Bool
974_ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) 891_ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
975{ 892{
976 Ecore_Evas *ee; 893 Ecore_Evas *ee;
977 Ecore_Wl_Event_Mouse_In *ev; 894 Ecore_Wl_Event_Mouse_In *ev;
@@ -979,18 +896,18 @@ _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *
979 LOGFN(__FILE__, __LINE__, __FUNCTION__); 896 LOGFN(__FILE__, __LINE__, __FUNCTION__);
980 897
981 ev = event; 898 ev = event;
982 ee = ecore_event_window_match(ev->window); 899 ee = ecore_event_window_match(ev->win);
983 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 900 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
984 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 901 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
985 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee); 902 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
986 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); 903 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
987 evas_event_feed_mouse_in(ee->evas, ev->time, NULL); 904 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
988 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); 905 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
989 return ECORE_CALLBACK_PASS_ON; 906 return ECORE_CALLBACK_PASS_ON;
990} 907}
991 908
992static Eina_Bool 909static Eina_Bool
993_ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) 910_ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
994{ 911{
995 Ecore_Evas *ee; 912 Ecore_Evas *ee;
996 Ecore_Wl_Event_Mouse_Out *ev; 913 Ecore_Wl_Event_Mouse_Out *ev;
@@ -998,19 +915,19 @@ _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void
998 LOGFN(__FILE__, __LINE__, __FUNCTION__); 915 LOGFN(__FILE__, __LINE__, __FUNCTION__);
999 916
1000 ev = event; 917 ev = event;
1001 ee = ecore_event_window_match(ev->window); 918 ee = ecore_event_window_match(ev->win);
1002 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 919 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1003 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 920 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1004 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); 921 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
1005 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); 922 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
1006 evas_event_feed_mouse_out(ee->evas, ev->time, NULL); 923 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
1007 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); 924 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
1008 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); 925 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
1009 return ECORE_CALLBACK_PASS_ON; 926 return ECORE_CALLBACK_PASS_ON;
1010} 927}
1011 928
1012static Eina_Bool 929static Eina_Bool
1013_ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) 930_ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
1014{ 931{
1015 Ecore_Evas *ee; 932 Ecore_Evas *ee;
1016 Ecore_Wl_Event_Focus_In *ev; 933 Ecore_Wl_Event_Focus_In *ev;
@@ -1018,9 +935,9 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *
1018 LOGFN(__FILE__, __LINE__, __FUNCTION__); 935 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1019 936
1020 ev = event; 937 ev = event;
1021 ee = ecore_event_window_match(ev->window); 938 ee = ecore_event_window_match(ev->win);
1022 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 939 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1023 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 940 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1024 ee->prop.focused = 1; 941 ee->prop.focused = 1;
1025 evas_focus_in(ee->evas); 942 evas_focus_in(ee->evas);
1026 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee); 943 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
@@ -1028,92 +945,53 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *
1028} 945}
1029 946
1030static Eina_Bool 947static Eina_Bool
1031_ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) 948_ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
1032{ 949{
1033 Ecore_Evas *ee; 950 Ecore_Evas *ee;
1034 Ecore_Wl_Event_Focus_Out *ev; 951 Ecore_Wl_Event_Focus_In *ev;
1035 952
1036 LOGFN(__FILE__, __LINE__, __FUNCTION__); 953 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1037 954
1038 ev = event; 955 ev = event;
1039 ee = ecore_event_window_match(ev->window); 956 ee = ecore_event_window_match(ev->win);
1040 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 957 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
1041 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 958 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1042 evas_focus_out(ee->evas); 959 evas_focus_out(ee->evas);
1043 ee->prop.focused = 0; 960 ee->prop.focused = 0;
1044 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee); 961 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1045 return ECORE_CALLBACK_PASS_ON; 962 return ECORE_CALLBACK_PASS_ON;
1046} 963}
1047 964
1048static void 965static Eina_Bool
1049_ecore_evas_wl_handle_configure(void *data, struct wl_shell_surface *shell_surface, uint32_t timestamp __UNUSED__, uint32_t edges __UNUSED__, int32_t width, int32_t height) 966_ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1050{ 967{
1051 Ecore_Evas *ee; 968 Ecore_Evas *ee;
1052 969 Ecore_Wl_Event_Window_Configure *ev;
1053 /* NB: Trap to prevent compositor from crashing */
1054 if ((width <= 0) || (height <= 0)) return;
1055
1056 if (!(ee = data)) return;
1057
1058 if ((shell_surface) && (ee->engine.wl.shell_surface))
1059 {
1060 if (ee->engine.wl.shell_surface != shell_surface) return;
1061 ecore_evas_resize(ee, width, height);
1062 }
1063}
1064
1065static void
1066_ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__)
1067{
1068
1069}
1070
1071static void
1072_ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest)
1073{
1074 static unsigned int format;
1075 char tmp[PATH_MAX];
1076 int fd = -1, stride = 0, size = 0;
1077 void *ret;
1078 970
1079 LOGFN(__FILE__, __LINE__, __FUNCTION__); 971 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1080 972
1081 if (dest) *dest = NULL; 973 ev = event;
1082 974 ee = ecore_event_window_match(ev->win);
1083 if (!format) format = ecore_wl_format_get(); 975 if (!ee) return ECORE_CALLBACK_PASS_ON;
1084 976 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1085 strcpy(tmp, "/tmp/ecore-wayland_shm-XXXXXX"); 977 if ((ee->x != ev->x) || (ee->y != ev->y))
1086 if ((fd = mkstemp(tmp)) < 0)
1087 {
1088 ERR("Could not create temporary file.");
1089 return;
1090 }
1091
1092 stride = (ee->w * sizeof(int));
1093 size = (stride * ee->h);
1094 if (ftruncate(fd, size) < 0)
1095 { 978 {
1096 ERR("Could not truncate temporary file."); 979 ee->x = ev->x;
1097 close(fd); 980 ee->y = ev->y;
1098 return; 981 ee->req.x = ee->x;
982 ee->req.y = ee->y;
983 if (ee->func.fn_move) ee->func.fn_move(ee);
1099 } 984 }
1100 985 if ((ee->req.w != ev->w) || (ee->req.h != ev->h))
1101 ret = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
1102 unlink(tmp);
1103
1104 if (ret == MAP_FAILED)
1105 { 986 {
1106 ERR("mmap of temporary file failed."); 987 /* ee->w = ev->w; */
1107 close(fd); 988 /* ee->h = ev->h; */
1108 return; 989 ee->req.w = ev->w;
990 ee->req.h = ev->h;
991 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1109 } 992 }
1110 993
1111 if (dest) *dest = ret; 994 return ECORE_CALLBACK_PASS_ON;
1112
1113 ee->engine.wl.buffer =
1114 wl_shm_create_buffer(ecore_wl_shm_get(), fd, ee->w, ee->h, stride, format);
1115
1116 close(fd);
1117} 995}
1118 996
1119static void 997static void
@@ -1227,30 +1105,9 @@ _ecore_evas_wl_frame_add(Evas *evas)
1227 return evas_object_smart_add(evas, _ecore_evas_wl_smart); 1105 return evas_object_smart_add(evas, _ecore_evas_wl_smart);
1228} 1106}
1229 1107
1230void
1231_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
1232{
1233 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1234
1235 if ((!ee) || (!ee->engine.wl.shell_surface)) return;
1236 wl_shell_surface_resize(ee->engine.wl.shell_surface,
1237 ecore_wl_input_device_get(),
1238 _ecore_evas_wl_btn_timestamp, location);
1239}
1240
1241void
1242_ecore_evas_wayland_shm_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source)
1243{
1244 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1245
1246 if ((!ee) || (!ee->engine.wl.surface)) return;
1247 if ((!source) || (!drag_ee)) return;
1248 ecore_wl_drag_start(source, ee->engine.wl.surface, drag_ee->engine.wl.buffer);
1249}
1250
1251#else 1108#else
1252EAPI Ecore_Evas * 1109EAPI Ecore_Evas *
1253ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int frame __UNUSED__) 1110ecore_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__)
1254{ 1111{
1255 return NULL; 1112 return NULL;
1256} 1113}