~andreafeletto/levee

35cde045b685e8667f0ddabd855fe041781d6e6a — Andrea Feletto 1 year, 4 months ago 520ceae
use single pixel buffer protocol for background
3 files changed, 18 insertions(+), 19 deletions(-)

M build.zig
M src/Bar.zig
M src/Wayland.zig
M build.zig => build.zig +2 -0
@@ 14,6 14,7 @@ pub fn build(b: *std.build.Builder) void {
    const scanner = ScanProtocolsStep.create(b);
    scanner.addSystemProtocol("stable/xdg-shell/xdg-shell.xml");
    scanner.addSystemProtocol("stable/viewporter/viewporter.xml");
    scanner.addSystemProtocol("staging/single-pixel-buffer/single-pixel-buffer-v1.xml");
    scanner.addProtocolPath("protocol/wlr-layer-shell-unstable-v1.xml");
    scanner.addProtocolPath("protocol/river-status-unstable-v1.xml");
    scanner.addProtocolPath("protocol/river-control-unstable-v1.xml");


@@ 23,6 24,7 @@ pub fn build(b: *std.build.Builder) void {
    scanner.generate("wl_shm", 1);
    scanner.generate("wl_output", 3);
    scanner.generate("wl_seat", 5);
    scanner.generate("wp_single_pixel_buffer_manager_v1", 1);
    scanner.generate("wp_viewporter", 1);
    scanner.generate("zwlr_layer_shell_v1", 1);
    scanner.generate("zriver_status_manager_v1", 1);

M src/Bar.zig => src/Bar.zig +8 -14
@@ 19,7 19,7 @@ layer_surface: *zwlr.LayerSurfaceV1,
background: struct {
    surface: *wl.Surface,
    viewport: *wp.Viewport,
    buffer: Buffer,
    buffer: *wl.Buffer,
},

tags: Widget,


@@ 37,21 37,14 @@ pub fn create(monitor: *Monitor) !*Bar {

    const compositor = state.wayland.compositor.?;
    const viewporter = state.wayland.viewporter.?;
    const shm = state.wayland.shm.?;
    const spb_manager = state.wayland.single_pixel_buffer_manager.?;
    const layer_shell = state.wayland.layer_shell.?;

    self.background.surface = try compositor.createSurface();
    self.background.viewport = try viewporter.getViewport(self.background.surface);
    self.background.buffer = try spb_manager.createU32RgbaBuffer(0, 0, 0, 0xffffffff);

    try self.background.buffer.resize(shm, 1, 1);
    self.background.buffer.data.?[0] = 0xff000000;

    self.layer_surface = try layer_shell.getLayerSurface(
        self.background.surface,
        monitor.output,
        .top,
        "levee",
    );
    self.layer_surface = try layer_shell.getLayerSurface(self.background.surface, monitor.output, .top, "levee");

    self.tags = try Widget.init(self.background.surface);
    self.clock = try Widget.init(self.background.surface);


@@ 76,10 69,11 @@ pub fn create(monitor: *Monitor) !*Bar {

pub fn destroy(self: *Bar) void {
    self.monitor.bar = null;
    self.layer_surface.destroy();

    self.background.surface.destroy();
    self.layer_surface.destroy();
    self.background.buffer.deinit();
    self.background.viewport.destroy();
    self.background.buffer.destroy();

    self.tags.deinit();
    self.clock.deinit();


@@ 102,7 96,7 @@ fn layerSurfaceListener(
            layerSurface.ackConfigure(data.serial);

            const bg = &bar.background;
            bg.surface.attach(bg.buffer.buffer, 0, 0);
            bg.surface.attach(bg.buffer, 0, 0);
            bg.surface.damageBuffer(0, 0, bar.width, bar.height);
            bg.viewport.setDestination(bar.width, bar.height);


M src/Wayland.zig => src/Wayland.zig +8 -5
@@ 4,7 4,6 @@ const mem = std.mem;
const meta = std.meta;
const os = std.os;
const strcmp = std.cstr.cmp;
const ArrayList = std.ArrayList;

const wl = @import("wayland").client.wl;
const wp = @import("wayland").client.wp;


@@ 26,13 25,14 @@ fd: os.fd_t,
compositor: ?*wl.Compositor = null,
subcompositor: ?*wl.Subcompositor = null,
shm: ?*wl.Shm = null,
single_pixel_buffer_manager: ?*wp.SinglePixelBufferManagerV1 = null,
viewporter: ?*wp.Viewporter = null,
layer_shell: ?*zwlr.LayerShellV1 = null,
status_manager: ?*zriver.StatusManagerV1 = null,
control: ?*zriver.ControlV1 = null,

monitors: ArrayList(*Monitor),
inputs: ArrayList(*Input),
monitors: std.ArrayList(*Monitor),
inputs: std.ArrayList(*Input),

pub fn init() !Wayland {
    const display = try wl.Display.connect(null);


@@ 41,8 41,8 @@ pub fn init() !Wayland {
    return Wayland{
        .display = display,
        .fd = wfd,
        .monitors = ArrayList(*Monitor).init(state.gpa),
        .inputs = ArrayList(*Input).init(state.gpa),
        .monitors = std.ArrayList(*Monitor).init(state.gpa),
        .inputs = std.ArrayList(*Input).init(state.gpa),
    };
}



@@ 57,6 57,7 @@ pub fn deinit(self: *Wayland) void {
    if (self.subcompositor) |global| global.destroy();
    if (self.shm) |global| global.destroy();
    if (self.viewporter) |global| global.destroy();
    if (self.single_pixel_buffer_manager) |global| global.destroy();
    if (self.layer_shell) |global| global.destroy();
    if (self.status_manager) |global| global.destroy();
    if (self.control) |global| global.destroy();


@@ 122,6 123,8 @@ fn bindGlobal(self: *Wayland, registry: *wl.Registry, name: u32, iface: [*:0]con
        self.shm = try registry.bind(name, wl.Shm, 1);
    } else if (strcmp(iface, wp.Viewporter.getInterface().name) == 0) {
        self.viewporter = try registry.bind(name, wp.Viewporter, 1);
    } else if (strcmp(iface, wp.SinglePixelBufferManagerV1.getInterface().name) == 0) {
        self.single_pixel_buffer_manager = try registry.bind(name, wp.SinglePixelBufferManagerV1, 1);
    } else if (strcmp(iface, zwlr.LayerShellV1.getInterface().name) == 0) {
        self.layer_shell = try registry.bind(name, zwlr.LayerShellV1, 1);
    } else if (strcmp(iface, zriver.StatusManagerV1.getInterface().name) == 0) {