aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c')
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c694
1 files changed, 290 insertions, 404 deletions
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c
index 72e8555..e88fc35 100644
--- a/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c
@@ -1,8 +1,8 @@
1#ifdef HAVE_CONFIG_H 1#ifdef HAVE_CONFIG_H
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>
@@ -28,15 +28,15 @@
28#include "Ecore_Evas.h" 28#include "Ecore_Evas.h"
29 29
30#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL 30#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
31# include <wayland-egl.h>
32# include <Evas_Engine_Wayland_Egl.h> 31# include <Evas_Engine_Wayland_Egl.h>
33# include <Ecore_Wayland.h> 32# include <Ecore_Wayland.h>
34 33
35/* local structures */ 34/* local structures */
36typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data; 35typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data;
37struct _EE_Wl_Smart_Data 36struct _EE_Wl_Smart_Data
38{ 37{
39 Evas_Object *frame, *text; 38 Evas_Object *frame;
39 Evas_Object *text;
40 Evas_Coord x, y, w, h; 40 Evas_Coord x, y, w, h;
41}; 41};
42 42
@@ -51,40 +51,33 @@ 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);
76 75
77static Eina_Bool _ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event); 76static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
78static Eina_Bool _ecore_evas_wl_event_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event); 77static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
79static Eina_Bool _ecore_evas_wl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event); 78static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
80static Eina_Bool _ecore_evas_wl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event); 79static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
81static Eina_Bool _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); 80static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
82static Eina_Bool _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
83static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
84static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
85
86static 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);
87static void _ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__);
88 81
89/* SMART stuff for frame */ 82/* SMART stuff for frame */
90static Evas_Smart *_ecore_evas_wl_smart = NULL; 83static Evas_Smart *_ecore_evas_wl_smart = NULL;
@@ -100,94 +93,94 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
100 93
101/* local variables */ 94/* local variables */
102static int _ecore_evas_wl_init_count = 0; 95static int _ecore_evas_wl_init_count = 0;
103static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[8]; 96static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
104static uint32_t _ecore_evas_wl_btn_timestamp;
105static const struct wl_shell_surface_listener _ecore_evas_wl_shell_surface_listener =
106{
107 _ecore_evas_wl_handle_configure,
108 _ecore_evas_wl_handle_popup_done
109};
110 97
111static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 98static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
112{ 99{
113 _ecore_evas_wl_free, 100 _ecore_evas_wl_free,
114 _ecore_evas_wl_callback_resize_set, 101 _ecore_evas_wl_callback_resize_set,
115 _ecore_evas_wl_callback_move_set, 102 _ecore_evas_wl_callback_move_set,
116 NULL, // callback show set 103 NULL,
117 NULL, // callback hide set 104 NULL,
118 _ecore_evas_wl_callback_delete_request_set, 105 _ecore_evas_wl_callback_delete_request_set,
119 NULL, // callback destroy set 106 NULL,
120 _ecore_evas_wl_callback_focus_in_set, 107 _ecore_evas_wl_callback_focus_in_set,
121 _ecore_evas_wl_callback_focus_out_set, 108 _ecore_evas_wl_callback_focus_out_set,
122 _ecore_evas_wl_callback_mouse_in_set, 109 _ecore_evas_wl_callback_mouse_in_set,
123 NULL, // callback mouse out set 110 _ecore_evas_wl_callback_mouse_out_set,
124 NULL, // callback sticky set 111 NULL, // sticky_set
125 NULL, // callback unsticky set 112 NULL, // unsticky_set
126 NULL, // callback pre render set 113 NULL, // pre_render_set
127 NULL, // callback post render set 114 NULL, // post_render_set
128 _ecore_evas_wl_move, 115 _ecore_evas_wl_move,
129 NULL, // func managed move 116 NULL, // managed_move
130 _ecore_evas_wl_resize, 117 _ecore_evas_wl_resize,
131 NULL, // _ecore_evas_wl_move_resize, 118 NULL, // move_resize
132 NULL, // func rotation set 119 NULL, // rotation_set
133 NULL, // func shaped set 120 NULL, // shaped_set
134 _ecore_evas_wl_show, 121 _ecore_evas_wl_show,
135 _ecore_evas_wl_hide, 122 _ecore_evas_wl_hide,
136 _ecore_evas_wl_raise, 123 _ecore_evas_wl_raise,
137 _ecore_evas_wl_lower, 124 NULL, // lower
138 _ecore_evas_wl_activate, 125 NULL, // activate
139 _ecore_evas_wl_title_set, 126 _ecore_evas_wl_title_set,
140 _ecore_evas_wl_name_class_set, 127 _ecore_evas_wl_name_class_set,
141 _ecore_evas_wl_size_min_set, 128 _ecore_evas_wl_size_min_set,
142 _ecore_evas_wl_size_max_set, 129 _ecore_evas_wl_size_max_set,
143 _ecore_evas_wl_size_base_set, 130 _ecore_evas_wl_size_base_set,
144 _ecore_evas_wl_size_step_set, 131 _ecore_evas_wl_size_step_set,
145 _ecore_evas_wl_object_cursor_set, 132 NULL, // object_cursor_set
146 _ecore_evas_wl_layer_set, 133 _ecore_evas_wl_layer_set,
147 _ecore_evas_wl_focus_set, 134 NULL, // focus set
148 _ecore_evas_wl_iconified_set, 135 _ecore_evas_wl_iconified_set,
149 NULL, // func borderless set 136 NULL, // borderless set
150 NULL, // func override set 137 NULL, // override set
151 _ecore_evas_wl_maximized_set, 138 _ecore_evas_wl_maximized_set,
152 _ecore_evas_wl_fullscreen_set, 139 _ecore_evas_wl_fullscreen_set,
153 NULL, // _ecore_evas_wl_avoid_damage_set, 140 NULL, // func avoid_damage set
154 NULL, // func withdrawn set 141 NULL, // func withdrawn set
155 NULL, // func sticky set 142 NULL, // func sticky set
156 NULL, // func ignore events set 143 _ecore_evas_wl_ignore_events_set,
157 NULL, // func alpha set 144 _ecore_evas_wl_alpha_set,
158 NULL, // func transparent set 145 _ecore_evas_wl_transparent_set,
146 NULL,
147 NULL,
148 NULL,
149 NULL,
150 NULL,
151 NULL,
159 _ecore_evas_wl_render, 152 _ecore_evas_wl_render,
160 _ecore_evas_wl_screen_geometry_get 153 _ecore_evas_wl_screen_geometry_get
161}; 154};
162 155
163#endif 156/* external variables */
164 157
165#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL 158/* external functions */
166EAPI Ecore_Evas * 159EAPI Ecore_Evas *
167ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, int frame) 160ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
168{ 161{
162 Ecore_Wl_Window *p = NULL;
169 Evas_Engine_Info_Wayland_Egl *einfo; 163 Evas_Engine_Info_Wayland_Egl *einfo;
170 Ecore_Evas *ee; 164 Ecore_Evas *ee;
171 int method = 0; 165 int method = 0;
172 static int _win_id = 1;
173 166
174 LOGFN(__FILE__, __LINE__, __FUNCTION__); 167 LOGFN(__FILE__, __LINE__, __FUNCTION__);
175 168
176 if (!(method = evas_render_method_lookup("wayland_egl"))) 169 if (!(method = evas_render_method_lookup("wayland_egl")))
177 { 170 {
178 printf("Render method lookup failed for Wayland Egl"); 171 ERR("Render method lookup failed for Wayland_Egl");
179 return NULL; 172 return NULL;
180 } 173 }
181 174
182 if (!ecore_wl_init(disp_name)) 175 if (!ecore_wl_init(disp_name))
183 { 176 {
184 printf("Failed to initialize Ecore Wayland"); 177 ERR("Failed to initialize Ecore_Wayland");
185 return NULL; 178 return NULL;
186 } 179 }
187 180
188 if (!(ee = calloc(1, sizeof(Ecore_Evas)))) 181 if (!(ee = calloc(1, sizeof(Ecore_Evas))))
189 { 182 {
190 printf("Failed to allocate Ecore_Evas."); 183 ERR("Failed to allocate Ecore_Evas");
191 ecore_wl_shutdown(); 184 ecore_wl_shutdown();
192 return NULL; 185 return NULL;
193 } 186 }
@@ -204,17 +197,22 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in
204 if (w < 1) w = 1; 197 if (w < 1) w = 1;
205 if (h < 1) h = 1; 198 if (h < 1) h = 1;
206 199
207 ee->req.x = ee->x = x; 200 ee->x = x;
208 ee->req.y = ee->y = y; 201 ee->y = y;
209 ee->req.w = ee->w = w; 202 ee->w = w;
210 ee->req.h = ee->h = h; 203 ee->h = h;
204 ee->req.x = ee->x;
205 ee->req.y = ee->y;
206 ee->req.w = ee->w;
207 ee->req.h = ee->h;
211 ee->rotation = 0; 208 ee->rotation = 0;
212 ee->prop.max.w = ee->prop.max.h = 32767; 209 ee->prop.max.w = 32767;
210 ee->prop.max.h = 32767;
213 ee->prop.layer = 4; 211 ee->prop.layer = 4;
214 ee->prop.request_pos = 0; 212 ee->prop.request_pos = 0;
215 ee->prop.sticky = 0; 213 ee->prop.sticky = 0;
216 ee->prop.draw_frame = frame; 214 ee->prop.draw_frame = frame;
217 ee->prop.window = _win_id++; 215 ee->alpha = EINA_FALSE;
218 216
219 ee->evas = evas_new(); 217 ee->evas = evas_new();
220 evas_data_attach_set(ee->evas, ee); 218 evas_data_attach_set(ee->evas, ee);
@@ -222,29 +220,43 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in
222 evas_output_size_set(ee->evas, ee->w, ee->h); 220 evas_output_size_set(ee->evas, ee->w, ee->h);
223 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);
224 222
225 if (ee->prop.draw_frame) 223 /* FIXME: This needs to be set based on theme & scale */
224 if (ee->prop.draw_frame)
226 evas_output_framespace_set(ee->evas, 4, 18, 8, 22); 225 evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
227 226
228 if ((einfo = (Evas_Engine_Info_Wayland_Egl *)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_EGL_WINDOW);
235 ee->prop.window = ee->engine.wl.win->id;
236
237 if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
229 { 238 {
230 einfo->info.display = ecore_wl_display_get(); 239 einfo->info.display = ecore_wl_display_get();
240 einfo->info.destination_alpha = EINA_FALSE;
231 einfo->info.rotation = ee->rotation; 241 einfo->info.rotation = ee->rotation;
232 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) 242 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
233 { 243 {
234 printf("Failed to set Evas Engine Info for '%s'.", ee->driver); 244 ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
235 ecore_evas_free(ee); 245 ecore_evas_free(ee);
246 _ecore_evas_wl_shutdown();
247 ecore_wl_shutdown();
236 return NULL; 248 return NULL;
237 } 249 }
238 } 250 }
239 else 251 else
240 { 252 {
241 printf("Failed to get Evas Engine Info for '%s'.", ee->driver); 253 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
242 ecore_evas_free(ee); 254 ecore_evas_free(ee);
255 _ecore_evas_wl_shutdown();
256 ecore_wl_shutdown();
243 return NULL; 257 return NULL;
244 } 258 }
245 259
246 /* NB: we need to be notified before 'free' so we can munmap the evas
247 * engine destination */
248 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free); 260 ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free);
249 261
250 if (ee->prop.draw_frame) 262 if (ee->prop.draw_frame)
@@ -270,37 +282,28 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in
270 282
271/* local functions */ 283/* local functions */
272static int 284static int
273_ecore_evas_wl_init(void) 285_ecore_evas_wl_init(void)
274{ 286{
275 LOGFN(__FILE__, __LINE__, __FUNCTION__); 287 LOGFN(__FILE__, __LINE__, __FUNCTION__);
276 288
277 if (++_ecore_evas_wl_init_count != 1) 289 if (++_ecore_evas_wl_init_count != 1)
278 return _ecore_evas_wl_init_count; 290 return _ecore_evas_wl_init_count;
279 291
280 _ecore_evas_wl_event_handlers[0] = 292 _ecore_evas_wl_event_hdls[0] =
281 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
282 _ecore_evas_wl_event_mouse_down, NULL);
283 _ecore_evas_wl_event_handlers[1] =
284 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
285 _ecore_evas_wl_event_mouse_up, NULL);
286 _ecore_evas_wl_event_handlers[2] =
287 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
288 _ecore_evas_wl_event_mouse_move, NULL);
289 _ecore_evas_wl_event_handlers[3] =
290 ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
291 _ecore_evas_wl_event_mouse_wheel, NULL);
292 _ecore_evas_wl_event_handlers[4] =
293 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN, 293 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
294 _ecore_evas_wl_event_mouse_in, NULL); 294 _ecore_evas_wl_cb_mouse_in, NULL);
295 _ecore_evas_wl_event_handlers[5] = 295 _ecore_evas_wl_event_hdls[1] =
296 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT, 296 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
297 _ecore_evas_wl_event_mouse_out, NULL); 297 _ecore_evas_wl_cb_mouse_out, NULL);
298 _ecore_evas_wl_event_handlers[6] = 298 _ecore_evas_wl_event_hdls[2] =
299 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, 299 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
300 _ecore_evas_wl_event_focus_in, NULL); 300 _ecore_evas_wl_cb_focus_in, NULL);
301 _ecore_evas_wl_event_handlers[7] = 301 _ecore_evas_wl_event_hdls[3] =
302 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, 302 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
303 _ecore_evas_wl_event_focus_out, NULL); 303 _ecore_evas_wl_cb_focus_out, NULL);
304 _ecore_evas_wl_event_hdls[4] =
305 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
306 _ecore_evas_wl_cb_window_configure, NULL);
304 307
305 ecore_event_evas_init(); 308 ecore_event_evas_init();
306 309
@@ -308,7 +311,7 @@ _ecore_evas_wl_init(void)
308} 311}
309 312
310static int 313static int
311_ecore_evas_wl_shutdown(void) 314_ecore_evas_wl_shutdown(void)
312{ 315{
313 unsigned int i = 0; 316 unsigned int i = 0;
314 317
@@ -317,10 +320,10 @@ _ecore_evas_wl_shutdown(void)
317 if (--_ecore_evas_wl_init_count != 0) 320 if (--_ecore_evas_wl_init_count != 0)
318 return _ecore_evas_wl_init_count; 321 return _ecore_evas_wl_init_count;
319 322
320 for (i = 0; i < sizeof(_ecore_evas_wl_event_handlers) / sizeof(Ecore_Event_Handler *); i++) 323 for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
321 { 324 {
322 if (_ecore_evas_wl_event_handlers[i]) 325 if (_ecore_evas_wl_event_hdls[i])
323 ecore_event_handler_del(_ecore_evas_wl_event_handlers[i]); 326 ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
324 } 327 }
325 328
326 ecore_event_evas_shutdown(); 329 ecore_event_evas_shutdown();
@@ -338,24 +341,16 @@ _ecore_evas_wl_pre_free(Ecore_Evas *ee)
338} 341}
339 342
340static void 343static void
341_ecore_evas_wl_free(Ecore_Evas *ee) 344_ecore_evas_wl_free(Ecore_Evas *ee)
342{ 345{
343 LOGFN(__FILE__, __LINE__, __FUNCTION__); 346 LOGFN(__FILE__, __LINE__, __FUNCTION__);
344 347
345 if (ee) 348 if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
346 { 349 ee->engine.wl.win = NULL;
347 /* destroy shell surface */
348 if (ee->engine.wl.shell_surface)
349 wl_shell_surface_destroy(ee->engine.wl.shell_surface);
350 ee->engine.wl.shell_surface = NULL;
351 350
352 /* destroy surface */ 351 ecore_event_window_unregister(ee->prop.window);
353 if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); 352 ecore_evas_input_event_unregister(ee);
354 ee->engine.wl.surface = NULL;
355 353
356 ecore_event_window_unregister(ee->prop.window);
357 ecore_evas_input_event_unregister(ee);
358 }
359 _ecore_evas_wl_shutdown(); 354 _ecore_evas_wl_shutdown();
360 ecore_wl_shutdown(); 355 ecore_wl_shutdown();
361} 356}
@@ -415,138 +410,131 @@ _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee
415} 410}
416 411
417static void 412static void
418_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) 413_ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
414{
415 LOGFN(__FILE__, __LINE__, __FUNCTION__);
416
417 if (!ee) return;
418 ee->func.fn_mouse_out = func;
419}
420
421static void
422_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
419{ 423{
420 LOGFN(__FILE__, __LINE__, __FUNCTION__); 424 LOGFN(__FILE__, __LINE__, __FUNCTION__);
421 425
422 if (!ee) return; 426 if (!ee) return;
423// if ((ee->x == x) && (ee->y == y)) return;
424 ee->req.x = x; 427 ee->req.x = x;
425 ee->req.y = y; 428 ee->req.y = y;
426
427 ee->x = x; 429 ee->x = x;
428 ee->y = y; 430 ee->y = y;
429 if (ee->engine.wl.shell_surface) 431 if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y);
430 {
431 wl_shell_surface_move(ee->engine.wl.shell_surface,
432 ecore_wl_input_device_get(),
433 _ecore_evas_wl_btn_timestamp);
434 }
435 if (ee->func.fn_move) ee->func.fn_move(ee); 432 if (ee->func.fn_move) ee->func.fn_move(ee);
436} 433}
437 434
438static void 435static void
439_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) 436_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
440{ 437{
441 LOGFN(__FILE__, __LINE__, __FUNCTION__); 438 LOGFN(__FILE__, __LINE__, __FUNCTION__);
442 439
443 if (!ee) return; 440 if (!ee) return;
444 if (w < 1) w = 1; 441 if (w < 1) w = 1;
445 if (h < 1) h = 1; 442 if (h < 1) h = 1;
446 if ((ee->w == w) && (ee->h == h)) return; 443// if ((ee->w == w) && (ee->h == h)) return;
444
445 if (ee->prop.min.w > w) w = ee->prop.min.w;
446 else if (w > ee->prop.max.w) w = ee->prop.max.w;
447 if (ee->prop.min.h > h) h = ee->prop.min.h;
448 else if (h > ee->prop.max.h) h = ee->prop.max.h;
447 449
448 ee->req.w = w; 450 ee->req.w = w;
449 ee->req.h = h; 451 ee->req.h = h;
450 452
451 /* if (ee->visible) */ 453// ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h);
452 /* { */
453 /* damage old surface, if it exists */
454
455 /* NB: This removes any lingering screen artifacts in the compositor.
456 * This may be a 'HACK' if the issue is actually in the wayland
457 * compositor, but for now lets implement this so we don't have screen
458 * artifacts laying around during a resize */
459 /* if (ee->engine.wl.surface) */
460 /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */
461 /* } */
462 454
463 ee->w = w; 455 ee->w = w;
464 ee->h = h; 456 ee->h = h;
465 457
466// ecore_wl_flush(); 458 /* change evas output & viewport sizes */
467
468 evas_output_size_set(ee->evas, ee->w, ee->h); 459 evas_output_size_set(ee->evas, ee->w, ee->h);
469 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); 460 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
470 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); 461 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
471 if (ee->engine.wl.frame) 462 if (ee->engine.wl.frame)
472 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); 463 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
473 464
474 /* if ((ee->visible) && (ee->engine.wl.surface)) */ 465 /* set new engine destination */
475 /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */ 466 /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
467
468 /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */
469 ecore_wl_flush();
470
471 ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
476 472
477 if (ee->func.fn_resize) ee->func.fn_resize(ee); 473 if (ee->func.fn_resize) ee->func.fn_resize(ee);
478} 474}
479 475
480static void 476static void
481_ecore_evas_wl_show(Ecore_Evas *ee) 477_ecore_evas_wl_show(Ecore_Evas *ee)
482{ 478{
483 Evas_Engine_Info_Wayland_Egl *einfo; 479 Evas_Engine_Info_Wayland_Egl *einfo;
484 480
485 LOGFN(__FILE__, __LINE__, __FUNCTION__); 481 LOGFN(__FILE__, __LINE__, __FUNCTION__);
486 482
487 if (!ee) return; 483 if ((!ee) || (ee->visible)) return;
488 if (ee->visible) return;
489
490 einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
491 484
492 /* create new surface */ 485 if (ee->engine.wl.win)
493 ee->engine.wl.surface = 486 {
494 wl_compositor_create_surface(ecore_wl_compositor_get()); 487 ecore_wl_window_show(ee->engine.wl.win);
495 wl_surface_set_user_data(ee->engine.wl.surface, (void *)ee->prop.window); 488 ecore_wl_flush();
489 }
496 490
497 /* create new shell surface */ 491 einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
498 ee->engine.wl.shell_surface = 492 if (!einfo)
499 wl_shell_get_shell_surface(ecore_wl_shell_get(), ee->engine.wl.surface); 493 {
494 ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
495 return;
496 }
500 497
501 /* set the engine surface here. This should trigger an egl window create */ 498 einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win);
502 einfo->info.surface = ee->engine.wl.surface;
503 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); 499 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
504 500
505 /* add listener for configure events (happen on shell surface resize) */
506 wl_shell_surface_add_listener(ee->engine.wl.shell_surface,
507 &_ecore_evas_wl_shell_surface_listener, ee);
508
509 /* Raise this surface to the top */
510 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface);
511
512 if (ee->engine.wl.frame) 501 if (ee->engine.wl.frame)
513 { 502 {
514 evas_object_show(ee->engine.wl.frame); 503 evas_object_show(ee->engine.wl.frame);
515 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); 504 evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
516 } 505 }
517 506
518 ecore_wl_flush(); 507 /* ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); */
519 508
520 ee->visible = 1; 509 ee->visible = 1;
521 if (ee->func.fn_show) ee->func.fn_show(ee); 510 if (ee->func.fn_show) ee->func.fn_show(ee);
522} 511}
523 512
524static void 513static void
525_ecore_evas_wl_hide(Ecore_Evas *ee) 514_ecore_evas_wl_hide(Ecore_Evas *ee)
526{ 515{
527 Evas_Engine_Info_Wayland_Egl *einfo; 516 Evas_Engine_Info_Wayland_Egl *einfo;
528 517
529 LOGFN(__FILE__, __LINE__, __FUNCTION__); 518 LOGFN(__FILE__, __LINE__, __FUNCTION__);
530 519
531 if (!ee) return; 520 if ((!ee) || (!ee->visible)) return;
532 if (!ee->visible) return;
533
534 /* get engine info */
535 einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
536 einfo->info.surface = NULL;
537 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
538 521
539 /* destroy shell surface */ 522 if (ee->engine.wl.win)
540 if (ee->engine.wl.shell_surface) 523 {
541 wl_shell_surface_destroy(ee->engine.wl.shell_surface); 524 ecore_wl_window_hide(ee->engine.wl.win);
542 ee->engine.wl.shell_surface = NULL; 525 ecore_wl_flush();
526 }
543 527
544 /* destroy surface */ 528 einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
545 if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); 529 if (einfo)
546 ee->engine.wl.surface = NULL; 530 {
531 einfo->info.surface = NULL;
532 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
533 }
547 534
548 ee->visible = 0; 535 ee->visible = 0;
549 ee->should_be_visible = 0; 536 ee->should_be_visible = 0;
537
550 if (ee->func.fn_hide) ee->func.fn_hide(ee); 538 if (ee->func.fn_hide) ee->func.fn_hide(ee);
551} 539}
552 540
@@ -556,39 +544,18 @@ _ecore_evas_wl_raise(Ecore_Evas *ee)
556 LOGFN(__FILE__, __LINE__, __FUNCTION__); 544 LOGFN(__FILE__, __LINE__, __FUNCTION__);
557 545
558 if ((!ee) || (!ee->visible)) return; 546 if ((!ee) || (!ee->visible)) return;
559 if (!ee->engine.wl.shell_surface) return; 547 ecore_wl_window_raise(ee->engine.wl.win);
560 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface);
561}
562
563static void
564_ecore_evas_wl_lower(Ecore_Evas *ee)
565{
566 LOGFN(__FILE__, __LINE__, __FUNCTION__);
567
568 if ((!ee) || (!ee->visible)) return;
569 /* FIXME: Need a way to tell Wayland to lower */
570}
571
572static void
573_ecore_evas_wl_activate(Ecore_Evas *ee)
574{
575 LOGFN(__FILE__, __LINE__, __FUNCTION__);
576
577 if ((!ee) || (!ee->visible)) return;
578 if (!ee->engine.wl.shell_surface) return;
579 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface);
580} 548}
581 549
582static void 550static void
583_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t) 551_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
584{ 552{
585 LOGFN(__FILE__, __LINE__, __FUNCTION__); 553 LOGFN(__FILE__, __LINE__, __FUNCTION__);
586 554
587 if (!ee) return; 555 if (!ee) return;
588 if (ee->prop.title) free(ee->prop.title); 556 if (ee->prop.title) free(ee->prop.title);
589 ee->prop.title = NULL; 557 ee->prop.title = NULL;
590 if (t) ee->prop.title = strdup(t); 558 if (title) ee->prop.title = strdup(title);
591
592 if ((ee->prop.draw_frame) && (ee->engine.wl.frame)) 559 if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
593 { 560 {
594 EE_Wl_Smart_Data *sd; 561 EE_Wl_Smart_Data *sd;
@@ -666,106 +633,101 @@ _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h)
666} 633}
667 634
668static void 635static void
669_ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y) 636_ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer)
670{ 637{
671 int x = 0, y = 0;
672
673 LOGFN(__FILE__, __LINE__, __FUNCTION__); 638 LOGFN(__FILE__, __LINE__, __FUNCTION__);
674 639
675 if (!ee) return; 640 if (!ee) return;
676 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); 641 if (ee->prop.layer == layer) return;
677 ee->prop.cursor.object = NULL; 642 if (layer < 1) layer = 1;
678 643 else if (layer > 255) layer = 255;
679 if (!obj) 644 ee->prop.layer = layer;
680 {
681 ee->prop.cursor.layer = 0;
682 ee->prop.cursor.hot.x = 0;
683 ee->prop.cursor.hot.y = 0;
684 return;
685 }
686
687 ee->prop.cursor.object = obj;
688 ee->prop.cursor.layer = layer;
689 ee->prop.cursor.hot.x = hot_x;
690 ee->prop.cursor.hot.y = hot_y;
691
692 evas_pointer_output_xy_get(ee->evas, &x, &y);
693 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
694 evas_object_move(ee->prop.cursor.object,
695 x - ee->prop.cursor.hot.x, y - ee->prop.cursor.hot.y);
696 evas_object_pass_events_set(ee->prop.cursor.object, 1);
697 if (evas_pointer_inside_get(ee->evas))
698 evas_object_show(ee->prop.cursor.object);
699
700 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
701 _ecore_evas_wl_object_cursor_del, ee);
702} 645}
703 646
704static void 647static void
705_ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) 648_ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify)
706{ 649{
707 Ecore_Evas *ee; 650 LOGFN(__FILE__, __LINE__, __FUNCTION__);
708 651
709 if (!(ee = data)) return; 652 if (!ee) return;
710 ee->prop.cursor.object = NULL; 653 if (ee->prop.iconified == iconify) return;
654 ee->prop.iconified = iconify;
655 /* FIXME: Implement this in Wayland someshow */
711} 656}
712 657
713static void 658static void
714_ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) 659_ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max)
715{ 660{
716 LOGFN(__FILE__, __LINE__, __FUNCTION__); 661 LOGFN(__FILE__, __LINE__, __FUNCTION__);
717 662
718 if (!ee) return; 663 if (!ee) return;
719 if (ee->prop.layer == layer) return; 664 if (ee->prop.maximized == max) return;
720 if (layer < 1) layer = 1; 665 ee->prop.maximized = max;
721 else if (layer > 255) layer = 255; 666 ecore_wl_window_maximized_set(ee->engine.wl.win, max);
722 ee->prop.layer = layer;
723} 667}
724 668
725static void 669static void
726_ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__) 670_ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full)
727{ 671{
728 LOGFN(__FILE__, __LINE__, __FUNCTION__); 672 LOGFN(__FILE__, __LINE__, __FUNCTION__);
729 673
730 if ((!ee) || (!ee->visible)) return; 674 if ((!ee) || (!ee->visible)) return;
731 if (!ee->engine.wl.shell_surface) return; 675 if (ee->prop.fullscreen == full) return;
732 wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); 676 ee->prop.fullscreen = full;
677 ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
733} 678}
734 679
735static void 680static void
736_ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify) 681_ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore)
737{ 682{
738 LOGFN(__FILE__, __LINE__, __FUNCTION__); 683 LOGFN(__FILE__, __LINE__, __FUNCTION__);
739 684
740 if (!ee) return; 685 if (!ee) return;
741 if (ee->prop.iconified == iconify) return; 686 ee->ignore_events = ignore;
742 ee->prop.iconified = iconify; 687 /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
743 /* FIXME: Implement this in Wayland someshow */
744} 688}
745 689
746static void 690static void
747_ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max) 691_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
748{ 692{
693 Evas_Engine_Info_Wayland_Egl *einfo;
694
749 LOGFN(__FILE__, __LINE__, __FUNCTION__); 695 LOGFN(__FILE__, __LINE__, __FUNCTION__);
750 696
751 if (!ee) return; 697 if (!ee) return;
752 if (ee->prop.maximized == max) return; 698 if ((ee->alpha == alpha)) return;
753 ee->prop.maximized = max; 699 ee->alpha = alpha;
754 /* FIXME: Implement this in Wayland someshow */ 700 if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
701 {
702 einfo->info.destination_alpha = alpha;
703 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
704 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
705 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
706 }
755} 707}
756 708
757static void 709static void
758_ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full __UNUSED__) 710_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
759{ 711{
712 Evas_Engine_Info_Wayland_Egl *einfo;
713
760 LOGFN(__FILE__, __LINE__, __FUNCTION__); 714 LOGFN(__FILE__, __LINE__, __FUNCTION__);
761 715
762 if ((!ee) || (!ee->visible)) return; 716 if (!ee) return;
763 if (!ee->engine.wl.shell_surface) return; 717 if ((ee->transparent == transparent)) return;
764 wl_shell_surface_set_fullscreen(ee->engine.wl.shell_surface); 718 ee->transparent = transparent;
719 if (!ee->visible) return;
720 if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
721 {
722 einfo->info.destination_alpha = transparent;
723 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
724 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
725 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
726 }
765} 727}
766 728
767static int 729static int
768_ecore_evas_wl_render(Ecore_Evas *ee) 730_ecore_evas_wl_render(Ecore_Evas *ee)
769{ 731{
770 int rend = 0; 732 int rend = 0;
771 733
@@ -789,26 +751,24 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
789 751
790 if ((updates = evas_render_updates(ee->evas))) 752 if ((updates = evas_render_updates(ee->evas)))
791 { 753 {
792 /* if (ee->engine.wl.surface) */ 754 Eina_List *l = NULL;
793 /* { */ 755 Eina_Rectangle *r;
794 /* Eina_List *l = NULL; */ 756
795 /* Eina_Rectangle *r; */ 757 LOGFN(__FILE__, __LINE__, __FUNCTION__);
796 758
797 /* EINA_LIST_FOREACH(updates, l, r) */ 759 EINA_LIST_FOREACH(updates, l, r)
798 /* wl_surface_damage(ee->engine.wl.surface, */ 760 ecore_wl_window_damage(ee->engine.wl.win,
799 /* r->x, r->y, r->w, r->h); */ 761 r->x, r->y, r->w, r->h);
800 /* } */ 762
763 ecore_wl_flush();
801 764
802 evas_render_updates_free(updates); 765 evas_render_updates_free(updates);
803 _ecore_evas_idle_timeout_update(ee); 766 _ecore_evas_idle_timeout_update(ee);
804 rend = 1; 767 rend = 1;
805
806 ecore_wl_flush();
807 } 768 }
808 769
809 if (ee->func.fn_post_render) ee->func.fn_post_render(ee); 770 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
810 } 771 }
811
812 return rend; 772 return rend;
813} 773}
814 774
@@ -822,77 +782,18 @@ _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int
822 ecore_wl_screen_size_get(w, h); 782 ecore_wl_screen_size_get(w, h);
823} 783}
824 784
825static Eina_Bool 785void
826_ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event) 786_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
827{
828 Ecore_Evas *ee;
829 Ecore_Event_Mouse_Button *ev;
830
831 LOGFN(__FILE__, __LINE__, __FUNCTION__);
832
833 ev = event;
834 _ecore_evas_wl_btn_timestamp = ev->timestamp;
835 ee = ecore_event_window_match(ev->window);
836 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
837 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
838 evas_event_feed_mouse_down(ee->evas, ev->buttons, ev->modifiers,
839 ev->timestamp, NULL);
840 return ECORE_CALLBACK_PASS_ON;
841}
842
843static Eina_Bool
844_ecore_evas_wl_event_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event)
845{
846 Ecore_Evas *ee;
847 Ecore_Event_Mouse_Button *ev;
848
849 LOGFN(__FILE__, __LINE__, __FUNCTION__);
850
851 ev = event;
852 ee = ecore_event_window_match(ev->window);
853 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
854 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
855 evas_event_feed_mouse_up(ee->evas, ev->buttons, ev->modifiers,
856 ev->timestamp, NULL);
857 return ECORE_CALLBACK_PASS_ON;
858}
859
860static Eina_Bool
861_ecore_evas_wl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
862{
863 Ecore_Evas *ee;
864 Ecore_Event_Mouse_Move *ev;
865
866 ev = event;
867 ee = ecore_event_window_match(ev->window);
868 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
869 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
870 ee->mouse.x = ev->x;
871 ee->mouse.y = ev->y;
872 evas_event_feed_mouse_move(ee->evas, ev->x, ev->y, ev->timestamp, NULL);
873 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
874 return ECORE_CALLBACK_PASS_ON;
875}
876
877static Eina_Bool
878_ecore_evas_wl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
879{ 787{
880 Ecore_Evas *ee;
881 Ecore_Event_Mouse_Wheel *ev;
882
883 LOGFN(__FILE__, __LINE__, __FUNCTION__); 788 LOGFN(__FILE__, __LINE__, __FUNCTION__);
884 789
885 ev = event; 790 if (!ee) return;
886 ee = ecore_event_window_match(ev->window); 791 if (ee->engine.wl.win)
887 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 792 ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
888 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
889 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z,
890 ev->timestamp, NULL);
891 return ECORE_CALLBACK_PASS_ON;
892} 793}
893 794
894static Eina_Bool 795static Eina_Bool
895_ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) 796_ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
896{ 797{
897 Ecore_Evas *ee; 798 Ecore_Evas *ee;
898 Ecore_Wl_Event_Mouse_In *ev; 799 Ecore_Wl_Event_Mouse_In *ev;
@@ -900,18 +801,18 @@ _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *
900 LOGFN(__FILE__, __LINE__, __FUNCTION__); 801 LOGFN(__FILE__, __LINE__, __FUNCTION__);
901 802
902 ev = event; 803 ev = event;
903 ee = ecore_event_window_match(ev->window); 804 ee = ecore_event_window_match(ev->win);
904 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 805 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
905 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 806 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
906 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee); 807 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
907 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); 808 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
908 evas_event_feed_mouse_in(ee->evas, ev->time, NULL); 809 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
909 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); 810 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
910 return ECORE_CALLBACK_PASS_ON; 811 return ECORE_CALLBACK_PASS_ON;
911} 812}
912 813
913static Eina_Bool 814static Eina_Bool
914_ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) 815_ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
915{ 816{
916 Ecore_Evas *ee; 817 Ecore_Evas *ee;
917 Ecore_Wl_Event_Mouse_Out *ev; 818 Ecore_Wl_Event_Mouse_Out *ev;
@@ -919,19 +820,19 @@ _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void
919 LOGFN(__FILE__, __LINE__, __FUNCTION__); 820 LOGFN(__FILE__, __LINE__, __FUNCTION__);
920 821
921 ev = event; 822 ev = event;
922 ee = ecore_event_window_match(ev->window); 823 ee = ecore_event_window_match(ev->win);
923 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 824 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
924 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 825 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
925 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); 826 ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
926 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); 827 _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
927 evas_event_feed_mouse_out(ee->evas, ev->time, NULL); 828 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
928 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); 829 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
929 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); 830 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
930 return ECORE_CALLBACK_PASS_ON; 831 return ECORE_CALLBACK_PASS_ON;
931} 832}
932 833
933static Eina_Bool 834static Eina_Bool
934_ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) 835_ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
935{ 836{
936 Ecore_Evas *ee; 837 Ecore_Evas *ee;
937 Ecore_Wl_Event_Focus_In *ev; 838 Ecore_Wl_Event_Focus_In *ev;
@@ -939,9 +840,9 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *
939 LOGFN(__FILE__, __LINE__, __FUNCTION__); 840 LOGFN(__FILE__, __LINE__, __FUNCTION__);
940 841
941 ev = event; 842 ev = event;
942 ee = ecore_event_window_match(ev->window); 843 ee = ecore_event_window_match(ev->win);
943 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 844 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
944 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 845 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
945 ee->prop.focused = 1; 846 ee->prop.focused = 1;
946 evas_focus_in(ee->evas); 847 evas_focus_in(ee->evas);
947 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee); 848 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
@@ -949,45 +850,51 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *
949} 850}
950 851
951static Eina_Bool 852static Eina_Bool
952_ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) 853_ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
953{ 854{
954 Ecore_Evas *ee; 855 Ecore_Evas *ee;
955 Ecore_Wl_Event_Focus_Out *ev; 856 Ecore_Wl_Event_Focus_In *ev;
956 857
957 LOGFN(__FILE__, __LINE__, __FUNCTION__); 858 LOGFN(__FILE__, __LINE__, __FUNCTION__);
958 859
959 ev = event; 860 ev = event;
960 ee = ecore_event_window_match(ev->window); 861 ee = ecore_event_window_match(ev->win);
961 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; 862 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
962 if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; 863 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
963 evas_focus_out(ee->evas); 864 evas_focus_out(ee->evas);
964 ee->prop.focused = 0; 865 ee->prop.focused = 0;
965 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee); 866 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
966 return ECORE_CALLBACK_PASS_ON; 867 return ECORE_CALLBACK_PASS_ON;
967} 868}
968 869
969static void 870static Eina_Bool
970_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) 871_ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
971{ 872{
972 Ecore_Evas *ee; 873 Ecore_Evas *ee;
874 Ecore_Wl_Event_Window_Configure *ev;
973 875
974 /* NB: Trap to prevent compositor from crashing */ 876 LOGFN(__FILE__, __LINE__, __FUNCTION__);
975 if ((width <= 0) || (height <= 0)) return;
976
977 if (!(ee = data)) return;
978 877
979 printf("EGL Handle Configure Message\n"); 878 ev = event;
980 if ((shell_surface) && (ee->engine.wl.shell_surface)) 879 ee = ecore_event_window_match(ev->win);
880 if (!ee) return ECORE_CALLBACK_PASS_ON;
881 if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
882 if ((ee->x != ev->x) || (ee->y != ev->y))
981 { 883 {
982 if (ee->engine.wl.shell_surface != shell_surface) return; 884 ee->x = ev->x;
983 ecore_evas_resize(ee, width, height); 885 ee->y = ev->y;
886 ee->req.x = ee->x;
887 ee->req.y = ee->y;
888 if (ee->func.fn_move) ee->func.fn_move(ee);
889 }
890 if ((ee->req.w != ev->w) || (ee->req.h != ev->h))
891 {
892 ee->req.w = ev->w;
893 ee->req.h = ev->h;
894 if (ee->func.fn_resize) ee->func.fn_resize(ee);
984 } 895 }
985}
986
987static void
988_ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__)
989{
990 896
897 return ECORE_CALLBACK_PASS_ON;
991} 898}
992 899
993static void 900static void
@@ -1101,30 +1008,9 @@ _ecore_evas_wl_frame_add(Evas *evas)
1101 return evas_object_smart_add(evas, _ecore_evas_wl_smart); 1008 return evas_object_smart_add(evas, _ecore_evas_wl_smart);
1102} 1009}
1103 1010
1104void
1105_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
1106{
1107 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1108
1109 if ((!ee) || (!ee->engine.wl.shell_surface)) return;
1110 wl_shell_surface_resize(ee->engine.wl.shell_surface,
1111 ecore_wl_input_device_get(),
1112 _ecore_evas_wl_btn_timestamp, location);
1113}
1114
1115void
1116_ecore_evas_wayland_egl_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source)
1117{
1118 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1119
1120 if ((!ee) || (!ee->engine.wl.surface)) return;
1121 if ((!source) || (!drag_ee)) return;
1122 ecore_wl_drag_start(source, ee->engine.wl.surface, drag_ee->engine.wl.buffer);
1123}
1124
1125#else 1011#else
1126EAPI Ecore_Evas * 1012EAPI Ecore_Evas *
1127ecore_evas_wayland_egl_new(const char *disp_name __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int frame __UNUSED__) 1013ecore_evas_wayland_egl_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__)
1128{ 1014{
1129 return NULL; 1015 return NULL;
1130} 1016}