const std = @import("std"); const wayland = @import("../../root.zig"); const wl = wayland.wl; const Format = wl.Shm.Format; const AnonymousFile = wl.Shm.AnonymousFile; const Self = @This(); const log = std.log.scoped(.@"wl.shm.pool"); pub const Events = wayland.EventSet(@This(), .{}); pub const Request = union(enum) { create_buffer: struct { wayland.Object.Ref, u32, u32, u32, u32, Format }, destroy: void, resize: struct { u32 }, }; handle: wayland.Object.Ref = .null, init: wayland.Object.interface.Init(Self) = .{}, file: AnonymousFile, buffer: []u8, pub fn deinit(self: *Self, ctx: wayland.Context) void { self.file.close(); std.posix.munmap(@alignCast(self.buffer)); ctx.display.registry.disable_object(self.handle); ctx.display.request(self, .{ .destroy = {} }) catch |e| { log.err("error on deinit: {}", .{e}); }; self.* = undefined; } pub fn create_buffer( self: *Self, ctx: wayland.Context, offset: u32, width: u32, height: u32, comptime format: Format, ) !*wl.Buffer(format) { const stride = width * format.bytes_per_pixel(); const data = self.buffer[offset..offset + stride * height]; const buffer = try ctx.allocator.create(wl.Buffer(format)); errdefer ctx.allocator.destroy(buffer); try buffer.init.with(ctx, .{ .width = width, .height = height, .data = @alignCast(@ptrCast(data)), }); try ctx.display.request( self, .{ .create_buffer = .{ buffer.handle, @truncate(offset), @truncate(width), @truncate(height), @truncate(stride), format, } } ); return buffer; }