1const std = @import("std");2const log = std.log;34const wl = @import("wayland").client.wl;56const Bar = @import("Bar.zig");7const Tags = @import("Tags.zig");8const Seat = @import("Seat.zig");9pub const Monitor = @This();1011const state = &@import("root").state;1213output: *wl.Output,14globalName: u32,15scale: i32,1617bar: ?*Bar,18tags: *Tags,1920pub fn create(registry: *wl.Registry, name: u32) !*Monitor {21 const self = try state.gpa.create(Monitor);22 self.output = try registry.bind(name, wl.Output, 4);23 self.globalName = name;24 self.scale = 1;2526 self.bar = null;27 self.tags = try Tags.create(self);2829 self.output.setListener(*Monitor, listener, self);30 return self;31}3233pub fn destroy(self: *Monitor) void {34 if (self.bar) |bar| {35 bar.destroy();36 }37 self.tags.destroy();38 state.gpa.destroy(self);39}4041pub fn confBar(self: *Monitor) ?*Bar {42 if (self.bar) |bar| {43 if (bar.configured) {44 return bar;45 }46 }4748 return null;49}5051fn listener(_: *wl.Output, event: wl.Output.Event, monitor: *Monitor) void {52 switch (event) {53 .scale => |scale| {54 monitor.scale = scale.factor;55 },56 .geometry => {},57 .mode => {},58 .done => {59 if (monitor.bar) |_| {60 return;61 }62 monitor.bar = Bar.create(monitor) catch |err| {63 log.err("cannot create bar for monitor {}: {s}",64 .{monitor.globalName, @errorName(err)});65 return;66 };67 },68 }69}