From 5c972303d25f8452d65632c813f16e74183e7442 Mon Sep 17 00:00:00 2001 From: LN Liberda Date: Tue, 11 Mar 2025 20:13:20 +0100 Subject: [PATCH] build: update to Zig 0.14.0 --- build.zig | 16 +++++++-------- build.zig.zon | 42 +++++++++++++++++++++----------------- src/Config.zig | 9 ++++---- src/SecretBuffer.zig | 4 ++-- src/Wayland.zig | 28 ++++++++++++------------- src/wayprompt-pinentry.zig | 2 +- 6 files changed, 52 insertions(+), 49 deletions(-) diff --git a/build.zig b/build.zig index d5e155e..3501960 100644 --- a/build.zig +++ b/build.zig @@ -2,7 +2,7 @@ const std = @import("std"); const fs = std.fs; const mem = std.mem; -const Scanner = @import("zig-wayland").Scanner; +const Scanner = @import("wayland").Scanner; pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); @@ -13,7 +13,7 @@ pub fn build(b: *std.Build) !void { const llvm = !(b.option(bool, "no-llvm", "(expirimental) Use non-LLVM x86 Zig backend") orelse false); const scanner = Scanner.create(b, .{}); - scanner.addCustomProtocol("protocol/wlr-layer-shell-unstable-v1.xml"); + scanner.addCustomProtocol(b.path("protocol/wlr-layer-shell-unstable-v1.xml")); scanner.addSystemProtocol("stable/xdg-shell/xdg-shell.xml"); // Dependency of layer-shell. scanner.addSystemProtocol("staging/cursor-shape/cursor-shape-v1.xml"); scanner.addSystemProtocol("unstable/tablet/tablet-unstable-v2.xml"); // Dependency of cursor-shape. @@ -25,11 +25,11 @@ pub fn build(b: *std.Build) !void { scanner.generate("wl_output", 4); const wayland = b.createModule(.{ .root_source_file = scanner.result }); - const xkbcommon = b.dependency("zig-xkbcommon", .{}).module("xkbcommon"); - const pixman = b.dependency("zig-pixman", .{}).module("pixman"); - const spoon = b.dependency("zig-spoon", .{}).module("spoon"); - const fcft = b.dependency("zig-fcft", .{}).module("fcft"); - const ini = b.dependency("zig-ini", .{}).module("ini"); + const xkbcommon = b.dependency("xkbcommon", .{}).module("xkbcommon"); + const pixman = b.dependency("pixman", .{}).module("pixman"); + const spoon = b.dependency("spoon", .{}).module("spoon"); + const fcft = b.dependency("fcft", .{}).module("fcft"); + const ini = b.dependency("ini", .{}).module("ini"); const wayprompt_cli = b.addExecutable(.{ .name = "wayprompt", @@ -45,7 +45,6 @@ pub fn build(b: *std.Build) !void { wayprompt_cli.root_module.addImport("wayland", wayland); wayprompt_cli.linkSystemLibrary("wayland-client"); wayprompt_cli.linkSystemLibrary("wayland-cursor"); - scanner.addCSource(wayprompt_cli); wayprompt_cli.root_module.addImport("ini", ini); wayprompt_cli.root_module.addImport("fcft", fcft); wayprompt_cli.linkSystemLibrary("fcft"); @@ -71,7 +70,6 @@ pub fn build(b: *std.Build) !void { wayprompt_pinentry.root_module.addImport("wayland", wayland); wayprompt_pinentry.linkSystemLibrary("wayland-client"); wayprompt_pinentry.linkSystemLibrary("wayland-cursor"); - scanner.addCSource(wayprompt_pinentry); wayprompt_pinentry.root_module.addImport("ini", ini); wayprompt_pinentry.root_module.addImport("fcft", fcft); wayprompt_pinentry.linkSystemLibrary("fcft"); diff --git a/build.zig.zon b/build.zig.zon index d1c0b83..ea435e4 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,31 +1,35 @@ .{ - .name = "wayprompt", + .name = .wayprompt, .version = "0.2.0", .paths = .{""}, .dependencies = .{ - .@"zig-ini" = .{ - .url = "https://git.sr.ht/~leon_plickat/zig-ini/archive/879c74a3a801d49fa34343aebd55a22f591899b3.tar.gz", - .hash = "12201bbf05e1fb73323a9b13d2599dc4bf82851e6d328d7523a1af5b861a87edf286", + .ini = .{ + // https://lists.sr.ht/~leon_plickat/public-inbox/patches/57972 + .url = "https://s.lnl.gay/3LR6ldrkzAmZH7PTCdTV8USxkppSEhj7.tar.zst", + .hash = "ini-1.0.2-vBSBn_RmAACl2QUv14WHU5Q2bpKsXpr5hD1E5i7Tmjyl", }, - .@"zig-spoon" = .{ - .url = "https://git.sr.ht/~leon_plickat/zig-spoon/archive/fdba8e643c9558254bf4e6c600dfbd782fa7a267.tar.gz", - .hash = "12202727aaaf0e742d4945be55af1ace8b25902095e0c1b0a24b70cc80a81b7ac518", + .spoon = .{ + // https://lists.sr.ht/~leon_plickat/public-inbox/patches/57973 + .url = "https://s.lnl.gay/yD0sBtXHlar8sU4AwmAhP9US0WB2P9es.tar.zst", + .hash = "spoon-0.1.0-jYZhgyOkAgAcVmy4HaMNShXHc18g0QUAJ_zTZNI6xvWK", }, - .@"zig-pixman" = .{ - .url = "https://codeberg.org/ifreund/zig-pixman/archive/v0.2.0.tar.gz", - .hash = "12209db20ce873af176138b76632931def33a10539387cba745db72933c43d274d56", + .pixman = .{ + .url = "https://codeberg.org/ifreund/zig-pixman/archive/v0.3.0.tar.gz", + .hash = "pixman-0.3.0-LClMnz2VAAAs7QSCGwLimV5VUYx0JFnX5xWU6HwtMuDX", }, - .@"zig-wayland" = .{ - .url = "https://codeberg.org/ifreund/zig-wayland/archive/v0.2.0.tar.gz", - .hash = "1220687c8c47a48ba285d26a05600f8700d37fc637e223ced3aa8324f3650bf52242", + .wayland = .{ + .url = "https://codeberg.org/ifreund/zig-wayland/archive/v0.3.0.tar.gz", + .hash = "wayland-0.3.0-lQa1kjPIAQDmhGYpY-zxiRzQJFHQ2VqhJkQLbKKdt5wl", }, - .@"zig-xkbcommon" = .{ - .url = "https://codeberg.org/ifreund/zig-xkbcommon/archive/v0.2.0.tar.gz", - .hash = "1220c90b2228d65fd8427a837d31b0add83e9fade1dcfa539bb56fd06f1f8461605f", + .xkbcommon = .{ + .url = "https://codeberg.org/ifreund/zig-xkbcommon/archive/v0.3.0.tar.gz", + .hash = "xkbcommon-0.3.0-VDqIe3K9AQB2fG5ZeRcMC9i7kfrp5m2rWgLrmdNn9azr", }, - .@"zig-fcft" = .{ - .url = "https://git.sr.ht/~novakane/zig-fcft/archive/1.1.0.tar.gz", - .hash = "1220a4029ee3ee70d3175c69878e2b70dccd000c4324bc74ba800d8a143b7250fb38", + .fcft = .{ + // https://lists.sr.ht/~novakane/public-inbox/patches/57974 + .url = "https://s.lnl.gay/vIXYI8JINhdNcFVakwBWo6qkGGtY9xC7.tar.zst", + .hash = "fcft-1.0.0-zcx6C5EaAACt1GaWAjvr5c4QF3-_Ug5RA1-YbhYTpDd-", }, }, + .fingerprint = 0xc45742f410512433, } diff --git a/src/Config.zig b/src/Config.zig index 7d24429..461bf18 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -53,7 +53,7 @@ const WaylandColours = struct { cancel_button_text: pixman.Color = comptimePixmanColourFromRGB("0x000000"), fn assign(self: *WaylandColours, path: []const u8, line: usize, variable: []const u8, value: []const u8) error{BadConfig}!bool { - const info = @typeInfo(WaylandColours).Struct; + const info = @typeInfo(WaylandColours).@"struct"; inline for (info.fields) |field| { if (fieldEql(field.name, variable)) { debug.assert(@TypeOf(@field(self, field.name)) == pixman.Color); @@ -99,7 +99,7 @@ const WaylandUi = struct { } fn assign(self: *WaylandUi, alloc: mem.Allocator, path: []const u8, line: usize, variable: []const u8, value: []const u8) error{ BadConfig, OutOfMemory }!bool { - const info = @typeInfo(WaylandUi).Struct; + const info = @typeInfo(WaylandUi).@"struct"; inline for (info.fields) |field| { if (fieldEql(field.name, variable)) { switch (@TypeOf(@field(self, field.name))) { @@ -144,12 +144,12 @@ alloc: mem.Allocator, /// as such they are provided by the gpg-agent. /// Populated at runtime. tty_name: ?[:0]const u8 = null, -wayland_display: ?[:0]const u8 = null, +wayland_display: ?[]const u8 = null, /// Frees all memory using provided allocator. pub fn reset(self: *Config, alloc: mem.Allocator) void { self.wayland_ui.reset(alloc); - const info = @typeInfo(@TypeOf(self.labels)).Struct; + const info = @typeInfo(@TypeOf(self.labels)).@"struct"; inline for (info.fields) |field| { if (@field(self.labels, field.name)) |str| { @field(self.labels, field.name) = null; @@ -254,6 +254,7 @@ fn comptimePixmanColourFromRGB(hex: []const u8) pixman.Color { } fn pixmanColourFromRGB(hex: []const u8) !pixman.Color { + @setEvalBranchQuota(10_000); if (hex.len != "0xRRGGBB".len and hex.len != "0xRRGGBBAA".len) return error.BadColour; if (hex[0] != '0' or hex[1] != 'x') return error.BadColour; diff --git a/src/SecretBuffer.zig b/src/SecretBuffer.zig index d3955f6..1e39e6c 100644 --- a/src/SecretBuffer.zig +++ b/src/SecretBuffer.zig @@ -8,7 +8,7 @@ const unicode = std.unicode; const Self = @This(); -buffer: []align(mem.page_size) u8, +buffer: []align(heap.page_size_min) u8, fba: heap.FixedBufferAllocator, str: std.ArrayListUnmanaged(u8), len: usize, @@ -16,7 +16,7 @@ len: usize, extern fn mlock(addr: *const anyopaque, len: usize) c_int; pub fn init(self: *Self, alloc: mem.Allocator) !void { - self.buffer = try alloc.alignedAlloc(u8, mem.page_size, 1024); + self.buffer = try alloc.alignedAlloc(u8, heap.page_size_min, 1024); self.fba = heap.FixedBufferAllocator.init(self.buffer); self.str = .{}; self.len = 0; diff --git a/src/Wayland.zig b/src/Wayland.zig index 7015054..359b62a 100644 --- a/src/Wayland.zig +++ b/src/Wayland.zig @@ -243,7 +243,7 @@ const Seat = struct { // Touch related objects. wl_touch: ?*wl.Touch = null, - touchpoints: std.TailQueue(TouchPoint) = .{}, + touchpoints: std.DoublyLinkedList(TouchPoint) = .{}, pub fn init(self: *Seat, w: *Wayland, wl_seat: *wl.Seat) !void { self.* = .{ .w = w, .wl_seat = wl_seat }; @@ -575,7 +575,7 @@ const Seat = struct { // generally is better UX. We have a list of // touchpoints instead of a single one so that we can // support multi-touch operation. - const node = alloc.create(std.TailQueue(TouchPoint).Node) catch return; + const node = alloc.create(std.DoublyLinkedList(TouchPoint).Node) catch return; node.data = .{ .id = ev.id, .hotspot = hotspot, @@ -622,7 +622,7 @@ const Seat = struct { } } - fn touchPointNodeFromId(seat: *Seat, id: i32) ?*std.TailQueue(TouchPoint).Node { + fn touchPointNodeFromId(seat: *Seat, id: i32) ?*std.DoublyLinkedList(TouchPoint).Node { debug.assert(seat.wl_touch != null); var it = seat.touchpoints.first; while (it) |node| : (it = node.next) { @@ -1264,7 +1264,7 @@ const BufferPool = struct { /// The buffers. This is a linked list and not an array list, because we /// need stable pointers for the listener of the wl_buffer object. - buffers: std.TailQueue(Buffer) = .{}, + buffers: std.DoublyLinkedList(Buffer) = .{}, /// Deinit the buffer pool, destroying all buffers and freeing all memory. pub fn deinit(self: *BufferPool, alloc: mem.Allocator) void { @@ -1295,7 +1295,7 @@ const BufferPool = struct { fn findSuitableBuffer(self: *BufferPool, w: *Wayland, width: u31, height: u31) !?*Buffer { var it = self.buffers.first; - var first_unbusy_buffer_node: ?*std.TailQueue(Buffer).Node = null; + var first_unbusy_buffer_node: ?*std.DoublyLinkedList(Buffer).Node = null; while (it) |node| : (it = node.next) { if (node.data.busy) continue; if (node.data.width == width and node.data.height == height) { @@ -1319,7 +1319,7 @@ const BufferPool = struct { fn newBuffer(self: *BufferPool, w: *Wayland, width: u31, height: u31) !*Buffer { log.debug("New buffer: {}x{}", .{ width, height }); const alloc = w.config.alloc; - const node = try alloc.create(std.TailQueue(Buffer).Node); + const node = try alloc.create(std.DoublyLinkedList(Buffer).Node); errdefer alloc.destroy(node); try node.data.init(w, width, height); self.buffers.append(node); @@ -1354,7 +1354,7 @@ const BufferPool = struct { const Buffer = struct { wl_buffer: ?*wl.Buffer = null, pixman_image: ?*pixman.Image = null, - data: ?[]align(std.mem.page_size) u8 = null, + data: ?[]align(std.heap.page_size_min) u8 = null, width: u31 = 0, // u31 can coerce to i32. height: u31 = 0, busy: bool = false, @@ -1441,7 +1441,7 @@ layer_shell: ?*zwlr.LayerShellV1 = null, cursor_shape_manager: ?*wp.CursorShapeManagerV1 = null, compositor: ?*wl.Compositor = null, shm: ?*wl.Shm = null, -seats: std.TailQueue(Seat) = .{}, +seats: std.DoublyLinkedList(Seat) = .{}, buffer_pool: BufferPool = .{}, surface: ?Surface = null, @@ -1699,27 +1699,27 @@ fn abort(self: *Wayland, reason: anyerror) void { fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, self: *Wayland) void { switch (event) { .global => |ev| { - if (mem.orderZ(u8, ev.interface, zwlr.LayerShellV1.getInterface().name) == .eq) { + if (mem.orderZ(u8, ev.interface, zwlr.LayerShellV1.interface.name) == .eq) { self.layer_shell = registry.bind(ev.name, zwlr.LayerShellV1, 4) catch { self.abort(error.OutOfMemory); return; }; - } else if (mem.orderZ(u8, ev.interface, wp.CursorShapeManagerV1.getInterface().name) == .eq) { + } else if (mem.orderZ(u8, ev.interface, wp.CursorShapeManagerV1.interface.name) == .eq) { self.cursor_shape_manager = registry.bind(ev.name, wp.CursorShapeManagerV1, 1) catch { self.abort(error.OutOfMemory); return; }; - } else if (mem.orderZ(u8, ev.interface, wl.Compositor.getInterface().name) == .eq) { + } else if (mem.orderZ(u8, ev.interface, wl.Compositor.interface.name) == .eq) { self.compositor = registry.bind(ev.name, wl.Compositor, 4) catch { self.abort(error.OutOfMemory); return; }; - } else if (mem.orderZ(u8, ev.interface, wl.Shm.getInterface().name) == .eq) { + } else if (mem.orderZ(u8, ev.interface, wl.Shm.interface.name) == .eq) { self.shm = registry.bind(ev.name, wl.Shm, 1) catch { self.abort(error.OutOfMemory); return; }; - } else if (mem.orderZ(u8, ev.interface, wl.Seat.getInterface().name) == .eq) { + } else if (mem.orderZ(u8, ev.interface, wl.Seat.interface.name) == .eq) { const seat = registry.bind(ev.name, wl.Seat, 1) catch { self.abort(error.OutOfMemory); return; @@ -1735,7 +1735,7 @@ fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, self: *Way } fn addSeat(self: *Wayland, wl_seat: *wl.Seat) !void { - const node = try self.config.alloc.create(std.TailQueue(Seat).Node); + const node = try self.config.alloc.create(std.DoublyLinkedList(Seat).Node); try node.data.init(self, wl_seat); self.seats.append(node); } diff --git a/src/wayprompt-pinentry.zig b/src/wayprompt-pinentry.zig index 305636e..b84f039 100644 --- a/src/wayprompt-pinentry.zig +++ b/src/wayprompt-pinentry.zig @@ -276,7 +276,7 @@ fn parseInput(writer: io.BufferedWriter(4096, fs.File.Writer).Writer, line: []co if (mode != .none) return; const alloc = gpa.allocator(); - var it = mem.tokenize(u8, line, &ascii.whitespace); + var it = mem.tokenizeSequence(u8, line, &ascii.whitespace); const command = it.next() orelse return; if (ascii.eqlIgnoreCase(command, "settitle")) { try setString(writer, "title", line["settitle".len..]);