diff options
Diffstat (limited to 'src/wl/shm/pool.zig')
| -rw-r--r-- | src/wl/shm/pool.zig | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/wl/shm/pool.zig b/src/wl/shm/pool.zig index dc30d1b..1f42a17 100644 --- a/src/wl/shm/pool.zig +++ b/src/wl/shm/pool.zig @@ -1,5 +1,10 @@ +const std = @import("std"); const wayland = @import("../../root.zig"); -const Format = @import("root.zig").Format; +const wl = wayland.wl; +const Format = wl.Shm.Format; +const AnonymousFile = wl.Shm.AnonymousFile; + +const Self = @This(); pub const Events = wayland.EventSet(@This(), .{}); pub const Requests = union(enum) { @@ -7,3 +12,33 @@ pub const Requests = union(enum) { destroy: struct {}, resize: struct { u32 }, }; + +handle: wayland.Object.Ref, +file: AnonymousFile, +buffer: []u8, + +pub fn init( + self: *Self, + ctx: *const wayland.Context, + size: usize, +) !void { + var file = try AnonymousFile.init_random(); + errdefer file.close(); + try file.truncate(size); + + self.* = .{ + .handle = try ctx.display.registry.add_object( + ctx.allocator, + wayland.Object.from_self(self), + ), + .file = file, + .buffer = try file.mmap(), + }; +} + +pub fn deinit(self: *Self, ctx: *const wayland.Context) void { + self.file.close(); + std.posix.munmap(@alignCast(self.buffer)); + ctx.display.registry.disable_object(self.handle); + self.* = undefined; +} |