From a31808b48b636df66349f7184ab3bffe1c8fd9b1 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Tue, 28 Feb 2012 21:56:39 +0000 Subject: [PATCH] Ecore_Evas (Wayland): Refactor code to match Ecore_Wayland changes. NB: Fixes outstanding issues with running EFL apps as wayland clients. SVN revision: 68516 --- legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h | 15 +- legacy/ecore/src/lib/ecore_evas/ecore_evas.c | 64 +- .../src/lib/ecore_evas/ecore_evas_private.h | 15 +- .../lib/ecore_evas/ecore_evas_wayland_egl.c | 568 ++++++-------- .../lib/ecore_evas/ecore_evas_wayland_shm.c | 715 +++++++----------- 5 files changed, 540 insertions(+), 837 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index a346ad9922..d595ac469e 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -154,6 +154,11 @@ typedef struct _Ecore_Evas Ecore_Evas; typedef void (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee); /**< Callback used for several ecore evas events @since 1.2 */ #endif +#ifndef _ECORE_WAYLAND_H_ +#define _ECORE_WAYLAND_WINDOW_PREDEF +typedef struct _Ecore_Wl_Window Ecore_Wl_Window; +#endif + /* module setup/shutdown calls */ EAPI int ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine); @@ -849,11 +854,13 @@ EAPI Ecore_Evas *ecore_evas_fb_new(const char *disp_name, int rotation, int EAPI Ecore_Evas *ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h); EAPI Ecore_DirectFB_Window *ecore_evas_directfb_window_get(const Ecore_Evas *ee); -EAPI Ecore_Evas *ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, int frame); -EAPI Ecore_Evas *ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, int frame); + +EAPI Ecore_Evas *ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame); +EAPI Ecore_Evas *ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame); EAPI void ecore_evas_wayland_resize(Ecore_Evas *ee, int location); -EAPI void ecore_evas_wayland_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source); -EAPI void ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y); +/* EAPI void ecore_evas_wayland_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source); */ +/* EAPI void ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y); */ +/* EAPI void ecore_evas_wayland_type_set(Ecore_Evas *ee, int type); */ /** * @brief Create a new @c Ecore_Evas canvas bound to the Evas diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index bb5d279d85..6ecd609b7e 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -588,12 +588,13 @@ static Ecore_Evas * _ecore_evas_constructor_wayland_shm(int x, int y, int w, int h, const char *extra_options) { char *disp_name = NULL; - unsigned int frame = 0; + unsigned int frame = 0, parent = 0; Ecore_Evas *ee; _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name); _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame); - ee = ecore_evas_wayland_shm_new(disp_name, x, y, w, h, frame); + _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent); + ee = ecore_evas_wayland_shm_new(disp_name, parent, x, y, w, h, frame); free(disp_name); return ee; @@ -605,12 +606,13 @@ static Ecore_Evas * _ecore_evas_constructor_wayland_egl(int x, int y, int w, int h, const char *extra_options) { char *disp_name = NULL; - unsigned int frame = 0; + unsigned int frame = 0, parent = 0; Ecore_Evas *ee; _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name); _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame); - ee = ecore_evas_wayland_egl_new(disp_name, x, y, w, h, frame); + _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent); + ee = ecore_evas_wayland_egl_new(disp_name, parent, x, y, w, h, frame); free(disp_name); return ee; @@ -2844,64 +2846,10 @@ ecore_evas_wayland_resize(Ecore_Evas *ee, int location) } } -EAPI void -ecore_evas_wayland_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source) -{ - if ((!ee) || (!source)) return; - if (!ee->engine.wl.surface) return; - - if (!strcmp(ee->driver, "wayland_shm")) - { -#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM - _ecore_evas_wayland_shm_drag_start(ee, drag_ee, source); -#endif - } - else if (!strcmp(ee->driver, "wayland_egl")) - { -#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL - _ecore_evas_wayland_egl_drag_start(ee, drag_ee, source); -#endif - } -} - -EAPI void -ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y) -{ - if (!ee) return; - if (!ee->engine.wl.surface) return; - - if (!strcmp(ee->driver, "wayland_shm")) - { -#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM - _ecore_evas_wayland_shm_pointer_set(ee, hot_x, hot_y); -// _ecore_evas_wayland_shm_drag_start(ee, drag_ee, source); -#endif - } - else if (!strcmp(ee->driver, "wayland_egl")) - { -#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL - _ecore_evas_wayland_egl_pointer_set(ee, hot_x, hot_y); -// _ecore_evas_wayland_egl_drag_start(ee, drag_ee, source); -#endif - } -} - #else EAPI void ecore_evas_wayland_resize(Ecore_Evas *ee __UNUSED__, int location __UNUSED__) { -} - -EAPI void -ecore_evas_wayland_drag_start(Ecore_Evas *ee __UNUSED__, Ecore_Evas *drag_ee __UNUSED__, void *source __UNUSED__) -{ - -} - -EAPI void -ecore_evas_wayland_pointer_set(Ecore_Evas *ee __UNUSED__, int hot_x __UNUSED__, int hot_y __UNUSED__) -{ - } #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index 464d3c593d..201337f573 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -279,11 +279,20 @@ struct _Ecore_Evas_Engine #if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL) struct { + Ecore_Wl_Window *parent, *win; Evas_Object *frame; - struct wl_shell_surface *shell_surface; - struct wl_surface *surface; +# if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) struct wl_buffer *buffer; +# endif +# if defined(BUILD_ECORE_EVAS_WAYLAND_EGL) + struct wl_egl_window *egl_window; + EGLSurface egl_surface; +# endif + /* struct wl_shell_surface *shell_surface; */ + /* struct wl_surface *surface; */ + /* struct wl_buffer *buffer; */ + /* int type; */ } wl; #endif @@ -424,12 +433,14 @@ int _ecore_evas_ews_shutdown(void); void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location); void _ecore_evas_wayland_shm_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source); void _ecore_evas_wayland_shm_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y); +void _ecore_evas_wayland_shm_type_set(Ecore_Evas *ee, int type); #endif #ifdef BUILD_ECORE_EVAS_WAYLAND_EGL void _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location); void _ecore_evas_wayland_egl_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source); void _ecore_evas_wayland_egl_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y); +void _ecore_evas_wayland_egl_type_set(Ecore_Evas *ee, int type); #endif void _ecore_evas_fps_debug_init(void); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c index 9db1030c62..b82d068a27 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c @@ -1,8 +1,8 @@ #ifdef HAVE_CONFIG_H -# include +# include "config.h" #endif -//#define LOGFNS 1 +#define LOGFNS 1 #ifdef LOGFNS # include @@ -28,15 +28,15 @@ #include "Ecore_Evas.h" #ifdef BUILD_ECORE_EVAS_WAYLAND_EGL -# include # include # include /* local structures */ typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data; -struct _EE_Wl_Smart_Data +struct _EE_Wl_Smart_Data { - Evas_Object *frame, *text; + Evas_Object *frame; + Evas_Object *text; Evas_Coord x, y, w, h; }; @@ -51,36 +51,30 @@ static void _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*fu static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); +static void _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y); static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_show(Ecore_Evas *ee); static void _ecore_evas_wl_hide(Ecore_Evas *ee); static void _ecore_evas_wl_raise(Ecore_Evas *ee); -static void _ecore_evas_wl_lower(Ecore_Evas *ee); -static void _ecore_evas_wl_activate(Ecore_Evas *ee); -static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t); +static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title); static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c); static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); -static void _ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y); -static void _ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__); static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer); -static void _ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__); static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify); static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max); static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full); static int _ecore_evas_wl_render(Ecore_Evas *ee); static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h); -static Eina_Bool _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); - -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); -static void _ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__); +static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event); /* SMART stuff for frame */ static Evas_Smart *_ecore_evas_wl_smart = NULL; @@ -96,102 +90,94 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas); /* local variables */ static int _ecore_evas_wl_init_count = 0; -static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[4]; - -static const struct wl_shell_surface_listener _ecore_evas_wl_shell_surface_listener = -{ - _ecore_evas_wl_handle_configure, - _ecore_evas_wl_handle_popup_done -}; +static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5]; static Ecore_Evas_Engine_Func _ecore_wl_engine_func = { - _ecore_evas_wl_free, - _ecore_evas_wl_callback_resize_set, - _ecore_evas_wl_callback_move_set, - NULL, // callback show set - NULL, // callback hide set - _ecore_evas_wl_callback_delete_request_set, - NULL, // callback destroy set - _ecore_evas_wl_callback_focus_in_set, - _ecore_evas_wl_callback_focus_out_set, - _ecore_evas_wl_callback_mouse_in_set, - NULL, // callback mouse out set - NULL, // callback sticky set - NULL, // callback unsticky set - NULL, // callback pre render set - NULL, // callback post render set - _ecore_evas_wl_move, - NULL, // func managed move - _ecore_evas_wl_resize, - NULL, // _ecore_evas_wl_move_resize, - NULL, // func rotation set - NULL, // func shaped set - _ecore_evas_wl_show, - _ecore_evas_wl_hide, - _ecore_evas_wl_raise, - _ecore_evas_wl_lower, - _ecore_evas_wl_activate, - _ecore_evas_wl_title_set, - _ecore_evas_wl_name_class_set, - _ecore_evas_wl_size_min_set, - _ecore_evas_wl_size_max_set, - _ecore_evas_wl_size_base_set, - _ecore_evas_wl_size_step_set, - _ecore_evas_wl_object_cursor_set, - _ecore_evas_wl_layer_set, - _ecore_evas_wl_focus_set, - _ecore_evas_wl_iconified_set, - NULL, // func borderless set - NULL, // func override set - _ecore_evas_wl_maximized_set, + _ecore_evas_wl_free, + _ecore_evas_wl_callback_resize_set, + _ecore_evas_wl_callback_move_set, + NULL, + NULL, + _ecore_evas_wl_callback_delete_request_set, + NULL, + _ecore_evas_wl_callback_focus_in_set, + _ecore_evas_wl_callback_focus_out_set, + _ecore_evas_wl_callback_mouse_in_set, + _ecore_evas_wl_callback_mouse_out_set, + NULL, // sticky_set + NULL, // unsticky_set + NULL, // pre_render_set + NULL, // post_render_set + _ecore_evas_wl_move, + NULL, // managed_move + _ecore_evas_wl_resize, + NULL, // move_resize + NULL, // rotation_set + NULL, // shaped_set + _ecore_evas_wl_show, + _ecore_evas_wl_hide, + _ecore_evas_wl_raise, + NULL, // lower + NULL, // activate + _ecore_evas_wl_title_set, + _ecore_evas_wl_name_class_set, + _ecore_evas_wl_size_min_set, + _ecore_evas_wl_size_max_set, + _ecore_evas_wl_size_base_set, + _ecore_evas_wl_size_step_set, + NULL, // object_cursor_set + _ecore_evas_wl_layer_set, + NULL, // focus set + _ecore_evas_wl_iconified_set, + NULL, // borderless set + NULL, // override set + _ecore_evas_wl_maximized_set, _ecore_evas_wl_fullscreen_set, - NULL, // _ecore_evas_wl_avoid_damage_set, + NULL, // func avoid_damage set NULL, // func withdrawn set NULL, // func sticky set - NULL, // func ignore events set + NULL, // func ignore_events set NULL, // func alpha set NULL, // func transparent set - NULL, NULL, NULL, NULL, NULL, NULL, - _ecore_evas_wl_render, _ecore_evas_wl_screen_geometry_get }; -#endif +/* external variables */ -#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL +/* external functions */ EAPI Ecore_Evas * -ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, int frame) +ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) { + Ecore_Wl_Window *p = NULL; Evas_Engine_Info_Wayland_Egl *einfo; Ecore_Evas *ee; int method = 0; - static int _win_id = 1; LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!(method = evas_render_method_lookup("wayland_egl"))) + if (!(method = evas_render_method_lookup("wayland_egl"))) { - printf("Render method lookup failed for Wayland Egl"); + ERR("Render method lookup failed for Wayland_Egl"); return NULL; } - if (!ecore_wl_init(disp_name)) + if (!ecore_wl_init(disp_name)) { - printf("Failed to initialize Ecore Wayland"); + ERR("Failed to initialize Ecore_Wayland"); return NULL; } - if (!(ee = calloc(1, sizeof(Ecore_Evas)))) + if (!(ee = calloc(1, sizeof(Ecore_Evas)))) { - printf("Failed to allocate Ecore_Evas."); + ERR("Failed to allocate Ecore_Evas"); ecore_wl_shutdown(); return NULL; } @@ -208,17 +194,21 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in if (w < 1) w = 1; if (h < 1) h = 1; - ee->req.x = ee->x = x; - ee->req.y = ee->y = y; - ee->req.w = ee->w = w; - ee->req.h = ee->h = h; + ee->x = x; + ee->y = y; + ee->w = w; + ee->h = h; + ee->req.x = ee->x; + ee->req.y = ee->y; + ee->req.w = ee->w; + ee->req.h = ee->h; ee->rotation = 0; - ee->prop.max.w = ee->prop.max.h = 32767; + ee->prop.max.w = 32767; + ee->prop.max.h = 32767; ee->prop.layer = 4; ee->prop.request_pos = 0; ee->prop.sticky = 0; ee->prop.draw_frame = frame; - ee->prop.window = _win_id++; ee->evas = evas_new(); evas_data_attach_set(ee->evas, ee); @@ -226,29 +216,40 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in evas_output_size_set(ee->evas, ee->w, ee->h); evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); - if (ee->prop.draw_frame) + /* FIXME: This needs to be set based on theme & scale */ + if (ee->prop.draw_frame) evas_output_framespace_set(ee->evas, 4, 18, 8, 22); - if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas))) + if (parent) + p = ecore_wl_window_find(parent); + + ee->engine.wl.parent = p; + ee->engine.wl.win = + ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW); + ee->prop.window = ee->engine.wl.win->id; + + if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas))) { einfo->info.display = ecore_wl_display_get(); einfo->info.rotation = ee->rotation; - if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { - printf("Failed to set Evas Engine Info for '%s'.", ee->driver); + ERR("Failed to set Evas Engine Info for '%s'", ee->driver); ecore_evas_free(ee); + _ecore_evas_wl_shutdown(); + ecore_wl_shutdown(); return NULL; } } else { - printf("Failed to get Evas Engine Info for '%s'.", ee->driver); + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); ecore_evas_free(ee); + _ecore_evas_wl_shutdown(); + ecore_wl_shutdown(); return NULL; } - /* NB: we need to be notified before 'free' so we can munmap the evas - * engine destination */ ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free); if (ee->prop.draw_frame) @@ -274,25 +275,28 @@ ecore_evas_wayland_egl_new(const char *disp_name, int x, int y, int w, int h, in /* local functions */ static int -_ecore_evas_wl_init(void) +_ecore_evas_wl_init(void) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (++_ecore_evas_wl_init_count != 1) return _ecore_evas_wl_init_count; - _ecore_evas_wl_event_handlers[0] = + _ecore_evas_wl_event_hdls[0] = ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN, - _ecore_evas_wl_event_mouse_in, NULL); - _ecore_evas_wl_event_handlers[1] = + _ecore_evas_wl_cb_mouse_in, NULL); + _ecore_evas_wl_event_hdls[1] = ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT, - _ecore_evas_wl_event_mouse_out, NULL); - _ecore_evas_wl_event_handlers[2] = + _ecore_evas_wl_cb_mouse_out, NULL); + _ecore_evas_wl_event_hdls[2] = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, - _ecore_evas_wl_event_focus_in, NULL); - _ecore_evas_wl_event_handlers[3] = + _ecore_evas_wl_cb_focus_in, NULL); + _ecore_evas_wl_event_hdls[3] = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, - _ecore_evas_wl_event_focus_out, NULL); + _ecore_evas_wl_cb_focus_out, NULL); + _ecore_evas_wl_event_hdls[4] = + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE, + _ecore_evas_wl_cb_window_configure, NULL); ecore_event_evas_init(); @@ -300,7 +304,7 @@ _ecore_evas_wl_init(void) } static int -_ecore_evas_wl_shutdown(void) +_ecore_evas_wl_shutdown(void) { unsigned int i = 0; @@ -309,10 +313,10 @@ _ecore_evas_wl_shutdown(void) if (--_ecore_evas_wl_init_count != 0) return _ecore_evas_wl_init_count; - for (i = 0; i < sizeof(_ecore_evas_wl_event_handlers) / sizeof(Ecore_Event_Handler *); i++) + for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++) { - if (_ecore_evas_wl_event_handlers[i]) - ecore_event_handler_del(_ecore_evas_wl_event_handlers[i]); + if (_ecore_evas_wl_event_hdls[i]) + ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]); } ecore_event_evas_shutdown(); @@ -330,24 +334,16 @@ _ecore_evas_wl_pre_free(Ecore_Evas *ee) } static void -_ecore_evas_wl_free(Ecore_Evas *ee) +_ecore_evas_wl_free(Ecore_Evas *ee) { LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (ee) - { - /* destroy shell surface */ - if (ee->engine.wl.shell_surface) - wl_shell_surface_destroy(ee->engine.wl.shell_surface); - ee->engine.wl.shell_surface = NULL; + if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win); + ee->engine.wl.win = NULL; - /* destroy surface */ - if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); - ee->engine.wl.surface = NULL; + ecore_event_window_unregister(ee->prop.window); + ecore_evas_input_event_unregister(ee); - ecore_event_window_unregister(ee->prop.window); - ecore_evas_input_event_unregister(ee); - } _ecore_evas_wl_shutdown(); ecore_wl_shutdown(); } @@ -407,106 +403,90 @@ _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee } static void -_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) +_ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)) +{ + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + if (!ee) return; + ee->func.fn_mouse_out = func; +} + +static void +_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!ee) return; -// if ((ee->x == x) && (ee->y == y)) return; ee->req.x = x; ee->req.y = y; - ee->x = x; ee->y = y; - if (ee->engine.wl.shell_surface) - { - wl_shell_surface_move(ee->engine.wl.shell_surface, - ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get()); - } + if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y); if (ee->func.fn_move) ee->func.fn_move(ee); } static void -_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) +_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!ee) return; if (w < 1) w = 1; if (h < 1) h = 1; - if ((ee->w == w) && (ee->h == h)) return; +// if ((ee->w == w) && (ee->h == h)) return; if (ee->prop.min.w > w) w = ee->prop.min.w; else if (w > ee->prop.max.w) w = ee->prop.max.w; - if (ee->prop.min.h > h) h = ee->prop.min.h; else if (h > ee->prop.max.h) h = ee->prop.max.h; ee->req.w = w; ee->req.h = h; - /* if (ee->visible) */ - /* { */ - /* damage old surface, if it exists */ - - /* NB: This removes any lingering screen artifacts in the compositor. - * This may be a 'HACK' if the issue is actually in the wayland - * compositor, but for now lets implement this so we don't have screen - * artifacts laying around during a resize */ - /* if (ee->engine.wl.surface) */ - /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */ - /* } */ +// ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); ee->w = w; ee->h = h; -// ecore_wl_flush(); - + /* change evas output & viewport sizes */ evas_output_size_set(ee->evas, ee->w, ee->h); evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); if (ee->engine.wl.frame) evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); - /* if ((ee->visible) && (ee->engine.wl.surface)) */ - /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */ + /* set new engine destination */ + /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */ + + /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */ + ecore_wl_flush(); + + ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); if (ee->func.fn_resize) ee->func.fn_resize(ee); } static void -_ecore_evas_wl_show(Ecore_Evas *ee) +_ecore_evas_wl_show(Ecore_Evas *ee) { Evas_Engine_Info_Wayland_Egl *einfo; LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!ee) return; - if (ee->visible) return; + if ((!ee) || (ee->visible)) return; + + if (ee->engine.wl.win) + ecore_wl_window_show(ee->engine.wl.win); einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); - - /* create new surface */ - ee->engine.wl.surface = - wl_compositor_create_surface(ecore_wl_compositor_get()); - wl_surface_set_user_data(ee->engine.wl.surface, (void *)ee->prop.window); - - /* create new shell surface */ - ee->engine.wl.shell_surface = - wl_shell_get_shell_surface(ecore_wl_shell_get(), ee->engine.wl.surface); - - /* set the engine surface here. This should trigger an egl window create */ - einfo->info.surface = ee->engine.wl.surface; + if (!einfo) + { + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); + return; + } + einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win); evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - /* add listener for configure events (happen on shell surface resize) */ - wl_shell_surface_add_listener(ee->engine.wl.shell_surface, - &_ecore_evas_wl_shell_surface_listener, ee); - - /* Raise this surface to the top */ - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); - if (ee->engine.wl.frame) { evas_object_show(ee->engine.wl.frame); @@ -515,36 +495,33 @@ _ecore_evas_wl_show(Ecore_Evas *ee) ecore_wl_flush(); + /* ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); */ + ee->visible = 1; if (ee->func.fn_show) ee->func.fn_show(ee); } static void -_ecore_evas_wl_hide(Ecore_Evas *ee) +_ecore_evas_wl_hide(Ecore_Evas *ee) { Evas_Engine_Info_Wayland_Egl *einfo; LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!ee) return; - if (!ee->visible) return; + if ((!ee) || (!ee->visible)) return; + + if (ee->engine.wl.win) ecore_wl_window_hide(ee->engine.wl.win); - /* get engine info */ einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); - einfo->info.surface = NULL; - evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - - /* destroy shell surface */ - if (ee->engine.wl.shell_surface) - wl_shell_surface_destroy(ee->engine.wl.shell_surface); - ee->engine.wl.shell_surface = NULL; - - /* destroy surface */ - if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); - ee->engine.wl.surface = NULL; + if ((einfo) && (einfo->info.surface)) + { + einfo->info.surface = NULL; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + } ee->visible = 0; ee->should_be_visible = 0; + if (ee->func.fn_hide) ee->func.fn_hide(ee); } @@ -554,39 +531,18 @@ _ecore_evas_wl_raise(Ecore_Evas *ee) LOGFN(__FILE__, __LINE__, __FUNCTION__); if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); + ecore_wl_window_raise(ee->engine.wl.win); } static void -_ecore_evas_wl_lower(Ecore_Evas *ee) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - /* FIXME: Need a way to tell Wayland to lower */ -} - -static void -_ecore_evas_wl_activate(Ecore_Evas *ee) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); -} - -static void -_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t) +_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!ee) return; if (ee->prop.title) free(ee->prop.title); ee->prop.title = NULL; - if (t) ee->prop.title = strdup(t); - + if (title) ee->prop.title = strdup(title); if ((ee->prop.draw_frame) && (ee->engine.wl.frame)) { EE_Wl_Smart_Data *sd; @@ -663,51 +619,6 @@ _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h) ee->prop.step.h = h; } -static void -_ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y) -{ - int x = 0, y = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ee) return; - if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); - ee->prop.cursor.object = NULL; - - if (!obj) - { - ee->prop.cursor.layer = 0; - ee->prop.cursor.hot.x = 0; - ee->prop.cursor.hot.y = 0; - return; - } - - ee->prop.cursor.object = obj; - ee->prop.cursor.layer = layer; - ee->prop.cursor.hot.x = hot_x; - ee->prop.cursor.hot.y = hot_y; - - evas_pointer_output_xy_get(ee->evas, &x, &y); - evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer); - evas_object_move(ee->prop.cursor.object, - x - ee->prop.cursor.hot.x, y - ee->prop.cursor.hot.y); - evas_object_pass_events_set(ee->prop.cursor.object, 1); - if (evas_pointer_inside_get(ee->evas)) - evas_object_show(ee->prop.cursor.object); - - evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, - _ecore_evas_wl_object_cursor_del, ee); -} - -static void -_ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) -{ - Ecore_Evas *ee; - - if (!(ee = data)) return; - ee->prop.cursor.object = NULL; -} - static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) { @@ -720,16 +631,6 @@ _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) ee->prop.layer = layer; } -static void -_ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); -} - static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify) { @@ -749,7 +650,7 @@ _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max) if (!ee) return; if (ee->prop.maximized == max) return; ee->prop.maximized = max; - /* FIXME: Implement this. Support is in Wayland now */ + ecore_wl_window_maximized_set(ee->engine.wl.win, max); } static void @@ -758,17 +659,13 @@ _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full) LOGFN(__FILE__, __LINE__, __FUNCTION__); if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - if (full) - wl_shell_surface_set_fullscreen(ee->engine.wl.shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, - 0, NULL); - else - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); + if (ee->prop.fullscreen == full) return; + ee->prop.fullscreen = full; + ecore_wl_window_fullscreen_set(ee->engine.wl.win, full); } static int -_ecore_evas_wl_render(Ecore_Evas *ee) +_ecore_evas_wl_render(Ecore_Evas *ee) { int rend = 0; @@ -792,26 +689,24 @@ _ecore_evas_wl_render(Ecore_Evas *ee) if ((updates = evas_render_updates(ee->evas))) { - /* if (ee->engine.wl.surface) */ - /* { */ - /* Eina_List *l = NULL; */ - /* Eina_Rectangle *r; */ + Eina_List *l = NULL; + Eina_Rectangle *r; - /* EINA_LIST_FOREACH(updates, l, r) */ - /* wl_surface_damage(ee->engine.wl.surface, */ - /* r->x, r->y, r->w, r->h); */ - /* } */ + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + EINA_LIST_FOREACH(updates, l, r) + ecore_wl_window_damage(ee->engine.wl.win, + r->x, r->y, r->w, r->h); + + ecore_wl_flush(); evas_render_updates_free(updates); _ecore_evas_idle_timeout_update(ee); rend = 1; - - ecore_wl_flush(); } if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } - return rend; } @@ -825,8 +720,18 @@ _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int ecore_wl_screen_size_get(w, h); } +void +_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location) +{ + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + if (!ee) return; + if (ee->engine.wl.win) + ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location); +} + static Eina_Bool -_ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) +_ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Evas *ee; Ecore_Wl_Event_Mouse_In *ev; @@ -834,18 +739,18 @@ _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void * LOGFN(__FILE__, __LINE__, __FUNCTION__); ev = event; - ee = ecore_event_window_match(ev->window); + ee = ecore_event_window_match(ev->win); if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee); ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); - evas_event_feed_mouse_in(ee->evas, ev->time, NULL); - _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); + evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL); + _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp); return ECORE_CALLBACK_PASS_ON; } static Eina_Bool -_ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) +_ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Evas *ee; Ecore_Wl_Event_Mouse_Out *ev; @@ -853,19 +758,19 @@ _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void LOGFN(__FILE__, __LINE__, __FUNCTION__); ev = event; - ee = ecore_event_window_match(ev->window); + ee = ecore_event_window_match(ev->win); if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); - _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); - evas_event_feed_mouse_out(ee->evas, ev->time, NULL); + _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp); + evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL); if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); return ECORE_CALLBACK_PASS_ON; } static Eina_Bool -_ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) +_ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Evas *ee; Ecore_Wl_Event_Focus_In *ev; @@ -873,9 +778,9 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void * LOGFN(__FILE__, __LINE__, __FUNCTION__); ev = event; - ee = ecore_event_window_match(ev->window); + ee = ecore_event_window_match(ev->win); if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; ee->prop.focused = 1; evas_focus_in(ee->evas); if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee); @@ -883,44 +788,51 @@ _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void * } static Eina_Bool -_ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) +_ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Evas *ee; - Ecore_Wl_Event_Focus_Out *ev; + Ecore_Wl_Event_Focus_In *ev; LOGFN(__FILE__, __LINE__, __FUNCTION__); ev = event; - ee = ecore_event_window_match(ev->window); + ee = ecore_event_window_match(ev->win); if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; evas_focus_out(ee->evas); ee->prop.focused = 0; if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee); return ECORE_CALLBACK_PASS_ON; } -static void -_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) +static Eina_Bool +_ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Evas *ee; + Ecore_Wl_Event_Window_Configure *ev; - /* NB: Trap to prevent compositor from crashing */ - if ((width <= 0) || (height <= 0)) return; + LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!(ee = data)) return; - - if ((shell_surface) && (ee->engine.wl.shell_surface)) + ev = event; + ee = ecore_event_window_match(ev->win); + if (!ee) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if ((ee->x != ev->x) || (ee->y != ev->y)) { - if (ee->engine.wl.shell_surface != shell_surface) return; - ecore_evas_resize(ee, width, height); + ee->x = ev->x; + ee->y = ev->y; + ee->req.x = ee->x; + ee->req.y = ee->y; + if (ee->func.fn_move) ee->func.fn_move(ee); + } + if ((ee->req.w != ev->w) || (ee->req.h != ev->h)) + { + ee->req.w = ev->w; + ee->req.h = ev->h; + if (ee->func.fn_resize) ee->func.fn_resize(ee); } -} - -static void -_ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__) -{ + return ECORE_CALLBACK_PASS_ON; } static void @@ -1034,41 +946,9 @@ _ecore_evas_wl_frame_add(Evas *evas) return evas_object_smart_add(evas, _ecore_evas_wl_smart); } -void -_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.shell_surface)) return; - wl_shell_surface_resize(ee->engine.wl.shell_surface, - ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get(), location); -} - -void -_ecore_evas_wayland_egl_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.surface)) return; - if ((!source) || (!drag_ee)) return; - ecore_wl_drag_start(source, ee->engine.wl.surface, drag_ee->engine.wl.buffer); -} - -void -_ecore_evas_wayland_egl_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.surface)) return; - wl_input_device_attach(ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get(), - ee->engine.wl.buffer, hot_x, hot_y); -} - #else EAPI Ecore_Evas * -ecore_evas_wayland_egl_new(const char *disp_name __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int frame __UNUSED__) +ecore_evas_wayland_egl_new(const char *disp_name __UNUSED__, Ecore_Wl_Window *parent __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, Eina_Bool frame __UNUSED__) { return NULL; } diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c index 4908763c54..f100072cc1 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c @@ -2,7 +2,7 @@ # include "config.h" #endif -//#define LOGFNS 1 +#define LOGFNS 1 #ifdef LOGFNS # include @@ -20,12 +20,12 @@ # include #endif -# include -# include -# include +#include +#include +#include -# include "ecore_evas_private.h" -# include "Ecore_Evas.h" +#include "ecore_evas_private.h" +#include "Ecore_Evas.h" #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM # include @@ -51,23 +51,19 @@ static void _ecore_evas_wl_callback_delete_request_set(Ecore_Evas *ee, void (*fu static void _ecore_evas_wl_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); +static void _ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)); static void _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y); static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_show(Ecore_Evas *ee); static void _ecore_evas_wl_hide(Ecore_Evas *ee); static void _ecore_evas_wl_raise(Ecore_Evas *ee); -static void _ecore_evas_wl_lower(Ecore_Evas *ee); -static void _ecore_evas_wl_activate(Ecore_Evas *ee); -static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t); +static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title); static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c); static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); -static void _ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y); -static void _ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__); static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer); -static void _ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__); static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify); static void _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max); static void _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full); @@ -75,13 +71,11 @@ static int _ecore_evas_wl_render(Ecore_Evas *ee); static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h); static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest); -static Eina_Bool _ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); -static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); - -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); -static void _ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__); +static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event); +static Eina_Bool _ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event); /* SMART stuff for frame */ static Evas_Smart *_ecore_evas_wl_smart = NULL; @@ -97,103 +91,94 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas); /* local variables */ static int _ecore_evas_wl_init_count = 0; -static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[4]; - -static const struct wl_shell_surface_listener _ecore_evas_wl_shell_surface_listener = -{ - _ecore_evas_wl_handle_configure, - _ecore_evas_wl_handle_popup_done -}; +static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5]; static Ecore_Evas_Engine_Func _ecore_wl_engine_func = { - _ecore_evas_wl_free, - _ecore_evas_wl_callback_resize_set, - _ecore_evas_wl_callback_move_set, - NULL, // callback show set - NULL, // callback hide set - _ecore_evas_wl_callback_delete_request_set, - NULL, // callback destroy set - _ecore_evas_wl_callback_focus_in_set, - _ecore_evas_wl_callback_focus_out_set, - _ecore_evas_wl_callback_mouse_in_set, - NULL, // callback mouse out set - NULL, // callback sticky set - NULL, // callback unsticky set - NULL, // callback pre render set - NULL, // callback post render set - _ecore_evas_wl_move, - NULL, // func managed move - _ecore_evas_wl_resize, - NULL, // func move_resize - NULL, // func rotation set - NULL, // func shaped set - _ecore_evas_wl_show, - _ecore_evas_wl_hide, - _ecore_evas_wl_raise, - _ecore_evas_wl_lower, - _ecore_evas_wl_activate, - _ecore_evas_wl_title_set, - _ecore_evas_wl_name_class_set, - _ecore_evas_wl_size_min_set, - _ecore_evas_wl_size_max_set, - _ecore_evas_wl_size_base_set, - _ecore_evas_wl_size_step_set, - _ecore_evas_wl_object_cursor_set, - _ecore_evas_wl_layer_set, - _ecore_evas_wl_focus_set, - _ecore_evas_wl_iconified_set, - NULL, // func borderless set - NULL, // func override set - _ecore_evas_wl_maximized_set, - _ecore_evas_wl_fullscreen_set, + _ecore_evas_wl_free, + _ecore_evas_wl_callback_resize_set, + _ecore_evas_wl_callback_move_set, + NULL, + NULL, + _ecore_evas_wl_callback_delete_request_set, + NULL, + _ecore_evas_wl_callback_focus_in_set, + _ecore_evas_wl_callback_focus_out_set, + _ecore_evas_wl_callback_mouse_in_set, + _ecore_evas_wl_callback_mouse_out_set, + NULL, // sticky_set + NULL, // unsticky_set + NULL, // pre_render_set + NULL, // post_render_set + _ecore_evas_wl_move, + NULL, // managed_move + _ecore_evas_wl_resize, + NULL, // move_resize + NULL, // rotation_set + NULL, // shaped_set + _ecore_evas_wl_show, + _ecore_evas_wl_hide, + _ecore_evas_wl_raise, + NULL, // lower + NULL, // activate + _ecore_evas_wl_title_set, + _ecore_evas_wl_name_class_set, + _ecore_evas_wl_size_min_set, + _ecore_evas_wl_size_max_set, + _ecore_evas_wl_size_base_set, + _ecore_evas_wl_size_step_set, + NULL, // object_cursor_set + _ecore_evas_wl_layer_set, + NULL, // focus set + _ecore_evas_wl_iconified_set, + NULL, // borderless set + NULL, // override set + _ecore_evas_wl_maximized_set, + _ecore_evas_wl_fullscreen_set, NULL, // func avoid_damage set NULL, // func withdrawn set NULL, // func sticky set NULL, // func ignore_events set NULL, // func alpha set NULL, // func transparent set - NULL, NULL, NULL, NULL, NULL, NULL, - _ecore_evas_wl_render, _ecore_evas_wl_screen_geometry_get }; /* external variables */ -#endif -#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM +/* external functions */ EAPI Ecore_Evas * -ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, int frame) +ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) { + Ecore_Wl_Window *p = NULL; Evas_Engine_Info_Wayland_Shm *einfo; Ecore_Evas *ee; int method = 0; - static int _win_id = 1; LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!(method = evas_render_method_lookup("wayland_shm"))) + if (!(method = evas_render_method_lookup("wayland_shm"))) { - ERR("Render method lookup failed."); + ERR("Render method lookup failed for Wayland_Shm"); return NULL; } if (!ecore_wl_init(disp_name)) { - ERR("Failed to initialize Ecore Wayland."); + ERR("Failed to initialize Ecore_Wayland"); return NULL; } - if (!(ee = calloc(1, sizeof(Ecore_Evas)))) + if (!(ee = calloc(1, sizeof(Ecore_Evas)))) { - ERR("Failed to allocate Ecore_Evas."); + ERR("Failed to allocate Ecore_Evas"); ecore_wl_shutdown(); return NULL; } @@ -210,17 +195,21 @@ ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, in if (w < 1) w = 1; if (h < 1) h = 1; - ee->req.x = ee->x = x; - ee->req.y = ee->y = y; - ee->req.w = ee->w = w; - ee->req.h = ee->h = h; + ee->x = x; + ee->y = y; + ee->w = w; + ee->h = h; + ee->req.x = ee->x; + ee->req.y = ee->y; + ee->req.w = ee->w; + ee->req.h = ee->h; ee->rotation = 0; - ee->prop.max.w = ee->prop.max.h = 32767; + ee->prop.max.w = 32767; + ee->prop.max.h = 32767; ee->prop.layer = 4; ee->prop.request_pos = 0; ee->prop.sticky = 0; ee->prop.draw_frame = frame; - ee->prop.window = _win_id++; ee->evas = evas_new(); evas_data_attach_set(ee->evas, ee); @@ -228,29 +217,40 @@ ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, in evas_output_size_set(ee->evas, ee->w, ee->h); evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); - if (ee->prop.draw_frame) + /* FIXME: This needs to be set based on theme & scale */ + if (ee->prop.draw_frame) evas_output_framespace_set(ee->evas, 4, 18, 8, 22); - if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas))) + if (parent) + p = ecore_wl_window_find(parent); + + ee->engine.wl.parent = p; + ee->engine.wl.win = + ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM); + ee->prop.window = ee->engine.wl.win->id; + + if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas))) { einfo->info.rotation = ee->rotation; einfo->info.debug = EINA_FALSE; - if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { - ERR("Failed to set Evas Engine Info for '%s'.", ee->driver); + ERR("Failed to set Evas Engine Info for '%s'", ee->driver); ecore_evas_free(ee); + _ecore_evas_wl_shutdown(); + ecore_wl_shutdown(); return NULL; } } else { - ERR("Failed to get Evas Engine Info for '%s'.", ee->driver); + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); ecore_evas_free(ee); + _ecore_evas_wl_shutdown(); + ecore_wl_shutdown(); return NULL; } - /* NB: we need to be notified before 'free' so we can munmap the evas - * engine destination */ ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free); if (ee->prop.draw_frame) @@ -283,18 +283,21 @@ _ecore_evas_wl_init(void) if (++_ecore_evas_wl_init_count != 1) return _ecore_evas_wl_init_count; - _ecore_evas_wl_event_handlers[0] = + _ecore_evas_wl_event_hdls[0] = ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN, - _ecore_evas_wl_event_mouse_in, NULL); - _ecore_evas_wl_event_handlers[1] = + _ecore_evas_wl_cb_mouse_in, NULL); + _ecore_evas_wl_event_hdls[1] = ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT, - _ecore_evas_wl_event_mouse_out, NULL); - _ecore_evas_wl_event_handlers[2] = + _ecore_evas_wl_cb_mouse_out, NULL); + _ecore_evas_wl_event_hdls[2] = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, - _ecore_evas_wl_event_focus_in, NULL); - _ecore_evas_wl_event_handlers[3] = + _ecore_evas_wl_cb_focus_in, NULL); + _ecore_evas_wl_event_hdls[3] = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, - _ecore_evas_wl_event_focus_out, NULL); + _ecore_evas_wl_cb_focus_out, NULL); + _ecore_evas_wl_event_hdls[4] = + ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE, + _ecore_evas_wl_cb_window_configure, NULL); ecore_event_evas_init(); @@ -311,10 +314,10 @@ _ecore_evas_wl_shutdown(void) if (--_ecore_evas_wl_init_count != 0) return _ecore_evas_wl_init_count; - for (i = 0; i < sizeof(_ecore_evas_wl_event_handlers) / sizeof(Ecore_Event_Handler *); i++) + for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++) { - if (_ecore_evas_wl_event_handlers[i]) - ecore_event_handler_del(_ecore_evas_wl_event_handlers[i]); + if (_ecore_evas_wl_event_hdls[i]) + ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]); } ecore_event_evas_shutdown(); @@ -329,17 +332,15 @@ _ecore_evas_wl_pre_free(Ecore_Evas *ee) LOGFN(__FILE__, __LINE__, __FUNCTION__); - /* destroy frame */ if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame); - /* get engine info */ einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); if ((einfo) && (einfo->info.dest)) { int ret = 0; - /* munmap previous engine destination */ ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); + if (!ret) ERR("Failed to unmap engine destination: %m"); } } @@ -348,18 +349,11 @@ _ecore_evas_wl_free(Ecore_Evas *ee) { LOGFN(__FILE__, __LINE__, __FUNCTION__); - /* destroy buffer */ if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); ee->engine.wl.buffer = NULL; - /* destroy shell surface */ - if (ee->engine.wl.shell_surface) - wl_shell_surface_destroy(ee->engine.wl.shell_surface); - ee->engine.wl.shell_surface = NULL; - - /* destroy surface */ - if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); - ee->engine.wl.surface = NULL; + if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win); + ee->engine.wl.win = NULL; ecore_event_window_unregister(ee->prop.window); ecore_evas_input_event_unregister(ee); @@ -423,25 +417,25 @@ _ecore_evas_wl_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee } static void -_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) +_ecore_evas_wl_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee)) +{ + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + if (!ee) return; + ee->func.fn_mouse_out = func; +} + +static void +_ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!ee) return; -// if ((ee->x == x) && (ee->y == y)) return; ee->req.x = x; ee->req.y = y; - ee->x = x; ee->y = y; - - if (ee->engine.wl.shell_surface) - { - wl_shell_surface_move(ee->engine.wl.shell_surface, - ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get()); - } - + if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y); if (ee->func.fn_move) ee->func.fn_move(ee); } @@ -450,55 +444,44 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) { Evas_Engine_Info_Wayland_Shm *einfo; - LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!ee) return; if (w < 1) w = 1; if (h < 1) h = 1; - if ((ee->w == w) && (ee->h == h)) return; +// if ((ee->w == w) && (ee->h == h)) return; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); if (ee->prop.min.w > w) w = ee->prop.min.w; else if (w > ee->prop.max.w) w = ee->prop.max.w; - if (ee->prop.min.h > h) h = ee->prop.min.h; else if (h > ee->prop.max.h) h = ee->prop.max.h; ee->req.w = w; ee->req.h = h; - if (ee->visible) - { - /* damage old surface, if it exists */ +// ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); - /* NB: This removes any lingering screen artifacts in the compositor. - * This may be a 'HACK' if the issue is actually in the wayland - * compositor, but for now lets implement this so we don't have screen - * artifacts laying around during a resize */ - if (ee->engine.wl.surface) - wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); - } - - /* get engine info */ einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); - if (einfo->info.dest) + if ((einfo) && (einfo->info.dest)) { int ret = 0; - /* munmap previous engine destination */ ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); + if (!ret) ERR("Failed to unmap engine destination: %m"); + } + else if (!einfo) + { + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); + return; } - /* free old buffer */ if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); ee->engine.wl.buffer = NULL; ee->w = w; ee->h = h; - /* create buffer @ new size (also mmaps the new destination) */ _ecore_evas_wl_buffer_new(ee, &einfo->info.dest); - - /* flush new buffer fd */ ecore_wl_flush(); /* change evas output & viewport sizes */ @@ -512,16 +495,13 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); /* damage buffer */ - wl_buffer_damage(ee->engine.wl.buffer, 0, 0, ee->w, ee->h); +// wl_buffer_damage(ee->engine.wl.buffer, 0, 0, ee->w, ee->h); - if (ee->visible) - { - /* damage surface */ - wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); + ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); + /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */ + /* ecore_wl_flush(); */ - /* if visible, attach to surface */ - wl_surface_attach(ee->engine.wl.surface, ee->engine.wl.buffer, 0, 0); - } + ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); if (ee->func.fn_resize) ee->func.fn_resize(ee); } @@ -533,93 +513,63 @@ _ecore_evas_wl_show(Ecore_Evas *ee) LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!ee) return; - if (ee->visible) return; + if ((!ee) || (ee->visible)) return; + + if (ee->engine.wl.win) + ecore_wl_window_show(ee->engine.wl.win); - /* get engine info */ einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); + if (!einfo) + { + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); + return; + } - /* create new surface */ - ee->engine.wl.surface = - wl_compositor_create_surface(ecore_wl_compositor_get()); - wl_surface_set_user_data(ee->engine.wl.surface, (void *)ee->prop.window); - - /* get new shell surface */ - ee->engine.wl.shell_surface = - wl_shell_get_shell_surface(ecore_wl_shell_get(), ee->engine.wl.surface); - - /* set toplevel */ - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); - - /* create buffer @ new size (also mmaps the new destination) */ _ecore_evas_wl_buffer_new(ee, &einfo->info.dest); + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - if (ee->engine.wl.frame) + if (ee->engine.wl.frame) { evas_object_show(ee->engine.wl.frame); evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); } - /* set new engine destination */ - evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - - /* add configure listener for wayland resize events */ - wl_shell_surface_add_listener(ee->engine.wl.shell_surface, - &_ecore_evas_wl_shell_surface_listener, ee); - - /* flush new buffer fd */ ecore_wl_flush(); - /* attach buffer to surface */ - wl_surface_attach(ee->engine.wl.surface, ee->engine.wl.buffer, 0, 0); - - /* NB: No need to do a damage here. If we do, we end up w/ screen - * artifacts in the compositor */ - /* wl_surface_damage(ee->engine.wl.surface, 0, 0, ee->w, ee->h); */ + ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); ee->visible = 1; if (ee->func.fn_show) ee->func.fn_show(ee); } static void -_ecore_evas_wl_hide(Ecore_Evas *ee) +_ecore_evas_wl_hide(Ecore_Evas *ee) { Evas_Engine_Info_Wayland_Shm *einfo; LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (!ee) return; - if (!ee->visible) return; + if ((!ee) || (!ee->visible)) return; - /* get engine info */ einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); - if (einfo->info.dest) + if ((einfo) && (einfo->info.dest)) { int ret = 0; - /* munmap previous engine destination */ ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); - einfo->info.dest = NULL; + if (!ret) ERR("Failed to unmap engine destination: %m"); } - /* free old buffer */ if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); ee->engine.wl.buffer = NULL; - /* set new engine destination */ evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - /* destroy shell surface */ - if (ee->engine.wl.shell_surface) - wl_shell_surface_destroy(ee->engine.wl.shell_surface); - ee->engine.wl.shell_surface = NULL; - - /* destroy surface */ - if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); - ee->engine.wl.surface = NULL; + ecore_wl_window_hide(ee->engine.wl.win); ee->visible = 0; ee->should_be_visible = 0; + if (ee->func.fn_hide) ee->func.fn_hide(ee); } @@ -629,39 +579,18 @@ _ecore_evas_wl_raise(Ecore_Evas *ee) LOGFN(__FILE__, __LINE__, __FUNCTION__); if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); + ecore_wl_window_raise(ee->engine.wl.win); } static void -_ecore_evas_wl_lower(Ecore_Evas *ee) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - /* FIXME: Need a way to tell Wayland to lower */ -} - -static void -_ecore_evas_wl_activate(Ecore_Evas *ee) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); -} - -static void -_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t) +_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!ee) return; if (ee->prop.title) free(ee->prop.title); ee->prop.title = NULL; - if (t) ee->prop.title = strdup(t); - + if (title) ee->prop.title = strdup(title); if ((ee->prop.draw_frame) && (ee->engine.wl.frame)) { EE_Wl_Smart_Data *sd; @@ -738,51 +667,6 @@ _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h) ee->prop.step.h = h; } -static void -_ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y) -{ - int x = 0, y = 0; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ee) return; - if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); - ee->prop.cursor.object = NULL; - - if (!obj) - { - ee->prop.cursor.layer = 0; - ee->prop.cursor.hot.x = 0; - ee->prop.cursor.hot.y = 0; - return; - } - - ee->prop.cursor.object = obj; - ee->prop.cursor.layer = layer; - ee->prop.cursor.hot.x = hot_x; - ee->prop.cursor.hot.y = hot_y; - - evas_pointer_output_xy_get(ee->evas, &x, &y); - evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer); - evas_object_move(ee->prop.cursor.object, - x - ee->prop.cursor.hot.x, y - ee->prop.cursor.hot.y); - evas_object_pass_events_set(ee->prop.cursor.object, 1); - if (evas_pointer_inside_get(ee->evas)) - evas_object_show(ee->prop.cursor.object); - - evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, - _ecore_evas_wl_object_cursor_del, ee); -} - -static void -_ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) -{ - Ecore_Evas *ee; - - if (!(ee = data)) return; - ee->prop.cursor.object = NULL; -} - static void _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) { @@ -795,16 +679,6 @@ _ecore_evas_wl_layer_set(Ecore_Evas *ee, int layer) ee->prop.layer = layer; } -static void -_ecore_evas_wl_focus_set(Ecore_Evas *ee, int focus __UNUSED__) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); -} - static void _ecore_evas_wl_iconified_set(Ecore_Evas *ee, int iconify) { @@ -824,7 +698,7 @@ _ecore_evas_wl_maximized_set(Ecore_Evas *ee, int max) if (!ee) return; if (ee->prop.maximized == max) return; ee->prop.maximized = max; - /* FIXME: Implement this. Support is in Wayland now */ + ecore_wl_window_maximized_set(ee->engine.wl.win, max); } static void @@ -833,13 +707,9 @@ _ecore_evas_wl_fullscreen_set(Ecore_Evas *ee, int full) LOGFN(__FILE__, __LINE__, __FUNCTION__); if ((!ee) || (!ee->visible)) return; - if (!ee->engine.wl.shell_surface) return; - if (full) - wl_shell_surface_set_fullscreen(ee->engine.wl.shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, - 0, NULL); - else - wl_shell_surface_set_toplevel(ee->engine.wl.shell_surface); + if (ee->prop.fullscreen == full) return; + ee->prop.fullscreen = full; + ecore_wl_window_fullscreen_set(ee->engine.wl.win, full); } static int @@ -848,9 +718,9 @@ _ecore_evas_wl_render(Ecore_Evas *ee) int rend = 0; if (!ee) return 0; - if (!ee->visible) + if (!ee->visible) evas_norender(ee->evas); - else + else { Eina_List *ll = NULL, *updates = NULL; Ecore_Evas *ee2 = NULL; @@ -870,27 +740,27 @@ _ecore_evas_wl_render(Ecore_Evas *ee) Eina_List *l = NULL; Eina_Rectangle *r; + LOGFN(__FILE__, __LINE__, __FUNCTION__); + EINA_LIST_FOREACH(updates, l, r) { if (ee->engine.wl.buffer) wl_buffer_damage(ee->engine.wl.buffer, r->x, r->y, r->w, r->h); - if (ee->engine.wl.surface) - wl_surface_damage(ee->engine.wl.surface, - r->x, r->y, r->w, r->h); + ecore_wl_window_damage(ee->engine.wl.win, + r->x, r->y, r->w, r->h); } + ecore_wl_flush(); + evas_render_updates_free(updates); _ecore_evas_idle_timeout_update(ee); rend = 1; - - ecore_wl_flush(); } if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } - return rend; } @@ -904,104 +774,6 @@ _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int ecore_wl_screen_size_get(w, h); } -static Eina_Bool -_ecore_evas_wl_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) -{ - Ecore_Evas *ee; - Ecore_Wl_Event_Mouse_In *ev; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - ev = event; - ee = ecore_event_window_match(ev->window); - if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; - if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee); - ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); - evas_event_feed_mouse_in(ee->evas, ev->time, NULL); - _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_ecore_evas_wl_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) -{ - Ecore_Evas *ee; - Ecore_Wl_Event_Mouse_Out *ev; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - ev = event; - ee = ecore_event_window_match(ev->window); - if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; - ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); - _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->time); - evas_event_feed_mouse_out(ee->evas, ev->time, NULL); - if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); - if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_ecore_evas_wl_event_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) -{ - Ecore_Evas *ee; - Ecore_Wl_Event_Focus_In *ev; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - ev = event; - ee = ecore_event_window_match(ev->window); - if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; - ee->prop.focused = 1; - evas_focus_in(ee->evas); - if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_ecore_evas_wl_event_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) -{ - Ecore_Evas *ee; - Ecore_Wl_Event_Focus_Out *ev; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - ev = event; - ee = ecore_event_window_match(ev->window); - if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; - if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; - evas_focus_out(ee->evas); - ee->prop.focused = 0; - if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee); - return ECORE_CALLBACK_PASS_ON; -} - -static void -_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) -{ - Ecore_Evas *ee; - - /* NB: Trap to prevent compositor from crashing */ - if ((width <= 0) || (height <= 0)) return; - - if (!(ee = data)) return; - - if ((shell_surface) && (ee->engine.wl.shell_surface)) - { - if (ee->engine.wl.shell_surface != shell_surface) return; - ecore_evas_resize(ee, width, height); - } -} - -static void -_ecore_evas_wl_handle_popup_done(void *data __UNUSED__, struct wl_shell_surface *shell_surface __UNUSED__) -{ - -} - static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest) { @@ -1015,7 +787,7 @@ _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest) if (dest) *dest = NULL; if (!(shm = ecore_wl_shm_get())) return; - if (!format) format = ecore_wl_format_get(); + if (!format) format = WL_SHM_FORMAT_ARGB8888; //ecore_wl_format_get(); strcpy(tmp, "/tmp/ecore-wayland_shm-XXXXXX"); if ((fd = mkstemp(tmp)) < 0) @@ -1051,6 +823,123 @@ _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest) close(fd); } +void +_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location) +{ + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + if (!ee) return; + if (ee->engine.wl.win) + ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location); +} + +static Eina_Bool +_ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_Evas *ee; + Ecore_Wl_Event_Mouse_In *ev; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + ev = event; + ee = ecore_event_window_match(ev->win); + if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee); + ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); + evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL); + _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_ecore_evas_wl_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_Evas *ee; + Ecore_Wl_Event_Mouse_Out *ev; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + ev = event; + ee = ecore_event_window_match(ev->win); + if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers); + _ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp); + evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL); + if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); + if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_ecore_evas_wl_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_Evas *ee; + Ecore_Wl_Event_Focus_In *ev; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + ev = event; + ee = ecore_event_window_match(ev->win); + if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + ee->prop.focused = 1; + evas_focus_in(ee->evas); + if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_ecore_evas_wl_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_Evas *ee; + Ecore_Wl_Event_Focus_In *ev; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + ev = event; + ee = ecore_event_window_match(ev->win); + if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + evas_focus_out(ee->evas); + ee->prop.focused = 0; + if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_ecore_evas_wl_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_Evas *ee; + Ecore_Wl_Event_Window_Configure *ev; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + ev = event; + ee = ecore_event_window_match(ev->win); + if (!ee) return ECORE_CALLBACK_PASS_ON; + if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if ((ee->x != ev->x) || (ee->y != ev->y)) + { + ee->x = ev->x; + ee->y = ev->y; + ee->req.x = ee->x; + ee->req.y = ee->y; + if (ee->func.fn_move) ee->func.fn_move(ee); + } + if ((ee->req.w != ev->w) || (ee->req.h != ev->h)) + { + /* ee->w = ev->w; */ + /* ee->h = ev->h; */ + ee->req.w = ev->w; + ee->req.h = ev->h; + if (ee->func.fn_resize) ee->func.fn_resize(ee); + } + + return ECORE_CALLBACK_PASS_ON; +} + static void _ecore_evas_wl_smart_init(void) { @@ -1162,41 +1051,9 @@ _ecore_evas_wl_frame_add(Evas *evas) return evas_object_smart_add(evas, _ecore_evas_wl_smart); } -void -_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.shell_surface)) return; - wl_shell_surface_resize(ee->engine.wl.shell_surface, - ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get(), location); -} - -void -_ecore_evas_wayland_shm_drag_start(Ecore_Evas *ee, Ecore_Evas *drag_ee, void *source) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.surface)) return; - if ((!source) || (!drag_ee)) return; - ecore_wl_drag_start(source, ee->engine.wl.surface, drag_ee->engine.wl.buffer); -} - -void -_ecore_evas_wayland_shm_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if ((!ee) || (!ee->engine.wl.surface)) return; - wl_input_device_attach(ecore_wl_input_device_get(), - ecore_wl_input_timestamp_get(), - ee->engine.wl.buffer, hot_x, hot_y); -} - #else EAPI Ecore_Evas * -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__) +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__) { return NULL; }