diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c | 769 |
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 | |||
51 | static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); | 51 | static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); |
52 | static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); | 52 | static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); |
53 | static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); | 53 | static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); |
54 | static void _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); | ||
54 | static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y); | 55 | static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y); |
55 | static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); | 56 | static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); |
56 | static void _ecore_evas_wl_show(Ecore_Evas *ee); | 57 | static void _ecore_evas_wl_show(Ecore_Evas *ee); |
57 | static void _ecore_evas_wl_hide(Ecore_Evas *ee); | 58 | static void _ecore_evas_wl_hide(Ecore_Evas *ee); |
58 | static void _ecore_evas_wl_raise(Ecore_Evas *ee); | 59 | static void _ecore_evas_wl_raise(Ecore_Evas *ee); |
59 | static void _ecore_evas_wl_lower(Ecore_Evas *ee); | 60 | static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title); |
60 | static void _ecore_evas_wl_activate(Ecore_Evas *ee); | ||
61 | static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t); | ||
62 | static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c); | 61 | static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c); |
63 | static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); | 62 | static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); |
64 | static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); | 63 | static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); |
65 | static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); | 64 | static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); |
66 | static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); | 65 | static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); |
67 | static void _ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y); | ||
68 | static void _ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__); | ||
69 | static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer); | 66 | static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer); |
70 | static void _ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__); | ||
71 | static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify); | 67 | static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify); |
72 | static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max); | 68 | static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max); |
73 | static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full __UNUSED__); | 69 | static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full); |
70 | static void _ecore_evas_wl_ignore_events_set(Ecore_Evas *ee, int ignore); | ||
71 | static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha); | ||
72 | static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent); | ||
74 | static int _ecore_evas_wl_render(Ecore_Evas *ee); | 73 | static int _ecore_evas_wl_render(Ecore_Evas *ee); |
75 | static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h); | 74 | static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h); |
76 | static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest); | 75 | static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest); |
77 | 76 | ||
78 | static Eina_Bool _ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event); | 77 | static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); |
79 | static Eina_Bool _ecore_evas_wl_event_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event); | 78 | static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); |
80 | static Eina_Bool _ecore_evas_wl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event); | 79 | static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); |
81 | static Eina_Bool _ecore_evas_wl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event); | 80 | static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); |
82 | static Eina_Bool _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); | 81 | static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event); |
83 | static Eina_Bool _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); | ||
84 | static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); | ||
85 | static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); | ||
86 | |||
87 | static 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); | ||
88 | static 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 */ |
91 | static Evas_Smart *_ecore_evas_wl_smart = NULL; | 84 | static 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 */ |
103 | static int _ecore_evas_wl_init_count = 0; | 96 | static int _ecore_evas_wl_init_count = 0; |
104 | static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[8]; | 97 | static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5]; |
105 | static uint32_t _ecore_evas_wl_btn_timestamp; | ||
106 | static 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 | ||
112 | static Ecore_Evas_Engine_Func _ecore_wl_engine_func = | 99 | static 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 */ |
168 | EAPI Ecore_Evas * | 160 | EAPI Ecore_Evas * |
169 | ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, int frame) | 161 | ecore_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 | ||
433 | static void | 424 | static 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 | |||
433 | static 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 | ||
586 | static void | 551 | static 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 | ||
638 | static void | 591 | static 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 | |||
647 | static 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 | |||
657 | static 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 | ||
743 | static void | 676 | static 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 | ||
779 | static void | 688 | static 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 | ||
788 | static void | 699 | static 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 | ||
800 | static void | 710 | static 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 | ||
810 | static void | 721 | static 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 | ||
821 | static void | 731 | static 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 | ||
832 | static void | 750 | static 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 | ||
842 | static int | 769 | static 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 | ||
904 | static Eina_Bool | 831 | static 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 | ||
922 | static 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 | ||
939 | static 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 | ||
956 | static Eina_Bool | 880 | void |
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 | ||
973 | static Eina_Bool | 890 | static 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 | ||
992 | static Eina_Bool | 909 | static 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 | ||
1012 | static Eina_Bool | 929 | static 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 | ||
1030 | static Eina_Bool | 947 | static 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 | ||
1048 | static void | 965 | static 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 | |||
1065 | static void | ||
1066 | _ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__) | ||
1067 | { | ||
1068 | |||
1069 | } | ||
1070 | |||
1071 | static 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 | ||
1119 | static void | 997 | static 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 | ||
1230 | void | ||
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 | |||
1241 | void | ||
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 |
1252 | EAPI Ecore_Evas * | 1109 | EAPI Ecore_Evas * |
1253 | ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int frame __UNUSED__) | 1110 | ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, unsigned int parent __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, Eina_Bool frame __UNUSED__) |
1254 | { | 1111 | { |
1255 | return NULL; | 1112 | return NULL; |
1256 | } | 1113 | } |