Commit 3d6efc4a authored by mntmn's avatar mntmn Committed by Olivier Fourdan

xwayland: port rooted xwayland from wl_shell to xdg-shell protocol

Recently, rooted Xwayland crashes on wlroots-based compositors, because
wlroots removed the deprecated wl_shell protocol.
This MR fixes this by changing the code in question to the xdg-shell
protocol. My motivation do this: on etnaviv-based embedded platforms,
rooted Xwayland is much faster and doesn't cause UI rendering bugs
compared to rootless Xwayland.
Signed-off-by: default avatarLukas F. Hartmann <lukas@mntre.com>
parent de940e06
...@@ -100,7 +100,9 @@ Xwayland_built_sources += \ ...@@ -100,7 +100,9 @@ Xwayland_built_sources += \
linux-dmabuf-unstable-v1-client-protocol.h \ linux-dmabuf-unstable-v1-client-protocol.h \
linux-dmabuf-unstable-v1-protocol.c \ linux-dmabuf-unstable-v1-protocol.c \
viewporter-client-protocol.h \ viewporter-client-protocol.h \
viewporter-protocol.c viewporter-protocol.c\
xdg-shell-client-protocol.h\
xdg-shell-protocol.c
if XWAYLAND_EGLSTREAM if XWAYLAND_EGLSTREAM
Xwayland_built_sources += \ Xwayland_built_sources += \
...@@ -154,6 +156,11 @@ viewporter-protocol.c: $(WAYLAND_PROTOCOLS_DATADIR)/stable/viewporter/viewporter ...@@ -154,6 +156,11 @@ viewporter-protocol.c: $(WAYLAND_PROTOCOLS_DATADIR)/stable/viewporter/viewporter
viewporter-client-protocol.h: $(WAYLAND_PROTOCOLS_DATADIR)/stable/viewporter/viewporter.xml viewporter-client-protocol.h: $(WAYLAND_PROTOCOLS_DATADIR)/stable/viewporter/viewporter.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@ $(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
xdg-shell-protocol.c: $(WAYLAND_PROTOCOLS_DATADIR)/stable/xdg-shell/xdg-shell.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) @SCANNER_ARG@ < $< > $@
xdg-shell-client-protocol.h: $(WAYLAND_PROTOCOLS_DATADIR)/stable/xdg-shell/xdg-shell.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
wayland-eglstream-client-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/wayland-eglstream.xml wayland-eglstream-client-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/wayland-eglstream.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@ $(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
wayland-eglstream-controller-client-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/wayland-eglstream-controller.xml wayland-eglstream-controller-client-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/wayland-eglstream-controller.xml
......
...@@ -40,6 +40,7 @@ kbgrab_xml = join_paths(protodir, 'unstable', 'xwayland-keyboard-grab', 'xwaylan ...@@ -40,6 +40,7 @@ kbgrab_xml = join_paths(protodir, 'unstable', 'xwayland-keyboard-grab', 'xwaylan
xdg_output_xml = join_paths(protodir, 'unstable', 'xdg-output', 'xdg-output-unstable-v1.xml') xdg_output_xml = join_paths(protodir, 'unstable', 'xdg-output', 'xdg-output-unstable-v1.xml')
dmabuf_xml = join_paths(protodir, 'unstable', 'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml') dmabuf_xml = join_paths(protodir, 'unstable', 'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml')
viewporter_xml = join_paths(protodir, 'stable', 'viewporter', 'viewporter.xml') viewporter_xml = join_paths(protodir, 'stable', 'viewporter', 'viewporter.xml')
xdg_shell_xml = join_paths(protodir, 'stable', 'xdg-shell', 'xdg-shell.xml')
client_header = generator(scanner, client_header = generator(scanner,
output : '@BASENAME@-client-protocol.h', output : '@BASENAME@-client-protocol.h',
...@@ -63,6 +64,7 @@ srcs += client_header.process(kbgrab_xml) ...@@ -63,6 +64,7 @@ srcs += client_header.process(kbgrab_xml)
srcs += client_header.process(xdg_output_xml) srcs += client_header.process(xdg_output_xml)
srcs += client_header.process(dmabuf_xml) srcs += client_header.process(dmabuf_xml)
srcs += client_header.process(viewporter_xml) srcs += client_header.process(viewporter_xml)
srcs += client_header.process(xdg_shell_xml)
srcs += code.process(relative_xml) srcs += code.process(relative_xml)
srcs += code.process(pointer_xml) srcs += code.process(pointer_xml)
srcs += code.process(tablet_xml) srcs += code.process(tablet_xml)
...@@ -70,6 +72,7 @@ srcs += code.process(kbgrab_xml) ...@@ -70,6 +72,7 @@ srcs += code.process(kbgrab_xml)
srcs += code.process(xdg_output_xml) srcs += code.process(xdg_output_xml)
srcs += code.process(dmabuf_xml) srcs += code.process(dmabuf_xml)
srcs += code.process(viewporter_xml) srcs += code.process(viewporter_xml)
srcs += code.process(xdg_shell_xml)
xwayland_glamor = [] xwayland_glamor = []
eglstream_srcs = [] eglstream_srcs = []
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "xdg-output-unstable-v1-client-protocol.h" #include "xdg-output-unstable-v1-client-protocol.h"
#include "viewporter-client-protocol.h" #include "viewporter-client-protocol.h"
#include "xdg-shell-client-protocol.h"
static DevPrivateKeyRec xwl_screen_private_key; static DevPrivateKeyRec xwl_screen_private_key;
static DevPrivateKeyRec xwl_client_private_key; static DevPrivateKeyRec xwl_client_private_key;
...@@ -318,6 +319,17 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen) ...@@ -318,6 +319,17 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen)
} }
} }
static void
xdg_wm_base_ping(void *data, struct xdg_wm_base *xdg_wm_base,
uint32_t serial)
{
xdg_wm_base_pong(xdg_wm_base, serial);
}
static const struct xdg_wm_base_listener xdg_wm_base_listener = {
xdg_wm_base_ping,
};
static void static void
registry_global(void *data, struct wl_registry *registry, uint32_t id, registry_global(void *data, struct wl_registry *registry, uint32_t id,
const char *interface, uint32_t version) const char *interface, uint32_t version)
...@@ -336,9 +348,12 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, ...@@ -336,9 +348,12 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id,
else if (strcmp(interface, "wl_shm") == 0) { else if (strcmp(interface, "wl_shm") == 0) {
xwl_screen->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1); xwl_screen->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
} }
else if (strcmp(interface, "wl_shell") == 0) { else if (strcmp(interface, "xdg_wm_base") == 0) {
xwl_screen->shell = xwl_screen->xdg_wm_base =
wl_registry_bind(registry, id, &wl_shell_interface, 1); wl_registry_bind(registry, id, &xdg_wm_base_interface, 1);
xdg_wm_base_add_listener(xwl_screen->xdg_wm_base,
&xdg_wm_base_listener,
NULL);
} }
else if (strcmp(interface, "wl_output") == 0 && version >= 2) { else if (strcmp(interface, "wl_output") == 0 && version >= 2) {
if (xwl_output_create(xwl_screen, id)) if (xwl_output_create(xwl_screen, id))
......
...@@ -79,7 +79,7 @@ struct xwl_screen { ...@@ -79,7 +79,7 @@ struct xwl_screen {
struct wl_compositor *compositor; struct wl_compositor *compositor;
struct zwp_tablet_manager_v2 *tablet_manager; struct zwp_tablet_manager_v2 *tablet_manager;
struct wl_shm *shm; struct wl_shm *shm;
struct wl_shell *shell; struct xdg_wm_base *xdg_wm_base;
struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
struct zwp_pointer_constraints_v1 *pointer_constraints; struct zwp_pointer_constraints_v1 *pointer_constraints;
struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab; struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab;
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "xwayland-shm.h" #include "xwayland-shm.h"
#include "viewporter-client-protocol.h" #include "viewporter-client-protocol.h"
#include "xdg-shell-client-protocol.h"
static DevPrivateKeyRec xwl_window_private_key; static DevPrivateKeyRec xwl_window_private_key;
static DevPrivateKeyRec xwl_damage_private_key; static DevPrivateKeyRec xwl_damage_private_key;
...@@ -401,28 +402,15 @@ send_surface_id_event(struct xwl_window *xwl_window) ...@@ -401,28 +402,15 @@ send_surface_id_event(struct xwl_window *xwl_window)
} }
static void static void
shell_surface_ping(void *data, xdg_surface_handle_configure(void *data,
struct wl_shell_surface *shell_surface, uint32_t serial) struct xdg_surface *xdg_surface,
uint32_t serial)
{ {
wl_shell_surface_pong(shell_surface, serial); xdg_surface_ack_configure(xdg_surface, serial);
} }
static void static const struct xdg_surface_listener xdg_surface_listener = {
shell_surface_configure(void *data, xdg_surface_handle_configure,
struct wl_shell_surface *wl_shell_surface,
uint32_t edges, int32_t width, int32_t height)
{
}
static void
shell_surface_popup_done(void *data, struct wl_shell_surface *wl_shell_surface)
{
}
static const struct wl_shell_surface_listener shell_surface_listener = {
shell_surface_ping,
shell_surface_configure,
shell_surface_popup_done
}; };
static Bool static Bool
...@@ -461,17 +449,19 @@ ensure_surface_for_window(WindowPtr window) ...@@ -461,17 +449,19 @@ ensure_surface_for_window(WindowPtr window)
} }
if (!xwl_screen->rootless) { if (!xwl_screen->rootless) {
xwl_window->shell_surface = xwl_window->xdg_surface =
wl_shell_get_shell_surface(xwl_screen->shell, xwl_window->surface); xdg_wm_base_get_xdg_surface(xwl_screen->xdg_wm_base, xwl_window->surface);
if (xwl_window->shell_surface == NULL) { if (xwl_window->xdg_surface == NULL) {
ErrorF("Failed creating shell surface\n"); ErrorF("Failed creating xdg_wm_base xdg_surface\n");
goto err_surf; goto err_surf;
} }
wl_shell_surface_add_listener(xwl_window->shell_surface, xdg_surface_add_listener(xwl_window->xdg_surface,
&shell_surface_listener, xwl_window); &xdg_surface_listener, xwl_window);
xdg_surface_get_toplevel(xwl_window->xdg_surface);
wl_shell_surface_set_toplevel(xwl_window->shell_surface); wl_surface_commit(xwl_window->surface);
region = wl_compositor_create_region(xwl_screen->compositor); region = wl_compositor_create_region(xwl_screen->compositor);
if (region == NULL) { if (region == NULL) {
...@@ -520,8 +510,8 @@ ensure_surface_for_window(WindowPtr window) ...@@ -520,8 +510,8 @@ ensure_surface_for_window(WindowPtr window)
return TRUE; return TRUE;
err_surf: err_surf:
if (xwl_window->shell_surface) if (xwl_window->xdg_surface)
wl_shell_surface_destroy(xwl_window->shell_surface); xdg_surface_destroy(xwl_window->xdg_surface);
wl_surface_destroy(xwl_window->surface); wl_surface_destroy(xwl_window->surface);
err: err:
free(xwl_window); free(xwl_window);
......
...@@ -42,7 +42,7 @@ struct xwl_window { ...@@ -42,7 +42,7 @@ struct xwl_window {
struct wl_surface *surface; struct wl_surface *surface;
struct wp_viewport *viewport; struct wp_viewport *viewport;
float scale_x, scale_y; float scale_x, scale_y;
struct wl_shell_surface *shell_surface; struct xdg_surface *xdg_surface;
WindowPtr window; WindowPtr window;
struct xorg_list link_damage; struct xorg_list link_damage;
struct xorg_list link_window; struct xorg_list link_window;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment