diff --git a/.gitignore b/.gitignore index 2ca4c1f0f6..369bb4d452 100644 --- a/.gitignore +++ b/.gitignore @@ -167,7 +167,9 @@ retroarch_switch.nso # Wayland gfx/common/wayland/idle-inhibit-unstable-v1.c gfx/common/wayland/idle-inhibit-unstable-v1.h -gfx/common/wayland/idle-inhibit-unstable-v6.c -gfx/common/wayland/idle-inhibit-unstable-v6.h +gfx/common/wayland/xdg-shell-unstable-v6.c +gfx/common/wayland/xdg-shell-unstable-v6.h +gfx/common/wayland/xdg-decoration-unstable-v1.h +gfx/common/wayland/xdg-decoration-unstable-v1.c gfx/common/wayland/xdg-shell.c gfx/common/wayland/xdg-shell.h diff --git a/Makefile.common b/Makefile.common index 786096ceff..40f94009ba 100644 --- a/Makefile.common +++ b/Makefile.common @@ -867,7 +867,8 @@ ifeq ($(HAVE_WAYLAND), 1) input/drivers/wayland_input.o \ gfx/common/wayland/xdg-shell.o \ gfx/common/wayland/xdg-shell-unstable-v6.o \ - gfx/common/wayland/idle-inhibit-unstable-v1.o + gfx/common/wayland/idle-inhibit-unstable-v1.o \ + gfx/common/wayland/xdg-decoration-unstable-v1.o ifeq ($(HAVE_EGL), 1) LIBS += $(EGL_LIBS) endif diff --git a/gfx/common/wayland/generate_wayland_protos.sh b/gfx/common/wayland/generate_wayland_protos.sh index 22e19281cf..8c0cc7f155 100755 --- a/gfx/common/wayland/generate_wayland_protos.sh +++ b/gfx/common/wayland/generate_wayland_protos.sh @@ -9,12 +9,16 @@ fi #Generate xdg-shell_v6 header and .c files $WAYSCAN client-header $WAYLAND_PROTOS/unstable/xdg-shell/xdg-shell-unstable-v6.xml $OUTPUT/xdg-shell-unstable-v6.h -$WAYSCAN code $WAYLAND_PROTOS/unstable/xdg-shell/xdg-shell-unstable-v6.xml $OUTPUT/xdg-shell-unstable-v6.c +$WAYSCAN private-code $WAYLAND_PROTOS/unstable/xdg-shell/xdg-shell-unstable-v6.xml $OUTPUT/xdg-shell-unstable-v6.c #Generate xdg-shell header and .c files $WAYSCAN client-header $WAYLAND_PROTOS/stable/xdg-shell/xdg-shell.xml $OUTPUT/xdg-shell.h -$WAYSCAN code $WAYLAND_PROTOS/stable/xdg-shell/xdg-shell.xml $OUTPUT/xdg-shell.c +$WAYSCAN private-code $WAYLAND_PROTOS/stable/xdg-shell/xdg-shell.xml $OUTPUT/xdg-shell.c #Generate idle-inhibit header and .c files $WAYSCAN client-header $WAYLAND_PROTOS/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml $OUTPUT/idle-inhibit-unstable-v1.h -$WAYSCAN code $WAYLAND_PROTOS/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml $OUTPUT/idle-inhibit-unstable-v1.c +$WAYSCAN private-code $WAYLAND_PROTOS/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml $OUTPUT/idle-inhibit-unstable-v1.c + +#Generate xdg-decoration header and .c files +$WAYSCAN client-header $WAYLAND_PROTOS/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml $OUTPUT/xdg-decoration-unstable-v1.h +$WAYSCAN private-code $WAYLAND_PROTOS/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml $OUTPUT/xdg-decoration-unstable-v1.c diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index a7dbdc949f..929e441978 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -56,6 +56,9 @@ /* Generated from xdg-shell.xml */ #include "../common/wayland/xdg-shell.h" +/* Generated from xdg-decoration-unstable-v1.h */ +#include "../common/wayland/xdg-decoration-unstable-v1.h" + typedef struct touch_pos { @@ -103,6 +106,8 @@ typedef struct gfx_ctx_wayland_data struct wl_touch *wl_touch; struct wl_seat *seat; struct wl_shm *shm; + struct zxdg_decoration_manager_v1 *deco_manager; + struct zxdg_toplevel_decoration_v1 *deco; struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager; struct zwp_idle_inhibitor_v1 *idle_inhibitor; int swap_interval; @@ -842,6 +847,9 @@ static void registry_handle_global(void *data, struct wl_registry *reg, else if (string_is_equal(interface, "zwp_idle_inhibit_manager_v1")) wl->idle_inhibit_manager = (struct zwp_idle_inhibit_manager_v1*)wl_registry_bind( reg, id, &zwp_idle_inhibit_manager_v1_interface, 1); + else if (string_is_equal(interface, "zxdg_decoration_manager_v1")) + wl->deco_manager = (struct zxdg_decoration_manager_v1*)wl_registry_bind( + reg, id, &zxdg_decoration_manager_v1_interface, 1); } static void registry_handle_global_remove(void *data, @@ -938,6 +946,10 @@ static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl) wl_shell_surface_destroy(wl->shell_surf); if (wl->idle_inhibit_manager) zwp_idle_inhibit_manager_v1_destroy(wl->idle_inhibit_manager); + if (wl->deco) + zxdg_toplevel_decoration_v1_destroy(wl->deco); + if (wl->deco_manager) + zxdg_decoration_manager_v1_destroy(wl->deco_manager); if (wl->idle_inhibitor) zwp_idle_inhibitor_v1_destroy(wl->idle_inhibitor); @@ -1082,10 +1094,18 @@ static void gfx_ctx_wl_update_title(void *data, void *data2) video_driver_get_window_title(title, sizeof(title)); if (wl && title[0]) { - if (wl->xdg_toplevel) - xdg_toplevel_set_title(wl->xdg_toplevel, title); - else if (wl->zxdg_toplevel) - zxdg_toplevel_v6_set_title(wl->zxdg_toplevel, title); + if (wl->xdg_toplevel) { + if (wl->deco) { + zxdg_toplevel_decoration_v1_set_mode(wl->deco, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); + } + xdg_toplevel_set_title(wl->xdg_toplevel, title); + } + else if (wl->zxdg_toplevel) { + if (wl->deco) { + zxdg_toplevel_decoration_v1_set_mode(wl->deco, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); + } + zxdg_toplevel_v6_set_title(wl->zxdg_toplevel, title); + } else if (wl->shell_surf) wl_shell_surface_set_title(wl->shell_surf, title); } @@ -1268,6 +1288,11 @@ static void *gfx_ctx_wl_init(video_frame_info_t *video_info, void *video_driver) { RARCH_WARN("[Wayland]: Compositor doesn't support zwp_idle_inhibit_manager_v1 protocol!\n"); } + + if (!wl->deco_manager) + { + RARCH_WARN("[Wayland]: Compositor doesn't support zxdg_decoration_manager_v1 protocol!\n"); + } wl->input.fd = wl_display_get_fd(wl->input.dpy); @@ -1500,7 +1525,13 @@ static bool gfx_ctx_wl_set_video_mode(void *data, xdg_toplevel_set_app_id(wl->xdg_toplevel, "RetroArch"); xdg_toplevel_set_title(wl->xdg_toplevel, "RetroArch"); - + + if (wl->deco_manager) { + wl->deco = zxdg_decoration_manager_v1_get_toplevel_decoration( + wl->deco_manager, wl->xdg_toplevel); + } + + /* Waiting for xdg_toplevel to be configured before starting to draw */ wl_surface_commit(wl->surface); wl->configured = true; @@ -1518,7 +1549,13 @@ static bool gfx_ctx_wl_set_video_mode(void *data, zxdg_toplevel_v6_set_app_id(wl->zxdg_toplevel, "RetroArch"); zxdg_toplevel_v6_set_title(wl->zxdg_toplevel, "RetroArch"); - + + if (wl->deco_manager) { + wl->deco = zxdg_decoration_manager_v1_get_toplevel_decoration( + wl->deco_manager, wl->xdg_toplevel); + } + + /* Waiting for xdg_toplevel to be configured before starting to draw */ wl_surface_commit(wl->surface); wl->configured = true; diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 4e911b3826..9542d643ab 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -455,9 +455,9 @@ check_pkgconf V4L2 libv4l2 check_pkgconf FREETYPE freetype2 check_pkgconf X11 x11 check_pkgconf XCB xcb -check_pkgconf WAYLAND wayland-egl 1.14 -check_pkgconf WAYLAND_CURSOR wayland-cursor 1.14 -check_pkgconf WAYLAND_PROTOS wayland-protocols 1.13 +check_pkgconf WAYLAND wayland-egl 1.15 +check_pkgconf WAYLAND_CURSOR wayland-cursor 1.15 +check_pkgconf WAYLAND_PROTOS wayland-protocols 1.15 check_pkgconf XKBCOMMON xkbcommon 0.3.2 check_pkgconf DBUS dbus-1 check_pkgconf XEXT xext @@ -474,7 +474,7 @@ check_val '' XEXT -lXext check_val '' XF86VM -lXxf86vm if [ "$HAVE_WAYLAND_PROTOS" = yes ] && [ "$HAVE_WAYLAND" = yes ]; then - check_pkgconf WAYLAND_SCANNER wayland-scanner 1.13 + check_pkgconf WAYLAND_SCANNER wayland-scanner 1.15 ./gfx/common/wayland/generate_wayland_protos.sh else die : 'Notice: wayland-egl or wayland-protocols not present. Skiping Wayland code paths.'