diff --git a/configure.ac b/configure.ac
index c399877c59..8043adfecf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2141,7 +2141,7 @@ AC_ARG_ENABLE([wayland],
[want_wayland="no"])
if test "${want_wayland}" = "yes"; then
- EFL_PKG_CHECK_STRICT([wayland-client >= 1.11.0 wayland-scanner >= 1.11.0 wayland-protocols >= 1.9])
+ EFL_PKG_CHECK_STRICT([wayland-client >= 1.11.0 wayland-scanner >= 1.11.0 wayland-protocols >= 1.12])
PKG_CHECK_MODULES([WAYLAND], [wayland-scanner >= 1.11.0],
[
AC_ARG_VAR([wayland_scanner], [The wayland-scanner executable])
diff --git a/src/Makefile_Ecore_Wl2.am b/src/Makefile_Ecore_Wl2.am
index a794d0b3ba..311cd27eec 100644
--- a/src/Makefile_Ecore_Wl2.am
+++ b/src/Makefile_Ecore_Wl2.am
@@ -40,6 +40,8 @@ lib/ecore_wl2/www-client-protocol.h \
lib/ecore_wl2/www-protocol.c \
lib/ecore_wl2/linux-dmabuf-unstable-v1-protocol.c \
lib/ecore_wl2/linux-dmabuf-unstable-v1-client-protocol.h \
+lib/ecore_wl2/xdg-shell-client-protocol.h \
+lib/ecore_wl2/xdg-shell-protocol.c \
lib/ecore_wl2/xdg-shell-unstable-v6-client-protocol.h \
lib/ecore_wl2/xdg-shell-unstable-v6-protocol.c \
lib/ecore_wl2/text-input-unstable-v1-client-protocol.h \
@@ -59,6 +61,8 @@ lib/ecore_wl2/efl-aux-hints-client-protocol.h \
lib/ecore_wl2/www-protocol.c \
lib/ecore_wl2/teamwork-protocol.c \
lib/ecore_wl2/teamwork-client-protocol.h \
+ lib/ecore_wl2/xdg-shell-client-protocol.h \
+ lib/ecore_wl2/xdg-shell-protocol.c \
lib/ecore_wl2/xdg-shell-unstable-v6-client-protocol.h \
lib/ecore_wl2/xdg-shell-unstable-v6-protocol.c \
lib/ecore_wl2/linux-dmabuf-unstable-v1-protocol.c \
@@ -70,4 +74,6 @@ lib/ecore_wl2/efl-aux-hints-client-protocol.h \
lib/ecore_wl2/efl-hints-client-protocol.h \
lib/ecore_wl2/efl-hints-protocol.c
+EXTRA_DIST2 += lib/ecore_wl2/window_v6.x
+
endif
diff --git a/src/lib/ecore_wl2/ecore_wl2_display.c b/src/lib/ecore_wl2/ecore_wl2_display.c
index 9785406d97..740090c23a 100644
--- a/src/lib/ecore_wl2/ecore_wl2_display.c
+++ b/src/lib/ecore_wl2/ecore_wl2_display.c
@@ -58,6 +58,17 @@ static const struct zwp_linux_dmabuf_v1_listener _dmabuf_listener =
_dmabuf_cb_format
};
+static void
+_xdg_shell_cb_ping(void *data EINA_UNUSED, struct xdg_wm_base *shell, uint32_t serial)
+{
+ xdg_wm_base_pong(shell, serial);
+}
+
+static const struct xdg_wm_base_listener _xdg_shell_listener =
+{
+ _xdg_shell_cb_ping,
+};
+
static void
_zxdg_shell_cb_ping(void *data EINA_UNUSED, struct zxdg_shell_v6 *shell, uint32_t serial)
{
@@ -337,13 +348,13 @@ _cb_global_add(void *data, struct wl_registry *registry, unsigned int id, const
ewd->wl.efl_hints = wl_registry_bind(registry, id, &efl_hints_interface, MIN(version, 2));
EINA_INLIST_FOREACH(ewd->windows, window)
{
- if (!window->zxdg_surface) continue;
+ if (!window->xdg_surface) continue;
if (window->aspect.set)
- efl_hints_set_aspect(window->display->wl.efl_hints, window->zxdg_surface,
+ efl_hints_set_aspect(window->display->wl.efl_hints, window->xdg_surface,
window->aspect.w, window->aspect.h, window->aspect.aspect);
if (window->weight.set)
efl_hints_set_weight(window->display->wl.efl_hints,
- window->zxdg_surface, window->weight.w, window->weight.h);
+ window->xdg_surface, window->weight.w, window->weight.h);
}
}
@@ -438,6 +449,7 @@ _ecore_wl2_display_globals_cleanup(Ecore_Wl2_Display *ewd)
if (ewd->wl.session_recovery)
zwp_e_session_recovery_destroy(ewd->wl.session_recovery);
if (ewd->wl.www) www_destroy(ewd->wl.www);
+ if (ewd->wl.xdg_wm_base) xdg_wm_base_destroy(ewd->wl.xdg_wm_base);
if (ewd->wl.zxdg_shell) zxdg_shell_v6_destroy(ewd->wl.zxdg_shell);
if (ewd->wl.shm) wl_shm_destroy(ewd->wl.shm);
if (ewd->wl.data_device_manager)
@@ -488,6 +500,9 @@ _recovery_timer_add(Ecore_Wl2_Display *ewd)
_ecore_wl2_window_semi_free(window);
window->set_config.serial = 0;
window->req_config.serial = 0;
+ window->xdg_configure_ack = NULL;
+ window->xdg_set_min_size = NULL;
+ window->xdg_set_max_size = NULL;
window->zxdg_configure_ack = NULL;
window->zxdg_set_min_size = NULL;
window->zxdg_set_max_size = NULL;
@@ -611,6 +626,7 @@ _ecore_wl2_shell_bind(Ecore_Wl2_Display *ewd)
const char **itr;
const char *shells[] =
{
+ "xdg_wm_base",
"zxdg_shell_v6",
NULL
};
@@ -626,7 +642,16 @@ _ecore_wl2_shell_bind(Ecore_Wl2_Display *ewd)
if (!global) return;
- if (!strcmp(global->interface, "zxdg_shell_v6"))
+ if (!strcmp(global->interface, "xdg_wm_base"))
+ {
+ ewd->wl.xdg_wm_base =
+ wl_registry_bind(ewd->wl.registry, global->id,
+ &xdg_wm_base_interface, 1);
+ xdg_wm_base_add_listener(ewd->wl.xdg_wm_base,
+ &_xdg_shell_listener, NULL);
+ ewd->shell_done = EINA_TRUE;
+ }
+ else if (!strcmp(global->interface, "zxdg_shell_v6"))
{
ewd->wl.zxdg_shell =
wl_registry_bind(ewd->wl.registry, global->id,
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h
index 0648bfcb30..6ec509e9c4 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -12,6 +12,7 @@
# include "session-recovery-client-protocol.h"
+# include "xdg-shell-client-protocol.h"
# include "xdg-shell-unstable-v6-client-protocol.h"
# include "efl-aux-hints-client-protocol.h"
@@ -88,6 +89,7 @@ struct _Ecore_Wl2_Display
struct wl_shm *shm;
struct zwp_linux_dmabuf_v1 *dmabuf;
struct zxdg_shell_v6 *zxdg_shell;
+ struct xdg_wm_base *xdg_wm_base;
struct www *www;
struct zwp_e_session_recovery *session_recovery;
struct efl_aux_hints *efl_aux_hints;
@@ -181,12 +183,20 @@ struct _Ecore_Wl2_Window
void *buffer;
struct wl_callback *callback;
struct www_surface *www_surface;
+ struct xdg_surface *xdg_surface;
+ struct xdg_toplevel *xdg_toplevel;
+ struct xdg_popup *xdg_popup;
+
struct zxdg_surface_v6 *zxdg_surface;
struct zxdg_toplevel_v6 *zxdg_toplevel;
struct zxdg_popup_v6 *zxdg_popup;
Eina_Stringshare *uuid;
+ void (*xdg_configure_ack)(struct xdg_surface *surface, uint32_t serial);
+ void (*xdg_set_min_size)(struct xdg_toplevel *toplevel, int32_t w, int32_t h);
+ void (*xdg_set_max_size)(struct xdg_toplevel *toplevel, int32_t w, int32_t h);
+
void (*zxdg_configure_ack)(struct zxdg_surface_v6 *surface, uint32_t serial);
void (*zxdg_set_min_size)(struct zxdg_toplevel_v6 *toplevel, int32_t w, int32_t h);
void (*zxdg_set_max_size)(struct zxdg_toplevel_v6 *toplevel, int32_t w, int32_t h);
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c b/src/lib/ecore_wl2/ecore_wl2_window.c
index 231e48f6cb..a765d14f87 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -8,6 +8,15 @@
void
_ecore_wl2_window_semi_free(Ecore_Wl2_Window *window)
{
+ if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup);
+ window->xdg_popup = NULL;
+
+ if (window->xdg_toplevel) xdg_toplevel_destroy(window->xdg_toplevel);
+ window->xdg_toplevel = NULL;
+
+ if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface);
+ window->xdg_surface = NULL;
+
if (window->zxdg_popup) zxdg_popup_v6_destroy(window->zxdg_popup);
window->zxdg_popup = NULL;
@@ -109,143 +118,7 @@ _configure_complete(Ecore_Wl2_Window *window)
}
-static void
-_zxdg_surface_cb_configure(void *data, struct zxdg_surface_v6 *zxdg_surface EINA_UNUSED, uint32_t serial)
-{
- Ecore_Wl2_Window *window;
-
- window = data;
- window->def_config.serial = serial;
-
- if (window->pending.configure)
- {
- window->saved.w = window->set_config.geometry.w;
- window->saved.h = window->set_config.geometry.h;
- _configure_complete(window);
- }
- if (window->pending.configure && window->updating)
- ERR("Window shouldn't be rendering before initial configure");
-
- if (!window->updating)
- _ecore_wl2_window_configure_send(window);
-}
-
-static const struct zxdg_surface_v6_listener _zxdg_surface_listener =
-{
- _zxdg_surface_cb_configure,
-};
-
-static void
-_zxdg_toplevel_cb_configure(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
-{
- Ecore_Wl2_Window *win = data;
- uint32_t *s;
-
- win->def_config.minimized = EINA_FALSE;
- win->def_config.maximized = EINA_FALSE;
- win->def_config.fullscreen = EINA_FALSE;
- win->def_config.focused = EINA_FALSE;
- win->def_config.resizing = EINA_FALSE;
- win->def_config.geometry.w = width;
- win->def_config.geometry.h = height;
-
- wl_array_for_each(s, states)
- {
- switch (*s)
- {
- case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
- win->def_config.maximized = EINA_TRUE;
- break;
- case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
- win->def_config.fullscreen = EINA_TRUE;
- break;
- case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
- win->def_config.resizing = EINA_TRUE;
- break;
- case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
- win->def_config.focused = EINA_TRUE;
- win->def_config.minimized = EINA_FALSE;
- default:
- break;
- }
- }
-}
-
-static void
-_zxdg_toplevel_cb_close(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED)
-{
- Ecore_Wl2_Window *win;
-
- win = data;
- if (!win) return;
-
- ecore_wl2_window_free(win);
-}
-
-static const struct zxdg_toplevel_v6_listener _zxdg_toplevel_listener =
-{
- _zxdg_toplevel_cb_configure,
- _zxdg_toplevel_cb_close,
-};
-
-static void
-_zxdg_popup_cb_configure(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
-{
- Ecore_Wl2_Window *win = data;
- win->def_config.geometry.w = width;
- win->def_config.geometry.h = height;
-}
-
-static void
-_zxdg_popup_cb_done(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED)
-{
- Ecore_Wl2_Window *win;
-
- win = data;
- if (!win) return;
-
- if (win->grab) _ecore_wl2_input_ungrab(win->grab);
-}
-
-static const struct zxdg_popup_v6_listener _zxdg_popup_listener =
-{
- _zxdg_popup_cb_configure,
- _zxdg_popup_cb_done,
-};
-
-static void
-_ecore_wl2_window_zxdg_popup_create(Ecore_Wl2_Window *win)
-{
- struct zxdg_positioner_v6 *pos;
-
- EINA_SAFETY_ON_NULL_RETURN(win->parent);
- pos = zxdg_shell_v6_create_positioner(win->display->wl.zxdg_shell);
- if (!pos) return;
-
- zxdg_positioner_v6_set_anchor_rect(pos, win->set_config.geometry.x,
- win->set_config.geometry.y,
- 1, 1);
- zxdg_positioner_v6_set_size(pos, win->set_config.geometry.w,
- win->set_config.geometry.h);
- zxdg_positioner_v6_set_anchor(pos, ZXDG_POSITIONER_V6_ANCHOR_TOP |
- ZXDG_POSITIONER_V6_ANCHOR_LEFT);
- zxdg_positioner_v6_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
- ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
-
- win->zxdg_popup = zxdg_surface_v6_get_popup(win->zxdg_surface,
- win->parent->zxdg_surface, pos);
-
- zxdg_positioner_v6_destroy(pos);
- if (win->grab)
- zxdg_popup_v6_grab(win->zxdg_popup, win->grab->wl.seat,
- wl_display_get_serial(win->display->wl.display));
- zxdg_popup_v6_set_user_data(win->zxdg_popup, win);
- zxdg_popup_v6_add_listener(win->zxdg_popup, &_zxdg_popup_listener, win);
-
- win->pending.configure = EINA_TRUE;
-
- ecore_wl2_window_commit(win, EINA_TRUE);
-}
+#include "window_v6.x"
static void
_www_surface_end_drag(void *data, struct www_surface *www_surface EINA_UNUSED)
@@ -310,66 +183,209 @@ _ecore_wl2_window_www_surface_init(Ecore_Wl2_Window *window)
window);
}
+
+static void
+_xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSED, uint32_t serial)
+{
+ Ecore_Wl2_Window *window;
+
+ window = data;
+ window->def_config.serial = serial;
+
+ if (window->pending.configure)
+ {
+ window->saved.w = window->set_config.geometry.w;
+ window->saved.h = window->set_config.geometry.h;
+ _configure_complete(window);
+ }
+ if (window->pending.configure && window->updating)
+ ERR("Window shouldn't be rendering before initial configure");
+
+ if (!window->updating)
+ _ecore_wl2_window_configure_send(window);
+}
+
+static const struct xdg_surface_listener _xdg_surface_listener =
+{
+ _xdg_surface_cb_configure,
+};
+
+static void
+_xdg_toplevel_cb_configure(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
+{
+ Ecore_Wl2_Window *win = data;
+ uint32_t *s;
+
+ win->def_config.minimized = EINA_FALSE;
+ win->def_config.maximized = EINA_FALSE;
+ win->def_config.fullscreen = EINA_FALSE;
+ win->def_config.focused = EINA_FALSE;
+ win->def_config.resizing = EINA_FALSE;
+ win->def_config.geometry.w = width;
+ win->def_config.geometry.h = height;
+
+ wl_array_for_each(s, states)
+ {
+ switch (*s)
+ {
+ case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
+ win->def_config.maximized = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
+ win->def_config.fullscreen = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
+ win->def_config.resizing = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
+ win->def_config.focused = EINA_TRUE;
+ win->def_config.minimized = EINA_FALSE;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+_xdg_toplevel_cb_close(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED)
+{
+ Ecore_Wl2_Window *win;
+
+ win = data;
+ if (!win) return;
+
+ ecore_wl2_window_free(win);
+}
+
+static const struct xdg_toplevel_listener _xdg_toplevel_listener =
+{
+ _xdg_toplevel_cb_configure,
+ _xdg_toplevel_cb_close,
+};
+
+static void
+_xdg_popup_cb_configure(void *data, struct xdg_popup *xdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
+{
+ Ecore_Wl2_Window *win = data;
+ win->def_config.geometry.w = width;
+ win->def_config.geometry.h = height;
+}
+
+static void
+_xdg_popup_cb_done(void *data, struct xdg_popup *xdg_popup EINA_UNUSED)
+{
+ Ecore_Wl2_Window *win;
+
+ win = data;
+ if (!win) return;
+
+ if (win->grab) _ecore_wl2_input_ungrab(win->grab);
+}
+
+static const struct xdg_popup_listener _xdg_popup_listener =
+{
+ _xdg_popup_cb_configure,
+ _xdg_popup_cb_done,
+};
+
+static void
+_ecore_wl2_window_xdg_popup_create(Ecore_Wl2_Window *win)
+{
+ struct xdg_positioner *pos;
+
+ EINA_SAFETY_ON_NULL_RETURN(win->parent);
+ pos = xdg_wm_base_create_positioner(win->display->wl.xdg_wm_base);
+ if (!pos) return;
+
+ xdg_positioner_set_anchor_rect(pos, win->set_config.geometry.x,
+ win->set_config.geometry.y,
+ 1, 1);
+ xdg_positioner_set_size(pos, win->set_config.geometry.w,
+ win->set_config.geometry.h);
+ xdg_positioner_set_anchor(pos, XDG_POSITIONER_ANCHOR_TOP_LEFT);
+ xdg_positioner_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+
+ win->xdg_popup = xdg_surface_get_popup(win->xdg_surface,
+ win->parent->xdg_surface, pos);
+
+ xdg_positioner_destroy(pos);
+ if (win->grab)
+ xdg_popup_grab(win->xdg_popup, win->grab->wl.seat,
+ wl_display_get_serial(win->display->wl.display));
+ xdg_popup_set_user_data(win->xdg_popup, win);
+ xdg_popup_add_listener(win->xdg_popup, &_xdg_popup_listener, win);
+
+ win->pending.configure = EINA_TRUE;
+
+ ecore_wl2_window_commit(win, EINA_TRUE);
+}
+
+static void
+_window_shell_surface_create(Ecore_Wl2_Window *window)
+{
+ if (window->xdg_surface) return;
+ window->xdg_surface =
+ xdg_wm_base_get_xdg_surface(window->display->wl.xdg_wm_base,
+ window->surface);
+ xdg_surface_set_user_data(window->xdg_surface, window);
+ xdg_surface_add_listener(window->xdg_surface,
+ &_xdg_surface_listener, window);
+
+ window->xdg_configure_ack = xdg_surface_ack_configure;
+ window->pending.configure = EINA_TRUE;
+ if (window->display->wl.efl_hints)
+ {
+ if (window->aspect.set)
+ efl_hints_set_aspect(window->display->wl.efl_hints, window->xdg_surface,
+ window->aspect.w, window->aspect.h, window->aspect.aspect);
+ if (window->weight.set)
+ efl_hints_set_weight(window->display->wl.efl_hints, window->xdg_surface,
+ window->weight.w, window->weight.h);
+ }
+
+ if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
+ _ecore_wl2_window_xdg_popup_create(window);
+ else
+ {
+ struct xdg_toplevel *ptop = NULL;
+
+ window->xdg_toplevel =
+ xdg_surface_get_toplevel(window->xdg_surface);
+ xdg_toplevel_set_user_data(window->xdg_toplevel, window);
+ xdg_toplevel_add_listener(window->xdg_toplevel,
+ &_xdg_toplevel_listener, window);
+
+ if (window->title)
+ xdg_toplevel_set_title(window->xdg_toplevel, window->title);
+ if (window->class)
+ xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
+
+ window->xdg_set_min_size = xdg_toplevel_set_min_size;
+ window->xdg_set_max_size = xdg_toplevel_set_max_size;
+
+ if (window->parent)
+ ptop = window->parent->xdg_toplevel;
+
+ if (ptop)
+ xdg_toplevel_set_parent(window->xdg_toplevel, ptop);
+
+ if (window->set_config.maximized)
+ xdg_toplevel_set_maximized(window->xdg_toplevel);
+
+ if (window->set_config.fullscreen)
+ xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
+ }
+
+ ecore_wl2_window_commit(window, EINA_TRUE);
+}
+
void
_ecore_wl2_window_shell_surface_init(Ecore_Wl2_Window *window)
{
if (!window->surface) return;
- if ((window->display->wl.zxdg_shell) && (!window->zxdg_surface))
- {
- window->zxdg_surface =
- zxdg_shell_v6_get_xdg_surface(window->display->wl.zxdg_shell,
- window->surface);
- zxdg_surface_v6_set_user_data(window->zxdg_surface, window);
- zxdg_surface_v6_add_listener(window->zxdg_surface,
- &_zxdg_surface_listener, window);
-
- window->zxdg_configure_ack = zxdg_surface_v6_ack_configure;
- window->pending.configure = EINA_TRUE;
- if (window->display->wl.efl_hints)
- {
- if (window->aspect.set)
- efl_hints_set_aspect(window->display->wl.efl_hints, window->zxdg_surface,
- window->aspect.w, window->aspect.h, window->aspect.aspect);
- if (window->weight.set)
- efl_hints_set_weight(window->display->wl.efl_hints, window->zxdg_surface,
- window->weight.w, window->weight.h);
- }
-
- if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
- _ecore_wl2_window_zxdg_popup_create(window);
- else
- {
- struct zxdg_toplevel_v6 *ptop = NULL;
-
- window->zxdg_toplevel =
- zxdg_surface_v6_get_toplevel(window->zxdg_surface);
- zxdg_toplevel_v6_set_user_data(window->zxdg_toplevel, window);
- zxdg_toplevel_v6_add_listener(window->zxdg_toplevel,
- &_zxdg_toplevel_listener, window);
-
- if (window->title)
- zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
- if (window->class)
- zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
-
- window->zxdg_set_min_size = zxdg_toplevel_v6_set_min_size;
- window->zxdg_set_max_size = zxdg_toplevel_v6_set_max_size;
-
- if (window->parent)
- ptop = window->parent->zxdg_toplevel;
-
- if (ptop)
- zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
-
- if (window->set_config.maximized)
- zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
-
- if (window->set_config.fullscreen)
- zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
- }
-
- ecore_wl2_window_commit(window, EINA_TRUE);
- }
+ if (window->display->wl.xdg_wm_base) _window_shell_surface_create(window);
+ if (window->display->wl.zxdg_shell) _window_v6_shell_surface_create(window);
if (window->display->wl.session_recovery)
{
@@ -377,6 +393,12 @@ _ecore_wl2_window_shell_surface_init(Ecore_Wl2_Window *window)
{
zwp_e_session_recovery_set_uuid(window->display->wl.session_recovery,
window->surface, window->uuid);
+ if (window->xdg_surface)
+ xdg_surface_set_window_geometry(window->xdg_surface,
+ window->set_config.geometry.x,
+ window->set_config.geometry.y,
+ window->set_config.geometry.w,
+ window->set_config.geometry.h);
if (window->zxdg_surface)
zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
window->set_config.geometry.x,
@@ -571,6 +593,9 @@ ecore_wl2_window_hide(Ecore_Wl2_Window *window)
window->req_config.serial = 0;
window->def_config.serial = 0;
window->zxdg_configure_ack = NULL;
+ window->xdg_configure_ack = NULL;
+ window->xdg_set_min_size = NULL;
+ window->xdg_set_max_size = NULL;
window->zxdg_set_min_size = NULL;
window->zxdg_set_max_size = NULL;
}
@@ -637,6 +662,9 @@ ecore_wl2_window_move(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
window->moving = EINA_TRUE;
+ if (window->xdg_toplevel)
+ xdg_toplevel_move(window->xdg_toplevel, input->wl.seat,
+ window->display->serial);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_move(window->zxdg_toplevel, input->wl.seat,
window->display->serial);
@@ -651,6 +679,9 @@ ecore_wl2_window_resize(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input, int lo
if (!input)
input = EINA_INLIST_CONTAINER_GET(window->display->inputs, Ecore_Wl2_Input);
+ if (window->xdg_toplevel)
+ xdg_toplevel_resize(window->xdg_toplevel, input->wl.seat,
+ window->display->serial, location);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_resize(window->zxdg_toplevel, input->wl.seat,
window->display->serial, location);
@@ -847,11 +878,15 @@ ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
if (!window->set_config.fullscreen)
window->saved = window->set_config.geometry;
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_maximized(window->xdg_toplevel);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
}
else
{
+ if (window->xdg_toplevel)
+ xdg_toplevel_unset_maximized(window->xdg_toplevel);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
}
@@ -889,11 +924,15 @@ ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
if (!window->set_config.maximized)
window->saved = window->set_config.geometry;
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
}
else
{
+ if (window->xdg_toplevel)
+ xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
}
@@ -924,6 +963,8 @@ ecore_wl2_window_title_set(Ecore_Wl2_Window *window, const char *title)
eina_stringshare_replace(&window->title, title);
if (!window->title) return;
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_title(window->xdg_toplevel, window->title);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
}
@@ -936,6 +977,8 @@ ecore_wl2_window_class_set(Ecore_Wl2_Window *window, const char *clas)
eina_stringshare_replace(&window->class, clas);
if (!window->class) return;
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
}
@@ -992,11 +1035,26 @@ ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified)
if (iconified)
{
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_minimized(window->xdg_toplevel);
if (window->zxdg_toplevel)
zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
}
else
{
+ if (window->xdg_toplevel)
+ {
+ struct wl_array states;
+ uint32_t *s;
+
+ wl_array_init(&states);
+ s = wl_array_add(&states, sizeof(*s));
+ *s = XDG_TOPLEVEL_STATE_ACTIVATED;
+ _xdg_toplevel_cb_configure(window, window->xdg_toplevel,
+ window->set_config.geometry.w,
+ window->set_config.geometry.h, &states);
+ wl_array_release(&states);
+ }
if (window->zxdg_toplevel)
{
struct wl_array states;
@@ -1044,7 +1102,7 @@ EAPI Eina_Bool
ecore_wl2_window_shell_surface_exists(Ecore_Wl2_Window *window)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
- return !!window->zxdg_surface;
+ return !!window->zxdg_surface || !!window->xdg_surface;
}
EAPI Eina_Bool
@@ -1352,9 +1410,9 @@ ecore_wl2_window_aspect_set(Ecore_Wl2_Window *window, int w, int h, unsigned int
window->aspect.aspect = aspect;
window->aspect.set = 1;
if (!window->display->wl.efl_hints) return;
- if (window->zxdg_surface)
+ if (window->xdg_surface)
efl_hints_set_aspect(window->display->wl.efl_hints,
- window->zxdg_surface, w, h, aspect);
+ window->xdg_surface, w, h, aspect);
}
EAPI void
@@ -1373,9 +1431,9 @@ ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, double h)
window->weight.h = hh;
window->weight.set = 1;
if (!window->display->wl.efl_hints) return;
- if (window->zxdg_surface)
+ if (window->xdg_surface)
efl_hints_set_weight(window->display->wl.efl_hints,
- window->zxdg_surface, ww, hh);
+ window->xdg_surface, ww, hh);
}
static void
@@ -1401,29 +1459,45 @@ static struct wl_callback_listener _frame_listener =
static void
_maximized_set(Ecore_Wl2_Window *window)
{
- EINA_SAFETY_ON_NULL_RETURN(window->zxdg_toplevel);
+ EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
if (window->set_config.maximized)
{
window->saved = window->set_config.geometry;
- zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_maximized(window->xdg_toplevel);
+ if (window->zxdg_toplevel)
+ zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
}
else
- zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
+ {
+ if (window->xdg_toplevel)
+ xdg_toplevel_unset_maximized(window->xdg_toplevel);
+ if (window->zxdg_toplevel)
+ zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
+ }
}
static void
_fullscreen_set(Ecore_Wl2_Window *window)
{
- EINA_SAFETY_ON_NULL_RETURN(window->zxdg_toplevel);
+ EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
if (window->set_config.fullscreen)
{
window->saved = window->set_config.geometry;
- zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
+ if (window->xdg_toplevel)
+ xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
+ if (window->zxdg_toplevel)
+ zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
}
else
- zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
+ {
+ if (window->xdg_toplevel)
+ xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
+ if (window->zxdg_toplevel)
+ zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
+ }
}
static void
@@ -1493,12 +1567,21 @@ ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush)
window->callback = wl_surface_frame(window->surface);
wl_callback_add_listener(window->callback, &_frame_listener, window);
/* Dispatch any state we've been saving along the way */
- if (window->pending.geom && window->zxdg_toplevel)
- zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
- window->set_config.geometry.x,
- window->set_config.geometry.y,
- window->set_config.geometry.w,
- window->set_config.geometry.h);
+ if (window->pending.geom)
+ {
+ if (window->xdg_toplevel)
+ xdg_surface_set_window_geometry(window->xdg_surface,
+ window->set_config.geometry.x,
+ window->set_config.geometry.y,
+ window->set_config.geometry.w,
+ window->set_config.geometry.h);
+ if (window->zxdg_surface)
+ zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
+ window->set_config.geometry.x,
+ window->set_config.geometry.y,
+ window->set_config.geometry.w,
+ window->set_config.geometry.h);
+ }
if (window->pending.opaque)
_opaque_set(window);
@@ -1520,6 +1603,9 @@ ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush)
if (window->req_config.serial != window->set_config.serial)
{
+ if (window->xdg_configure_ack)
+ window->xdg_configure_ack(window->xdg_surface,
+ window->req_config.serial);
if (window->zxdg_configure_ack)
window->zxdg_configure_ack(window->zxdg_surface,
window->req_config.serial);
diff --git a/src/lib/ecore_wl2/window_v6.x b/src/lib/ecore_wl2/window_v6.x
new file mode 100644
index 0000000000..34a12d692e
--- /dev/null
+++ b/src/lib/ecore_wl2/window_v6.x
@@ -0,0 +1,188 @@
+
+static void
+_zxdg_surface_cb_configure(void *data, struct zxdg_surface_v6 *zxdg_surface EINA_UNUSED, uint32_t serial)
+{
+ Ecore_Wl2_Window *window;
+
+ window = data;
+ window->def_config.serial = serial;
+
+ if (window->pending.configure)
+ {
+ window->saved.w = window->set_config.geometry.w;
+ window->saved.h = window->set_config.geometry.h;
+ _configure_complete(window);
+ }
+ if (window->pending.configure && window->updating)
+ ERR("Window shouldn't be rendering before initial configure");
+
+ if (!window->updating)
+ _ecore_wl2_window_configure_send(window);
+}
+
+static const struct zxdg_surface_v6_listener _zxdg_surface_listener =
+{
+ _zxdg_surface_cb_configure,
+};
+
+static void
+_zxdg_toplevel_cb_configure(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
+{
+ Ecore_Wl2_Window *win = data;
+ uint32_t *s;
+
+ win->def_config.minimized = EINA_FALSE;
+ win->def_config.maximized = EINA_FALSE;
+ win->def_config.fullscreen = EINA_FALSE;
+ win->def_config.focused = EINA_FALSE;
+ win->def_config.resizing = EINA_FALSE;
+ win->def_config.geometry.w = width;
+ win->def_config.geometry.h = height;
+
+ wl_array_for_each(s, states)
+ {
+ switch (*s)
+ {
+ case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
+ win->def_config.maximized = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
+ win->def_config.fullscreen = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
+ win->def_config.resizing = EINA_TRUE;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
+ win->def_config.focused = EINA_TRUE;
+ win->def_config.minimized = EINA_FALSE;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+_zxdg_toplevel_cb_close(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED)
+{
+ Ecore_Wl2_Window *win;
+
+ win = data;
+ if (!win) return;
+
+ ecore_wl2_window_free(win);
+}
+
+static const struct zxdg_toplevel_v6_listener _zxdg_toplevel_listener =
+{
+ _zxdg_toplevel_cb_configure,
+ _zxdg_toplevel_cb_close,
+};
+
+static void
+_zxdg_popup_cb_configure(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
+{
+ Ecore_Wl2_Window *win = data;
+ win->def_config.geometry.w = width;
+ win->def_config.geometry.h = height;
+}
+
+static void
+_zxdg_popup_cb_done(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED)
+{
+ Ecore_Wl2_Window *win;
+
+ win = data;
+ if (!win) return;
+
+ if (win->grab) _ecore_wl2_input_ungrab(win->grab);
+}
+
+static const struct zxdg_popup_v6_listener _zxdg_popup_listener =
+{
+ _zxdg_popup_cb_configure,
+ _zxdg_popup_cb_done,
+};
+
+static void
+_window_v6_popup_create(Ecore_Wl2_Window *win)
+{
+ struct zxdg_positioner_v6 *pos;
+
+ EINA_SAFETY_ON_NULL_RETURN(win->parent);
+ pos = zxdg_shell_v6_create_positioner(win->display->wl.zxdg_shell);
+ if (!pos) return;
+
+ zxdg_positioner_v6_set_anchor_rect(pos, win->set_config.geometry.x,
+ win->set_config.geometry.y,
+ 1, 1);
+ zxdg_positioner_v6_set_size(pos, win->set_config.geometry.w,
+ win->set_config.geometry.h);
+ zxdg_positioner_v6_set_anchor(pos, ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT);
+ zxdg_positioner_v6_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+
+ win->zxdg_popup = zxdg_surface_v6_get_popup(win->zxdg_surface,
+ win->parent->zxdg_surface, pos);
+
+ zxdg_positioner_v6_destroy(pos);
+ if (win->grab)
+ zxdg_popup_v6_grab(win->zxdg_popup, win->grab->wl.seat,
+ wl_display_get_serial(win->display->wl.display));
+ zxdg_popup_v6_set_user_data(win->zxdg_popup, win);
+ zxdg_popup_v6_add_listener(win->zxdg_popup, &_zxdg_popup_listener, win);
+
+ win->pending.configure = EINA_TRUE;
+
+ ecore_wl2_window_commit(win, EINA_TRUE);
+}
+
+static void
+_window_v6_shell_surface_create(Ecore_Wl2_Window *window)
+{
+ if (window->zxdg_surface) return;
+ window->zxdg_surface =
+ zxdg_shell_v6_get_xdg_surface(window->display->wl.zxdg_shell,
+ window->surface);
+ zxdg_surface_v6_set_user_data(window->zxdg_surface, window);
+ zxdg_surface_v6_add_listener(window->zxdg_surface,
+ &_zxdg_surface_listener, window);
+
+ window->zxdg_configure_ack = zxdg_surface_v6_ack_configure;
+ window->pending.configure = EINA_TRUE;
+
+ if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
+ _window_v6_popup_create(window);
+ else
+ {
+ struct zxdg_toplevel_v6 *ptop = NULL;
+
+ window->zxdg_toplevel =
+ zxdg_surface_v6_get_toplevel(window->zxdg_surface);
+ zxdg_toplevel_v6_set_user_data(window->zxdg_toplevel, window);
+ zxdg_toplevel_v6_add_listener(window->zxdg_toplevel,
+ &_zxdg_toplevel_listener, window);
+
+ if (window->title)
+ zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
+ if (window->class)
+ zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
+
+ window->zxdg_set_min_size = zxdg_toplevel_v6_set_min_size;
+ window->zxdg_set_max_size = zxdg_toplevel_v6_set_max_size;
+
+ if (window->parent)
+ ptop = window->parent->zxdg_toplevel;
+
+ if (ptop)
+ zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
+
+ if (window->set_config.maximized)
+ zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
+
+ if (window->set_config.fullscreen)
+ zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
+ }
+
+ ecore_wl2_window_commit(window, EINA_TRUE);
+}
diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c
index d78994423c..c3580bcbb6 100644
--- a/src/lib/elementary/efl_ui_win.c
+++ b/src/lib/elementary/efl_ui_win.c
@@ -4176,7 +4176,10 @@ _elm_win_frame_cb_menu(void *data,
EINA_ITERATOR_FOREACH(it, input) break;
eina_iterator_free(it);
}
- if (sd->wl.win->zxdg_toplevel)
+ if (sd->wl.win->xdg_toplevel)
+ xdg_toplevel_show_window_menu(sd->wl.win->xdg_toplevel,
+ ecore_wl2_input_seat_get(input), 0, x, y);
+ else if (sd->wl.win->zxdg_toplevel)
zxdg_toplevel_v6_show_window_menu(sd->wl.win->zxdg_toplevel,
ecore_wl2_input_seat_get(input), 0, x, y);
#else
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index 54daeb3259..4593ae8655 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -241,6 +241,17 @@ _ecore_evas_wl_common_resize(Ecore_Evas *ee, int w, int h)
ee->w = w;
ee->h = h;
+ if (wdata->win->xdg_set_min_size && wdata->win->xdg_toplevel && wdata->win->pending.min)
+ {
+ wdata->win->xdg_set_min_size(wdata->win->xdg_toplevel, ee->prop.min.w, ee->prop.min.h);
+ wdata->win->pending.min = 0;
+ }
+ if (wdata->win->xdg_set_max_size && wdata->win->xdg_toplevel && wdata->win->pending.max)
+ {
+ wdata->win->xdg_set_max_size(wdata->win->xdg_toplevel, ee->prop.max.w, ee->prop.max.h);
+ wdata->win->pending.max = 0;
+ }
+
if (wdata->win->zxdg_set_min_size && wdata->win->zxdg_toplevel && wdata->win->pending.min)
{
wdata->win->zxdg_set_min_size(wdata->win->zxdg_toplevel, ee->prop.min.w, ee->prop.min.h);
@@ -524,6 +535,9 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_
wdata->win->req_config.serial && wdata->win->surface &&
((!state_change) || ((pfw == fw) && (pfh == fh))))
{
+ if (wdata->win->xdg_configure_ack)
+ wdata->win->xdg_configure_ack(wdata->win->xdg_surface,
+ wdata->win->req_config.serial);
if (wdata->win->zxdg_configure_ack)
wdata->win->zxdg_configure_ack(wdata->win->zxdg_surface,
wdata->win->req_config.serial);
@@ -1558,6 +1572,11 @@ _ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h)
ee->prop.min.w = w;
ee->prop.min.h = h;
wdata = ee->engine.data;
+ if (wdata->win->xdg_set_min_size && wdata->win->xdg_toplevel)
+ {
+ wdata->win->xdg_set_min_size(wdata->win->xdg_toplevel, w, h);
+ wdata->win->pending.min = 0;
+ }
if (wdata->win->zxdg_set_min_size && wdata->win->zxdg_toplevel)
{
wdata->win->zxdg_set_min_size(wdata->win->zxdg_toplevel, w, h);
@@ -1581,6 +1600,11 @@ _ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h)
ee->prop.max.w = w;
ee->prop.max.h = h;
wdata = ee->engine.data;
+ if (wdata->win->xdg_set_max_size && wdata->win->xdg_toplevel)
+ {
+ wdata->win->xdg_set_max_size(wdata->win->xdg_toplevel, w, h);
+ wdata->win->pending.max = 0;
+ }
if (wdata->win->zxdg_set_max_size && wdata->win->zxdg_toplevel)
{
wdata->win->zxdg_set_max_size(wdata->win->zxdg_toplevel, w, h);
@@ -2067,6 +2091,16 @@ _ecore_evas_wl_common_show(Ecore_Evas *ee)
{
int fw, fh;
+ if (wdata->win->xdg_set_min_size && wdata->win->xdg_toplevel && wdata->win->pending.min)
+ {
+ wdata->win->xdg_set_min_size(wdata->win->xdg_toplevel, ee->prop.min.w, ee->prop.min.h);
+ wdata->win->pending.min = 0;
+ }
+ if (wdata->win->xdg_set_max_size && wdata->win->xdg_toplevel && wdata->win->pending.max)
+ {
+ wdata->win->xdg_set_max_size(wdata->win->xdg_toplevel, ee->prop.max.w, ee->prop.max.h);
+ wdata->win->pending.max = 0;
+ }
if (wdata->win->zxdg_set_min_size && wdata->win->zxdg_toplevel && wdata->win->pending.min)
{
wdata->win->zxdg_set_min_size(wdata->win->zxdg_toplevel, ee->prop.min.w, ee->prop.min.h);
diff --git a/src/wayland_protocol/efl-hints.xml b/src/wayland_protocol/efl-hints.xml
index 9f2b775dda..a29787e25f 100644
--- a/src/wayland_protocol/efl-hints.xml
+++ b/src/wayland_protocol/efl-hints.xml
@@ -9,13 +9,13 @@
-
+
-
+