devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=02671a1a4bd5faef54c730f34d4c5f621d5cb378
commit 02671a1a4bd5faef54c730f34d4c5f621d5cb378 Author: Chris Michael <cp.mich...@samsung.com> Date: Wed Sep 9 11:19:24 2015 -0400 ecore-wl2: Add API function for ecore_wl2_window_show Summary: This adds preliminary support for wl_shell and xdg_shell Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/ecore_wl2/Ecore_Wl2.h | 9 ++ src/lib/ecore_wl2/ecore_wl2_window.c | 213 +++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 0ac9c7f..1d28dd7 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -256,6 +256,15 @@ EAPI int ecore_wl2_window_id_get(Ecore_Wl2_Window *window); */ EAPI struct wl_surface *ecore_wl2_window_surface_get(Ecore_Wl2_Window *window); +/** + * Show a given Ecore_Wl2_Window + * + * @param window The Ecore_Wl2_Window to show + * + * @ingroup Ecore_Wl2_Window_Group + */ +EAPI void ecore_wl2_window_show(Ecore_Wl2_Window *window); + /* # ifdef __cplusplus */ /* } */ /* # endif */ diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c b/src/lib/ecore_wl2/ecore_wl2_window.c index f0b96f7..060b729 100644 --- a/src/lib/ecore_wl2/ecore_wl2_window.c +++ b/src/lib/ecore_wl2/ecore_wl2_window.c @@ -4,6 +4,166 @@ #include "ecore_wl2_private.h" +static void +_wl_shell_surface_cb_ping(void *data EINA_UNUSED, struct wl_shell_surface *shell_surface, unsigned int serial) +{ + wl_shell_surface_pong(shell_surface, serial); +} + +static void +_wl_shell_surface_cb_configure(void *data, struct wl_shell_surface *shell_surface EINA_UNUSED, unsigned int edges, int w, int h) +{ + Ecore_Wl2_Window *win; + + win = data; + if (!win) return; + + if ((w <= 0) || (h <= 0)) return; + if ((win->geometry.w != w) || (win->geometry.h != h)) + { + /* TODO: send configure */ + } +} + +static void +_wl_shell_surface_cb_popup_done(void *data EINA_UNUSED, struct wl_shell_surface *shell_surface EINA_UNUSED) +{ + /* TODO: input ungrab ? */ +} + +static const struct wl_shell_surface_listener _wl_shell_surface_listener = +{ + _wl_shell_surface_cb_ping, + _wl_shell_surface_cb_configure, + _wl_shell_surface_cb_popup_done +}; + +static void +_xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSED, int32_t w, int32_t h, struct wl_array *states, uint32_t serial) +{ + Ecore_Wl2_Window *win; + uint32_t *s; + + win = data; + if (!win) return; + + win->minimized = EINA_FALSE; + win->maximized = EINA_FALSE; + win->fullscreen = EINA_FALSE; + win->focused = EINA_FALSE; + win->resizing = EINA_FALSE; + + wl_array_for_each(s, states) + { + switch (*s) + { + case XDG_SURFACE_STATE_MAXIMIZED: + win->maximized = EINA_TRUE; + break; + case XDG_SURFACE_STATE_FULLSCREEN: + win->fullscreen = EINA_TRUE; + break; + case XDG_SURFACE_STATE_RESIZING: + win->resizing = EINA_TRUE; + break; + case XDG_SURFACE_STATE_ACTIVATED: + win->focused = EINA_TRUE; + win->minimized = EINA_FALSE; + default: + break; + } + } + + if ((w > 0) && (h > 0)) + { + /* TODO: send configure ?? */ + } + + xdg_surface_ack_configure(win->xdg_surface, serial); +} + +static void +_xdg_surface_cb_delete(void *data, struct xdg_surface *xdg_surface EINA_UNUSED) +{ + Ecore_Wl2_Window *win; + + win = data; + if (!win) return; + + /* TODO: Free window */ +} + +static const struct xdg_surface_listener _xdg_surface_listener = +{ + _xdg_surface_cb_configure, + _xdg_surface_cb_delete, +}; + +static void +_ecore_wl2_window_type_set(Ecore_Wl2_Window *win) +{ + switch (win->type) + { + case ECORE_WL2_WINDOW_TYPE_FULLSCREEN: + if (win->xdg_surface) + xdg_surface_set_fullscreen(win->xdg_surface, NULL); + else if (win->wl_shell_surface) + wl_shell_surface_set_fullscreen(win->wl_shell_surface, + WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, + 0, NULL); + break; + case ECORE_WL2_WINDOW_TYPE_MAXIMIZED: + if (win->xdg_surface) + xdg_surface_set_maximized(win->xdg_surface); + else if (win->wl_shell_surface) + wl_shell_surface_set_maximized(win->wl_shell_surface, NULL); + break; + case ECORE_WL2_WINDOW_TYPE_TRANSIENT: + if (win->xdg_surface) + xdg_surface_set_parent(win->xdg_surface, win->parent->xdg_surface); + else if (win->wl_shell_surface) + wl_shell_surface_set_transient(win->wl_shell_surface, + win->parent->surface, + win->geometry.x, win->geometry.y, 0); + break; + case ECORE_WL2_WINDOW_TYPE_MENU: + /* TODO: Input and XDG Popup */ + if (win->xdg_surface) + { + /* win->xdg_popup = */ + /* xdg_shell_get_xdg_popup(win->display->wl.xdg_shell, win->surface, */ + /* win->display->input->seat, */ + /* win->display->serial, */ + /* win->geometry.x, win->geometry.y); */ + /* if (!win->xdg_popup) */ + /* { */ + /* ERR("Could not create xdg popup: %m"); */ + /* return; */ + /* } */ + + /* xdg_popup_set_user_data(win->xdg_popup, win); */ + /* xdg_popup_add_listener(win->xdg_popup, &_xdg_popup_listener, win); */ + } + else if (win->wl_shell_surface) + { + /* wl_shell_surface_set_popup(win->wl_shell_surface, */ + /* win->display->input->seat, */ + /* win->display->serial, */ + /* win->parent->surface, */ + /* win->geometry.x, win->geometry.y, 0); */ + } + break; + case ECORE_WL2_WINDOW_TYPE_TOPLEVEL: + if (win->xdg_surface) + xdg_surface_set_parent(win->xdg_surface, NULL); + else if (win->wl_shell_surface) + wl_shell_surface_set_toplevel(win->wl_shell_surface); + break; + default: + break; + } +} + EAPI Ecore_Wl2_Window * ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int x, int y, int w, int h) { @@ -50,3 +210,56 @@ ecore_wl2_window_surface_get(Ecore_Wl2_Window *window) return window->surface; } + +EAPI void +ecore_wl2_window_show(Ecore_Wl2_Window *window) +{ + Ecore_Wl2_Display *disp; + + EINA_SAFETY_ON_NULL_RETURN(window); + + disp = window->display; + + if (!window->surface) + { + window->surface = + wl_compositor_create_surface(window->display->wl.compositor); + } + + if ((disp->wl.xdg_shell) && (!window->xdg_surface)) + { + window->xdg_surface = + xdg_shell_get_xdg_surface(disp->wl.xdg_shell, window->surface); + if (!window->xdg_surface) goto surf_err; + + if (window->title) + xdg_surface_set_title(window->xdg_surface, window->title); + if (window->class) + xdg_surface_set_app_id(window->xdg_surface, window->class); + + xdg_surface_set_user_data(window->xdg_surface, window); + xdg_surface_add_listener(window->xdg_surface, + &_xdg_surface_listener, window); + } + else if ((disp->wl.wl_shell) && (!window->wl_shell_surface)) + { + window->wl_shell_surface = + wl_shell_get_shell_surface(disp->wl.wl_shell, window->surface); + if (!window->wl_shell_surface) goto surf_err; + + if (window->title) + wl_shell_surface_set_title(window->wl_shell_surface, window->title); + if (window->class) + wl_shell_surface_set_class(window->wl_shell_surface, window->class); + + wl_shell_surface_add_listener(window->wl_shell_surface, + &_wl_shell_surface_listener, window); + } + + _ecore_wl2_window_type_set(window); + + return; + +surf_err: + ERR("Failed to create surface for window: %m"); +} --