diff --git a/src/output.zig b/src/output.zig index ea9d62f..8001cb9 100644 --- a/src/output.zig +++ b/src/output.zig @@ -1,6 +1,64 @@ const std = @import("std"); +const posix = std.posix; +const gpa = std.heap.c_allocator; + const wl = @import("wayland").server.wl; const wlr = @import("wlroots"); -pub const Ouput = struct { -} +const Server = @import("server.zig").Server; + +pub const Output = struct { + server: *Server, + wlr_output: *wlr.Output, + + frame: wl.Listener(*wlr.Output) = .init(handleFrame), + request_state: wl.Listener(*wlr.Output.event.RequestState) = .init(handleRequestState), + destroy: wl.Listener(*wlr.Output) = .init(handleDestroy), + + // The wlr.Output should be destroyed by the caller on failure to trigger cleanup. + pub fn create(server: *Server, wlr_output: *wlr.Output) !void { + const output = try gpa.create(Output); + + output.* = .{ + .server = server, + .wlr_output = wlr_output, + }; + wlr_output.events.frame.add(&output.frame); + wlr_output.events.request_state.add(&output.request_state); + wlr_output.events.destroy.add(&output.destroy); + + const layout_output = try server.output_layout.addAuto(wlr_output); + + const scene_output = try server.scene.createSceneOutput(wlr_output); + server.scene_output_layout.addOutput(layout_output, scene_output); + } + + pub fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { + const output: *Output = @fieldParentPtr("frame", listener); + + const scene_output = output.server.scene.getSceneOutput(output.wlr_output).?; + _ = scene_output.commit(null); + + var now = posix.clock_gettime(posix.CLOCK.MONOTONIC) catch @panic("CLOCK_MONOTONIC not supported"); + scene_output.sendFrameDone(&now); + } + + pub fn handleRequestState( + listener: *wl.Listener(*wlr.Output.event.RequestState), + event: *wlr.Output.event.RequestState, + ) void { + const output: *Output = @fieldParentPtr("request_state", listener); + + _ = output.wlr_output.commitState(event.state); + } + + pub fn handleDestroy(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { + const output: *Output = @fieldParentPtr("destroy", listener); + + output.frame.link.remove(); + output.request_state.link.remove(); + output.destroy.link.remove(); + + gpa.destroy(output); + } +}; diff --git a/src/server.zig b/src/server.zig index 0e9b997..85b5e76 100644 --- a/src/server.zig +++ b/src/server.zig @@ -1,66 +1,10 @@ const std = @import("std"); -const posix = std.posix; +const gpa = std.heap.c_allocator; const wl = @import("wayland").server.wl; const wlr = @import("wlroots"); -const gpa = std.heap.c_allocator; - -const Output = struct { - server: *Server, - wlr_output: *wlr.Output, - - frame: wl.Listener(*wlr.Output) = .init(handleFrame), - request_state: wl.Listener(*wlr.Output.event.RequestState) = .init(handleRequestState), - destroy: wl.Listener(*wlr.Output) = .init(handleDestroy), - - // The wlr.Output should be destroyed by the caller on failure to trigger cleanup. - fn create(server: *Server, wlr_output: *wlr.Output) !void { - const output = try gpa.create(Output); - - output.* = .{ - .server = server, - .wlr_output = wlr_output, - }; - wlr_output.events.frame.add(&output.frame); - wlr_output.events.request_state.add(&output.request_state); - wlr_output.events.destroy.add(&output.destroy); - - const layout_output = try server.output_layout.addAuto(wlr_output); - - const scene_output = try server.scene.createSceneOutput(wlr_output); - server.scene_output_layout.addOutput(layout_output, scene_output); - } - - fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { - const output: *Output = @fieldParentPtr("frame", listener); - - const scene_output = output.server.scene.getSceneOutput(output.wlr_output).?; - _ = scene_output.commit(null); - - var now = posix.clock_gettime(posix.CLOCK.MONOTONIC) catch @panic("CLOCK_MONOTONIC not supported"); - scene_output.sendFrameDone(&now); - } - - fn handleRequestState( - listener: *wl.Listener(*wlr.Output.event.RequestState), - event: *wlr.Output.event.RequestState, - ) void { - const output: *Output = @fieldParentPtr("request_state", listener); - - _ = output.wlr_output.commitState(event.state); - } - - fn handleDestroy(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { - const output: *Output = @fieldParentPtr("destroy", listener); - - output.frame.link.remove(); - output.request_state.link.remove(); - output.destroy.link.remove(); - - gpa.destroy(output); - } -}; +const Output = @import("output.zig").Output; pub const Server = struct { allocator: *wlr.Allocator,