git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit510e93b7d5751701b15c33950aac7e4fe996c20d
parent1b91d2bb0b
authorIsaac Freund <[email protected]>
date2024-03-02 17:37
river: only expose xwayland_shell_v1 to Xwayland

This is a private protocol only intended for the Xwayland client.

 river/Server.zig | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/river/Server.zig b/river/Server.zig
index 4af027d..b3c47f1 100644
--- a/river/Server.zig
+++ b/river/Server.zig
@@ -168,6 +168,8 @@ pub fn init(self: *Self, runtime_xwayland: bool) !void {
     _ = try wlr.SinglePixelBufferManagerV1.create(self.wl_server);
     _ = try wlr.Viewporter.create(self.wl_server);
     _ = try wlr.FractionalScaleManagerV1.create(self.wl_server, 1);
+
+    self.wl_server.setGlobalFilter(*Self, globalFilter, self);
 }
 
 /// Free allocated memory and clean up. Note: order is important here
@@ -222,6 +224,22 @@ pub fn start(self: Self) !void {
     }
 }
 
+fn globalFilter(client: *const wl.Client, global: *const wl.Global, self: *Self) bool {
+    // Only expose the xwalyand_shell_v1 global to the Xwayland process.
+    if (build_options.xwayland) {
+        if (self.xwayland) |xwayland| {
+            if (global == xwayland.shell_v1.global) {
+                if (xwayland.server) |server| {
+                    return client == server.client;
+                }
+                return false;
+            }
+        }
+    }
+
+    return true;
+}
+
 /// Handle SIGINT and SIGTERM by gracefully stopping the server
 fn terminate(_: c_int, wl_server: *wl.Server) c_int {
     wl_server.terminate();