From 9d27923d6a5efbcf39cb74ca1f00d5caad7bd34d Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Wed, 25 Aug 2021 12:50:29 +0000 Subject: [PATCH] x11-wm/mutter: expose nested Wayland support PR: 258042 Approved by: ? --- x11-wm/mutter/Makefile | 14 +- x11-wm/mutter/files/patch-meson.build | 12 +- x11-wm/mutter/files/patch-no-abstract | 176 ++++++++++++++++++ .../files/patch-src_backends_meta-egl.c | 81 -------- .../files/patch-src_core_meta-context-main.c | 17 ++ x11-wm/mutter/files/patch-src_meson.build | 16 ++ .../patch-src_wayland_meta-wayland-buffer.c | 56 ++++++ .../patch-src_wayland_meta-wayland-dma-buf.c | 43 +++++ x11-wm/mutter/pkg-plist | 3 + 9 files changed, 333 insertions(+), 85 deletions(-) create mode 100644 x11-wm/mutter/files/patch-no-abstract delete mode 100644 x11-wm/mutter/files/patch-src_backends_meta-egl.c create mode 100644 x11-wm/mutter/files/patch-src_core_meta-context-main.c create mode 100644 x11-wm/mutter/files/patch-src_meson.build create mode 100644 x11-wm/mutter/files/patch-src_wayland_meta-wayland-buffer.c create mode 100644 x11-wm/mutter/files/patch-src_wayland_meta-wayland-dma-buf.c diff --git a/x11-wm/mutter/Makefile b/x11-wm/mutter/Makefile index a1cafb008b2e..1057acde636c 100644 --- a/x11-wm/mutter/Makefile +++ b/x11-wm/mutter/Makefile @@ -2,6 +2,7 @@ PORTNAME= mutter PORTVERSION= 41.0 +PORTREVISION= 1 CATEGORIES= x11-wm MASTER_SITES= GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+)\..*/\1/} DIST_SUBDIR= gnome @@ -52,8 +53,7 @@ MESON_ARGS= -Dlibwacom=false \ -Dsm=true \ -Dsystemd=false \ -Dtests=false \ - -Dudev=false \ - -Dwayland=false + -Dudev=false # Required by embedded cogl/clutter forks. MESON_ARGS+= -Dgles2_libname=libGLESv2 \ @@ -65,4 +65,14 @@ MESON_ARGS+= -Dremote_desktop=false GLIB_SCHEMAS= org.gnome.mutter.gschema.xml \ org.gnome.mutter.wayland.gschema.xml +OPTIONS_DEFINE= WAYLAND +OPTIONS_DEFAULT=WAYLAND +OPTIONS_SUB= yes + +WAYLAND_BUILD_DEPENDS= xwayland-devel>0:x11-servers/xwayland-devel +WAYLAND_LIB_DEPENDS= libwayland-server.so:graphics/wayland +WAYLAND_RUN_DEPENDS= xwayland-devel>0:x11-servers/xwayland-devel +WAYLAND_USE= XORG=xau +WAYLAND_MESON_TRUE= wayland + .include diff --git a/x11-wm/mutter/files/patch-meson.build b/x11-wm/mutter/files/patch-meson.build index aaca6af54b4b..53c227ea26f0 100644 --- a/x11-wm/mutter/files/patch-meson.build +++ b/x11-wm/mutter/files/patch-meson.build @@ -1,6 +1,14 @@ ---- meson.build.orig 2020-09-28 15:41:47 UTC +--- meson.build.orig 2020-09-07 19:18:23 UTC +++ meson.build -@@ -320,22 +320,6 @@ if buildtype != 'plain' +@@ -167,6 +167,7 @@ endif + + have_wayland = get_option('wayland') + if have_wayland ++ libdrm_dep = dependency('libdrm') + wayland_server_dep = dependency('wayland-server', version: wayland_server_req) + wayland_client_dep = dependency('wayland-client', version: wayland_server_req) + wayland_protocols_dep = dependency('wayland-protocols', +@@ -320,22 +321,6 @@ if buildtype != 'plain' '-Wmissing-include-dirs', '-Wlogical-op', '-Wignored-qualifiers', diff --git a/x11-wm/mutter/files/patch-no-abstract b/x11-wm/mutter/files/patch-no-abstract new file mode 100644 index 000000000000..37dc6fc67c27 --- /dev/null +++ b/x11-wm/mutter/files/patch-no-abstract @@ -0,0 +1,176 @@ +https://gitlab.gnome.org/GNOME/mutter/-/commit/e2123768f635 + +mutter-WARNING **: failed to bind to @/tmp/.X11-unix/X0: No such file or directory + +--- src/wayland/meta-wayland-private.h.orig 2021-09-19 13:37:45 UTC ++++ src/wayland/meta-wayland-private.h +@@ -47,7 +47,6 @@ typedef struct + { + int display_index; + char *lock_file; +- int abstract_fd; + int unix_fd; + char *name; + } MetaXWaylandConnection; +@@ -57,7 +56,6 @@ typedef struct + MetaXWaylandConnection private_connection; + MetaXWaylandConnection public_connection; + +- guint abstract_fd_watch_id; + guint unix_fd_watch_id; + + guint xserver_grace_period_id; +--- src/wayland/meta-xwayland.c.orig 2021-09-19 13:37:45 UTC ++++ src/wayland/meta-xwayland.c +@@ -447,47 +447,6 @@ create_lock_file (int display, + } + + static int +-bind_to_abstract_socket (int display, +- GError **error) +-{ +- struct sockaddr_un addr; +- socklen_t size, name_size; +- int fd; +- +- fd = socket (PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0); +- if (fd < 0) +- { +- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), +- "Failed to create socket: %s", g_strerror (errno)); +- return -1; +- } +- +- addr.sun_family = AF_LOCAL; +- name_size = snprintf (addr.sun_path, sizeof addr.sun_path, +- "%c%s%d", 0, X11_TMP_UNIX_PATH, display); +- size = offsetof (struct sockaddr_un, sun_path) + name_size; +- if (bind (fd, (struct sockaddr *) &addr, size) < 0) +- { +- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), +- "Failed to bind to %s: %s", +- addr.sun_path + 1, g_strerror (errno)); +- close (fd); +- return -1; +- } +- +- if (listen (fd, 1) < 0) +- { +- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), +- "Failed to listen to %s: %s", +- addr.sun_path + 1, g_strerror (errno)); +- close (fd); +- return -1; +- } +- +- return fd; +-} +- +-static int + bind_to_unix_socket (int display, + GError **error) + { +@@ -719,24 +678,17 @@ ensure_x11_unix_dir (GError **error) + static gboolean + open_display_sockets (MetaXWaylandManager *manager, + int display_index, +- int *abstract_fd_out, + int *unix_fd_out, + GError **error) + { +- int abstract_fd, unix_fd; ++ int unix_fd; + +- abstract_fd = bind_to_abstract_socket (display_index, error); +- if (abstract_fd < 0) +- return FALSE; +- + unix_fd = bind_to_unix_socket (display_index, error); + if (unix_fd < 0) + { +- close (abstract_fd); + return FALSE; + } + +- *abstract_fd_out = abstract_fd; + *unix_fd_out = unix_fd; + + return TRUE; +@@ -767,7 +719,6 @@ choose_xdisplay (MetaXWaylandManager *manager, + } + + if (!open_display_sockets (manager, *display, +- &connection->abstract_fd, + &connection->unix_fd, + &local_error)) + { +@@ -992,13 +943,11 @@ meta_xwayland_start_xserver (MetaXWaylandManager *mana + g_subprocess_launcher_take_fd (launcher, + steal_fd (&xwayland_client_fd[1]), 3); + g_subprocess_launcher_take_fd (launcher, +- steal_fd (&manager->public_connection.abstract_fd), 4); ++ steal_fd (&manager->public_connection.unix_fd), 4); + g_subprocess_launcher_take_fd (launcher, +- steal_fd (&manager->public_connection.unix_fd), 5); ++ steal_fd (&displayfd[1]), 5); + g_subprocess_launcher_take_fd (launcher, +- steal_fd (&displayfd[1]), 6); +- g_subprocess_launcher_take_fd (launcher, +- steal_fd (&manager->private_connection.abstract_fd), 7); ++ steal_fd (&manager->private_connection.unix_fd), 6); + + g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE); + +@@ -1013,16 +962,14 @@ meta_xwayland_start_xserver (MetaXWaylandManager *mana + args[i++] = manager->auth_file; + args[i++] = XWAYLAND_LISTENFD; + args[i++] = "4"; +- args[i++] = XWAYLAND_LISTENFD; +- args[i++] = "5"; + args[i++] = "-displayfd"; +- args[i++] = "6"; ++ args[i++] = "5"; + #ifdef HAVE_XWAYLAND_INITFD + args[i++] = "-initfd"; +- args[i++] = "7"; ++ args[i++] = "6"; + #else + args[i++] = XWAYLAND_LISTENFD; +- args[i++] = "7"; ++ args[i++] = "6"; + #endif + for (j = 0; j < G_N_ELEMENTS (x11_extension_names); j++) + { +@@ -1084,7 +1031,6 @@ xdisplay_connection_activity_cb (gint fd, + (GAsyncReadyCallback) on_init_x11_cb, NULL); + + /* Stop watching both file descriptors */ +- g_clear_handle_id (&manager->abstract_fd_watch_id, g_source_remove); + g_clear_handle_id (&manager->unix_fd_watch_id, g_source_remove); + + return G_SOURCE_REMOVE; +@@ -1176,14 +1122,12 @@ meta_xwayland_init (MetaXWaylandManager *manager, + { + if (!open_display_sockets (manager, + manager->public_connection.display_index, +- &manager->public_connection.abstract_fd, + &manager->public_connection.unix_fd, + error)) + return FALSE; + + if (!open_display_sockets (manager, + manager->private_connection.display_index, +- &manager->private_connection.abstract_fd, + &manager->private_connection.unix_fd, + error)) + return FALSE; +@@ -1198,9 +1142,6 @@ meta_xwayland_init (MetaXWaylandManager *manager, + + if (policy == META_X11_DISPLAY_POLICY_ON_DEMAND) + { +- manager->abstract_fd_watch_id = +- g_unix_fd_add (manager->public_connection.abstract_fd, G_IO_IN, +- xdisplay_connection_activity_cb, manager); + manager->unix_fd_watch_id = + g_unix_fd_add (manager->public_connection.unix_fd, G_IO_IN, + xdisplay_connection_activity_cb, manager); diff --git a/x11-wm/mutter/files/patch-src_backends_meta-egl.c b/x11-wm/mutter/files/patch-src_backends_meta-egl.c deleted file mode 100644 index 9a63abd4c487..000000000000 --- a/x11-wm/mutter/files/patch-src_backends_meta-egl.c +++ /dev/null @@ -1,81 +0,0 @@ -$OpenBSD: patch-src_backends_meta-egl_c,v 1.2 2018/04/26 09:19:27 jasper Exp $ - -Revert non-portable portion of: -From b7b5fb293d1de3af9e533f2063749fde7a790945 Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Tue, 11 Jul 2017 16:03:26 +0100 -Subject: [PATCH] wayland: Add zwp_linux_dmabuf_v1 support - -Index: src/backends/meta-egl.c ---- src/backends/meta-egl.c.orig 2020-09-07 19:18:23 UTC -+++ src/backends/meta-egl.c -@@ -69,8 +69,6 @@ struct _MetaEgl - PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR; - PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV; - -- PFNEGLQUERYDMABUFFORMATSEXTPROC eglQueryDmaBufFormatsEXT; -- PFNEGLQUERYDMABUFMODIFIERSEXTPROC eglQueryDmaBufModifiersEXT; - }; - - G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT) -@@ -1019,51 +1017,6 @@ meta_egl_stream_consumer_acquire (MetaEgl *egl, - return TRUE; - } - --gboolean --meta_egl_query_dma_buf_formats (MetaEgl *egl, -- EGLDisplay display, -- EGLint max_formats, -- EGLint *formats, -- EGLint *num_formats, -- GError **error) --{ -- if (!is_egl_proc_valid (egl->eglQueryDmaBufFormatsEXT, error)) -- return FALSE; -- -- if (!egl->eglQueryDmaBufFormatsEXT (display, max_formats, formats, -- num_formats)) -- { -- set_egl_error (error); -- return FALSE; -- } -- -- return TRUE; --} -- --gboolean --meta_egl_query_dma_buf_modifiers (MetaEgl *egl, -- EGLDisplay display, -- EGLint format, -- EGLint max_modifiers, -- EGLuint64KHR *modifiers, -- EGLBoolean *external_only, -- EGLint *num_modifiers, -- GError **error) --{ -- if (!is_egl_proc_valid (egl->eglQueryDmaBufModifiersEXT, error)) -- return FALSE; -- -- if (!egl->eglQueryDmaBufModifiersEXT (display, format, max_modifiers, -- modifiers, external_only, -- num_modifiers)) -- { -- set_egl_error (error); -- return FALSE; -- } -- -- return TRUE; --} -- - #define GET_EGL_PROC_ADDR(proc) \ - egl->proc = (void *) eglGetProcAddress (#proc); - -@@ -1100,8 +1053,6 @@ meta_egl_constructed (GObject *object) - GET_EGL_PROC_ADDR (eglStreamConsumerAcquireKHR); - GET_EGL_PROC_ADDR (eglStreamConsumerAcquireAttribNV); - -- GET_EGL_PROC_ADDR (eglQueryDmaBufFormatsEXT); -- GET_EGL_PROC_ADDR (eglQueryDmaBufModifiersEXT); - } - - #undef GET_EGL_PROC_ADDR diff --git a/x11-wm/mutter/files/patch-src_core_meta-context-main.c b/x11-wm/mutter/files/patch-src_core_meta-context-main.c new file mode 100644 index 000000000000..773b81cea09b --- /dev/null +++ b/x11-wm/mutter/files/patch-src_core_meta-context-main.c @@ -0,0 +1,17 @@ +ld: error: undefined symbol: sd_pid_get_user_unit +>>> referenced by meta-context-main.c +>>> src/libmutter-9.so.0.0.0.p/core_meta-context-main.c.o:(meta_context_main_get_x11_display_policy) + +--- src/core/meta-context-main.c.orig 2021-09-19 13:37:45 UTC ++++ src/core/meta-context-main.c +@@ -318,8 +318,10 @@ meta_context_main_get_x11_display_policy (MetaContext + #ifdef HAVE_WAYLAND + if (context_main->options.no_x11) + return META_X11_DISPLAY_POLICY_DISABLED; ++#ifdef HAVE_LIBSYSTEMD + else if (sd_pid_get_user_unit (0, &unit) < 0) + return META_X11_DISPLAY_POLICY_MANDATORY; ++#endif + else + return META_X11_DISPLAY_POLICY_ON_DEMAND; + #else /* HAVE_WAYLAND */ diff --git a/x11-wm/mutter/files/patch-src_meson.build b/x11-wm/mutter/files/patch-src_meson.build new file mode 100644 index 000000000000..7a4a85024ee7 --- /dev/null +++ b/x11-wm/mutter/files/patch-src_meson.build @@ -0,0 +1,16 @@ +../src/wayland/meta-wayland-buffer.c:53:10: fatal error: 'drm_fourcc.h' file not found +#include + ^~~~~~~~~~~~~~ + +--- src/meson.build.orig 2020-09-07 19:18:23 UTC ++++ src/meson.build +@@ -113,6 +113,9 @@ if have_x11 + endif + + if have_wayland ++ mutter_lib_deps += [ ++ libdrm_dep, # drm_fourcc.h on non-Linux ++ ] + mutter_pkg_deps += [ + wayland_server_dep, + ] diff --git a/x11-wm/mutter/files/patch-src_wayland_meta-wayland-buffer.c b/x11-wm/mutter/files/patch-src_wayland_meta-wayland-buffer.c new file mode 100644 index 000000000000..0ce436e6206d --- /dev/null +++ b/x11-wm/mutter/files/patch-src_wayland_meta-wayland-buffer.c @@ -0,0 +1,56 @@ +../src/wayland/meta-wayland-buffer.c:288:23: error: unknown type name 'MetaDrmFormatBuf' +shm_format_to_string (MetaDrmFormatBuf *format_buf, + ^ +../src/wayland/meta-wayland-buffer.c:302:16: warning: implicit declaration of function 'meta_drm_format_to_string' is invalid in C99 [-Wimplicit-function-declaration] + result = meta_drm_format_to_string (format_buf, shm_format); + ^ +../src/wayland/meta-wayland-buffer.c:323:3: error: use of undeclared identifier 'MetaDrmFormatBuf' + MetaDrmFormatBuf format_buf; + ^ +../src/wayland/meta-wayland-buffer.c:339:38: error: use of undeclared identifier 'format_buf' + shm_format_to_string (&format_buf, + ^ + +--- src/wayland/meta-wayland-buffer.c.orig 2021-09-19 13:37:45 UTC ++++ src/wayland/meta-wayland-buffer.c +@@ -284,6 +284,7 @@ shm_buffer_get_cogl_pixel_format (struct wl_shm_buffer + return TRUE; + } + ++#ifdef HAVE_NATIVE_BACKEND + static const char * + shm_format_to_string (MetaDrmFormatBuf *format_buf, + uint32_t shm_format) +@@ -305,6 +306,7 @@ shm_format_to_string (MetaDrmFormatBuf *format_buf, + + return result; + } ++#endif + + static gboolean + shm_buffer_attach (MetaWaylandBuffer *buffer, +@@ -320,7 +322,9 @@ shm_buffer_attach (MetaWaylandBuffer *buffer, + CoglTextureComponents components; + CoglBitmap *bitmap; + CoglTexture *new_texture; ++#ifdef HAVE_NATIVE_BACKEND + MetaDrmFormatBuf format_buf; ++#endif + + shm_buffer = wl_shm_buffer_get (buffer->resource); + stride = wl_shm_buffer_get_stride (shm_buffer); +@@ -333,12 +337,14 @@ shm_buffer_attach (MetaWaylandBuffer *buffer, + return FALSE; + } + ++#ifdef HAVE_NATIVE_BACKEND + meta_topic (META_DEBUG_WAYLAND, + "[wl-shm] wl_buffer@%u wl_shm_format %s -> CoglPixelFormat %s", + wl_resource_get_id (meta_wayland_buffer_get_resource (buffer)), + shm_format_to_string (&format_buf, + wl_shm_buffer_get_format (shm_buffer)), + cogl_pixel_format_to_string (format)); ++#endif + + if (*texture && + cogl_texture_get_width (*texture) == width && diff --git a/x11-wm/mutter/files/patch-src_wayland_meta-wayland-dma-buf.c b/x11-wm/mutter/files/patch-src_wayland_meta-wayland-dma-buf.c new file mode 100644 index 000000000000..9f4d34826668 --- /dev/null +++ b/x11-wm/mutter/files/patch-src_wayland_meta-wayland-dma-buf.c @@ -0,0 +1,43 @@ +../src/wayland/meta-wayland-dma-buf.c:101:3: error: use of undeclared identifier 'MetaDrmFormatBuf' + MetaDrmFormatBuf format_buf; + ^ +../src/wayland/meta-wayland-dma-buf.c:151:15: warning: implicit declaration of function 'meta_drm_format_to_string' is invalid in C99 [-Wimplicit-function-declaration] + meta_drm_format_to_string (&format_buf, dma_buf->drm_format), + ^ +../src/wayland/meta-wayland-dma-buf.c:151:43: error: use of undeclared identifier 'format_buf'; did you mean 'dma_buf'? + meta_drm_format_to_string (&format_buf, dma_buf->drm_format), + ^~~~~~~~~~ + dma_buf +../src/meta/util.h:190:39: note: expanded from macro 'meta_topic' + meta_topic_real (debug_topic, __VA_ARGS__); \ + ^ +../src/wayland/meta-wayland-dma-buf.c:94:28: note: 'dma_buf' declared here + MetaWaylandDmaBufBuffer *dma_buf = buffer->dma_buf.dma_buf; + ^ + +--- src/wayland/meta-wayland-dma-buf.c.orig 2021-09-19 13:37:45 UTC ++++ src/wayland/meta-wayland-dma-buf.c +@@ -98,7 +98,9 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffe + EGLImageKHR egl_image; + CoglEglImageFlags flags; + CoglTexture2D *texture; ++#ifdef HAVE_NATIVE_BACKEND + MetaDrmFormatBuf format_buf; ++#endif + + if (buffer->dma_buf.texture) + return TRUE; +@@ -145,11 +147,13 @@ meta_wayland_dma_buf_realize_texture (MetaWaylandBuffe + return FALSE; + } + ++#ifdef HAVE_NATIVE_BACKEND + meta_topic (META_DEBUG_WAYLAND, + "[dma-buf] wl_buffer@%u DRM format %s -> CoglPixelFormat %s", + wl_resource_get_id (meta_wayland_buffer_get_resource (buffer)), + meta_drm_format_to_string (&format_buf, dma_buf->drm_format), + cogl_pixel_format_to_string (cogl_format)); ++#endif + + for (n_planes = 0; n_planes < META_WAYLAND_DMA_BUF_MAX_FDS; n_planes++) + { diff --git a/x11-wm/mutter/pkg-plist b/x11-wm/mutter/pkg-plist index e518f92bc7ca..92914ccf2377 100644 --- a/x11-wm/mutter/pkg-plist +++ b/x11-wm/mutter/pkg-plist @@ -149,6 +149,7 @@ include/mutter-9/cogl/cogl/cogl-texture.h include/mutter-9/cogl/cogl/cogl-trace.h include/mutter-9/cogl/cogl/cogl-types.h include/mutter-9/cogl/cogl/cogl-version.h +%%WAYLAND%%include/mutter-9/cogl/cogl/cogl-wayland-server.h include/mutter-9/cogl/cogl/cogl-xlib-renderer.h include/mutter-9/cogl/cogl/cogl-xlib.h include/mutter-9/cogl/cogl/cogl.h @@ -200,6 +201,7 @@ include/mutter-9/meta/meta-shaped-texture.h include/mutter-9/meta/meta-sound-player.h include/mutter-9/meta/meta-stage.h include/mutter-9/meta/meta-startup-notification.h +%%WAYLAND%%include/mutter-9/meta/meta-wayland-client.h include/mutter-9/meta/meta-window-actor.h include/mutter-9/meta/meta-window-group.h include/mutter-9/meta/meta-window-shape.h @@ -245,6 +247,7 @@ share/GConf/gsettings/mutter-schemas.convert share/applications/mutter.desktop share/gnome-control-center/keybindings/50-mutter-navigation.xml share/gnome-control-center/keybindings/50-mutter-system.xml +%%WAYLAND%%share/gnome-control-center/keybindings/50-mutter-wayland.xml share/gnome-control-center/keybindings/50-mutter-windows.xml share/locale/am/LC_MESSAGES/mutter.mo share/locale/ar/LC_MESSAGES/mutter.mo