build: update to Zig 0.11.0
This commit is contained in:
		| @ -39,11 +39,11 @@ tasks: | ||||
|       sudo ninja -C build/ install | ||||
|       cd .. | ||||
|  | ||||
|       wget -nv https://ziglang.org/download/0.10.0/zig-linux-x86_64-0.10.0.tar.xz | ||||
|       wget -nv https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz | ||||
|       # Remove a lot of useless lines from tar output. | ||||
|       tar -xvf zig-linux-x86_64-0.10.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-linux-x86_64-0.10.0/zig /usr/bin/ | ||||
|       sudo mv zig-linux-x86_64-0.10.0/lib /usr/lib/zig | ||||
|       tar -xvf zig-linux-x86_64-0.11.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-linux-x86_64-0.11.0/zig /usr/bin/ | ||||
|       sudo mv zig-linux-x86_64-0.11.0/lib /usr/lib/zig | ||||
|   - build: | | ||||
|       cd river | ||||
|       zig build | ||||
|  | ||||
| @ -37,11 +37,11 @@ tasks: | ||||
|       sudo ninja -C build/ install | ||||
|       cd .. | ||||
|  | ||||
|       wget -nv https://ziglang.org/download/0.10.0/zig-linux-x86_64-0.10.0.tar.xz | ||||
|       wget -nv https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz | ||||
|       # Remove a lot of useless lines from tar output. | ||||
|       tar -xvf zig-linux-x86_64-0.10.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-linux-x86_64-0.10.0/zig /usr/bin/ | ||||
|       sudo mv zig-linux-x86_64-0.10.0/lib /usr/lib/zig | ||||
|       tar -xvf zig-linux-x86_64-0.11.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-linux-x86_64-0.11.0/zig /usr/bin/ | ||||
|       sudo mv zig-linux-x86_64-0.11.0/lib /usr/lib/zig | ||||
|   - build: | | ||||
|       cd river | ||||
|       zig build | ||||
|  | ||||
| @ -41,11 +41,11 @@ tasks: | ||||
|       sudo ninja -C build/ install | ||||
|       cd .. | ||||
|  | ||||
|       wget -nv https://ziglang.org/download/0.10.0/zig-freebsd-x86_64-0.10.0.tar.xz | ||||
|       wget -nv https://ziglang.org/download/0.11.0/zig-freebsd-x86_64-0.11.0.tar.xz | ||||
|       # Remove a lot of useless lines from tar output. | ||||
|       tar -xvf zig-freebsd-x86_64-0.10.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-freebsd-x86_64-0.10.0/zig /usr/bin/ | ||||
|       sudo mv zig-freebsd-x86_64-0.10.0/lib /usr/lib/zig | ||||
|       tar -xvf zig-freebsd-x86_64-0.11.0.tar.xz 1>/dev/null | ||||
|       sudo mv zig-freebsd-x86_64-0.11.0/zig /usr/bin/ | ||||
|       sudo mv zig-freebsd-x86_64-0.11.0/lib /usr/lib/zig | ||||
|   - build: | | ||||
|       cd river | ||||
|       zig build | ||||
|  | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,2 @@ | ||||
| zig-cache/ | ||||
| zig-out/ | ||||
| doc/*.[1-9] | ||||
|  | ||||
| @ -35,7 +35,7 @@ To compile river first ensure that you have the following dependencies | ||||
| installed. The "development" versions are required if applicable to your | ||||
| distribution. | ||||
|  | ||||
| - [zig](https://ziglang.org/download/) 0.10 | ||||
| - [zig](https://ziglang.org/download/) 0.11 | ||||
| - wayland | ||||
| - wayland-protocols | ||||
| - [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) 0.16 | ||||
| @ -47,7 +47,7 @@ distribution. | ||||
|  | ||||
| Then run, for example: | ||||
| ``` | ||||
| zig build -Drelease-safe --prefix ~/.local install | ||||
| zig build -Doptimize=ReleaseSafe --prefix ~/.local install | ||||
| ``` | ||||
| To enable experimental Xwayland support pass the `-Dxwayland` option as well. | ||||
|  | ||||
|  | ||||
							
								
								
									
										230
									
								
								build.zig
									
									
									
									
									
								
							
							
						
						
									
										230
									
								
								build.zig
									
									
									
									
									
								
							| @ -1,10 +1,10 @@ | ||||
| const std = @import("std"); | ||||
| const assert = std.debug.assert; | ||||
| const Build = std.Build; | ||||
| const fs = std.fs; | ||||
| const mem = std.mem; | ||||
| const zbs = std.build; | ||||
|  | ||||
| const ScanProtocolsStep = @import("deps/zig-wayland/build.zig").ScanProtocolsStep; | ||||
| const Scanner = @import("deps/zig-wayland/build.zig").Scanner; | ||||
|  | ||||
| /// While a river release is in development, this string should contain the version in development | ||||
| /// with the "-dev" suffix. | ||||
| @ -12,9 +12,9 @@ const ScanProtocolsStep = @import("deps/zig-wayland/build.zig").ScanProtocolsSte | ||||
| /// Directly after the tagged commit, the version should be bumped and the "-dev" suffix added. | ||||
| const version = "0.3.0-dev"; | ||||
|  | ||||
| pub fn build(b: *zbs.Builder) !void { | ||||
| pub fn build(b: *Build) !void { | ||||
|     const target = b.standardTargetOptions(.{}); | ||||
|     const mode = b.standardReleaseOptions(); | ||||
|     const optimize = b.standardOptimizeOption(.{}); | ||||
|  | ||||
|     const strip = b.option(bool, "strip", "Omit debug information") orelse false; | ||||
|     const pie = b.option(bool, "pie", "Build a Position Independent Executable") orelse false; | ||||
| @ -24,7 +24,7 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|         "man-pages", | ||||
|         "Set to true to build man pages. Requires scdoc. Defaults to true if scdoc is found.", | ||||
|     ) orelse scdoc_found: { | ||||
|         _ = b.findProgram(&[_][]const u8{"scdoc"}, &[_][]const u8{}) catch |err| switch (err) { | ||||
|         _ = b.findProgram(&.{"scdoc"}, &.{}) catch |err| switch (err) { | ||||
|             error.FileNotFound => break :scdoc_found false, | ||||
|             else => return err, | ||||
|         }; | ||||
| @ -60,12 +60,12 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|             var ret: u8 = undefined; | ||||
|  | ||||
|             const git_describe_long = b.execAllowFail( | ||||
|                 &[_][]const u8{ "git", "-C", b.build_root, "describe", "--long" }, | ||||
|                 &.{ "git", "-C", b.build_root.path orelse ".", "describe", "--long" }, | ||||
|                 &ret, | ||||
|                 .Inherit, | ||||
|             ) catch break :blk version; | ||||
|  | ||||
|             var it = mem.split(u8, mem.trim(u8, git_describe_long, &std.ascii.spaces), "-"); | ||||
|             var it = mem.split(u8, mem.trim(u8, git_describe_long, &std.ascii.whitespace), "-"); | ||||
|             _ = it.next().?; // previous tag | ||||
|             const commit_count = it.next().?; | ||||
|             const commit_hash = it.next().?; | ||||
| @ -73,10 +73,7 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|             assert(commit_hash[0] == 'g'); | ||||
|  | ||||
|             // Follow semantic versioning, e.g. 0.2.0-dev.42+d1cf95b | ||||
|             break :blk try std.fmt.allocPrintZ(b.allocator, version ++ ".{s}+{s}", .{ | ||||
|                 commit_count, | ||||
|                 commit_hash[1..], | ||||
|             }); | ||||
|             break :blk b.fmt(version ++ ".{s}+{s}", .{ commit_count, commit_hash[1..] }); | ||||
|         } else { | ||||
|             break :blk version; | ||||
|         } | ||||
| @ -86,17 +83,19 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|     options.addOption(bool, "xwayland", xwayland); | ||||
|     options.addOption([]const u8, "version", full_version); | ||||
|  | ||||
|     const scanner = ScanProtocolsStep.create(b); | ||||
|     const scanner = Scanner.create(b, .{}); | ||||
|  | ||||
|     scanner.addSystemProtocol("stable/xdg-shell/xdg-shell.xml"); | ||||
|     scanner.addSystemProtocol("staging/ext-session-lock/ext-session-lock-v1.xml"); | ||||
|     scanner.addSystemProtocol("unstable/pointer-gestures/pointer-gestures-unstable-v1.xml"); | ||||
|     scanner.addSystemProtocol("unstable/pointer-constraints/pointer-constraints-unstable-v1.xml"); | ||||
|     scanner.addSystemProtocol("unstable/xdg-decoration/xdg-decoration-unstable-v1.xml"); | ||||
|     scanner.addProtocolPath("protocol/river-control-unstable-v1.xml"); | ||||
|     scanner.addProtocolPath("protocol/river-status-unstable-v1.xml"); | ||||
|     scanner.addProtocolPath("protocol/river-layout-v3.xml"); | ||||
|     scanner.addProtocolPath("protocol/wlr-layer-shell-unstable-v1.xml"); | ||||
|     scanner.addProtocolPath("protocol/wlr-output-power-management-unstable-v1.xml"); | ||||
|  | ||||
|     scanner.addCustomProtocol("protocol/river-control-unstable-v1.xml"); | ||||
|     scanner.addCustomProtocol("protocol/river-status-unstable-v1.xml"); | ||||
|     scanner.addCustomProtocol("protocol/river-layout-v3.xml"); | ||||
|     scanner.addCustomProtocol("protocol/wlr-layer-shell-unstable-v1.xml"); | ||||
|     scanner.addCustomProtocol("protocol/wlr-output-power-management-unstable-v1.xml"); | ||||
|  | ||||
|     // These must be manually kept in sync with the versions wlroots supports | ||||
|     // until wlroots gives the option to request a specific version. | ||||
| @ -120,72 +119,77 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|     scanner.generate("zwlr_layer_shell_v1", 4); | ||||
|     scanner.generate("zwlr_output_power_manager_v1", 1); | ||||
|  | ||||
|     const wayland = b.createModule(.{ .source_file = scanner.result }); | ||||
|     const xkbcommon = b.createModule(.{ | ||||
|         .source_file = .{ .path = "deps/zig-xkbcommon/src/xkbcommon.zig" }, | ||||
|     }); | ||||
|     const pixman = b.createModule(.{ | ||||
|         .source_file = .{ .path = "deps/zig-pixman/pixman.zig" }, | ||||
|     }); | ||||
|     const wlroots = b.createModule(.{ | ||||
|         .source_file = .{ .path = "deps/zig-wlroots/src/wlroots.zig" }, | ||||
|         .dependencies = &.{ | ||||
|             .{ .name = "wayland", .module = wayland }, | ||||
|             .{ .name = "xkbcommon", .module = xkbcommon }, | ||||
|             .{ .name = "pixman", .module = pixman }, | ||||
|         }, | ||||
|     }); | ||||
|  | ||||
|     const flags = b.createModule(.{ .source_file = .{ .path = "common/flags.zig" } }); | ||||
|     const globber = b.createModule(.{ .source_file = .{ .path = "common/globber.zig" } }); | ||||
|  | ||||
|     { | ||||
|         const river = b.addExecutable("river", "river/main.zig"); | ||||
|         river.setTarget(target); | ||||
|         river.setBuildMode(mode); | ||||
|         const river = b.addExecutable(.{ | ||||
|             .name = "river", | ||||
|             .root_source_file = .{ .path = "river/main.zig" }, | ||||
|             .target = target, | ||||
|             .optimize = optimize, | ||||
|         }); | ||||
|         river.addOptions("build_options", options); | ||||
|  | ||||
|         const wayland = zbs.Pkg{ | ||||
|             .name = "wayland", | ||||
|             .source = .{ .generated = &scanner.result }, | ||||
|         }; | ||||
|         const xkbcommon = zbs.Pkg{ | ||||
|             .name = "xkbcommon", | ||||
|             .source = .{ .path = "deps/zig-xkbcommon/src/xkbcommon.zig" }, | ||||
|         }; | ||||
|         const pixman = zbs.Pkg{ | ||||
|             .name = "pixman", | ||||
|             .source = .{ .path = "deps/zig-pixman/pixman.zig" }, | ||||
|         }; | ||||
|         const wlroots = zbs.Pkg{ | ||||
|             .name = "wlroots", | ||||
|             .source = .{ .path = "deps/zig-wlroots/src/wlroots.zig" }, | ||||
|             .dependencies = &[_]zbs.Pkg{ wayland, xkbcommon, pixman }, | ||||
|         }; | ||||
|  | ||||
|         river.step.dependOn(&scanner.step); | ||||
|  | ||||
|         river.linkLibC(); | ||||
|         river.linkSystemLibrary("libevdev"); | ||||
|         river.linkSystemLibrary("libinput"); | ||||
|  | ||||
|         river.addPackage(wayland); | ||||
|         river.addModule("wayland", wayland); | ||||
|         river.linkSystemLibrary("wayland-server"); | ||||
|  | ||||
|         river.addPackage(xkbcommon); | ||||
|         river.addModule("xkbcommon", xkbcommon); | ||||
|         river.linkSystemLibrary("xkbcommon"); | ||||
|  | ||||
|         river.addPackage(pixman); | ||||
|         river.addModule("pixman", pixman); | ||||
|         river.linkSystemLibrary("pixman-1"); | ||||
|  | ||||
|         river.addPackage(wlroots); | ||||
|         river.addModule("wlroots", wlroots); | ||||
|         river.linkSystemLibrary("wlroots"); | ||||
|  | ||||
|         river.addPackagePath("flags", "common/flags.zig"); | ||||
|         river.addPackagePath("globber", "common/globber.zig"); | ||||
|         river.addCSourceFile("river/wlroots_log_wrapper.c", &[_][]const u8{ "-std=c99", "-O2" }); | ||||
|         river.addModule("flags", flags); | ||||
|         river.addModule("globber", globber); | ||||
|         river.addCSourceFile(.{ | ||||
|             .file = .{ .path = "river/wlroots_log_wrapper.c" }, | ||||
|             .flags = &.{ "-std=c99", "-O2" }, | ||||
|         }); | ||||
|  | ||||
|         // TODO: remove when zig issue #131 is implemented | ||||
|         scanner.addCSource(river); | ||||
|  | ||||
|         river.strip = strip; | ||||
|         river.pie = pie; | ||||
|         river.install(); | ||||
|  | ||||
|         b.installArtifact(river); | ||||
|     } | ||||
|  | ||||
|     { | ||||
|         const riverctl = b.addExecutable("riverctl", "riverctl/main.zig"); | ||||
|         riverctl.setTarget(target); | ||||
|         riverctl.setBuildMode(mode); | ||||
|         const riverctl = b.addExecutable(.{ | ||||
|             .name = "riverctl", | ||||
|             .root_source_file = .{ .path = "riverctl/main.zig" }, | ||||
|             .target = target, | ||||
|             .optimize = optimize, | ||||
|         }); | ||||
|         riverctl.addOptions("build_options", options); | ||||
|  | ||||
|         riverctl.step.dependOn(&scanner.step); | ||||
|         riverctl.addPackagePath("flags", "common/flags.zig"); | ||||
|         riverctl.addPackage(.{ | ||||
|             .name = "wayland", | ||||
|             .source = .{ .generated = &scanner.result }, | ||||
|         }); | ||||
|         riverctl.addModule("flags", flags); | ||||
|         riverctl.addModule("wayland", wayland); | ||||
|         riverctl.linkLibC(); | ||||
|         riverctl.linkSystemLibrary("wayland-client"); | ||||
|  | ||||
| @ -193,21 +197,21 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|  | ||||
|         riverctl.strip = strip; | ||||
|         riverctl.pie = pie; | ||||
|         riverctl.install(); | ||||
|  | ||||
|         b.installArtifact(riverctl); | ||||
|     } | ||||
|  | ||||
|     { | ||||
|         const rivertile = b.addExecutable("rivertile", "rivertile/main.zig"); | ||||
|         rivertile.setTarget(target); | ||||
|         rivertile.setBuildMode(mode); | ||||
|         const rivertile = b.addExecutable(.{ | ||||
|             .name = "rivertile", | ||||
|             .root_source_file = .{ .path = "rivertile/main.zig" }, | ||||
|             .target = target, | ||||
|             .optimize = optimize, | ||||
|         }); | ||||
|         rivertile.addOptions("build_options", options); | ||||
|  | ||||
|         rivertile.step.dependOn(&scanner.step); | ||||
|         rivertile.addPackagePath("flags", "common/flags.zig"); | ||||
|         rivertile.addPackage(.{ | ||||
|             .name = "wayland", | ||||
|             .source = .{ .generated = &scanner.result }, | ||||
|         }); | ||||
|         rivertile.addModule("flags", flags); | ||||
|         rivertile.addModule("wayland", wayland); | ||||
|         rivertile.linkLibC(); | ||||
|         rivertile.linkSystemLibrary("wayland-client"); | ||||
|  | ||||
| @ -215,15 +219,13 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|  | ||||
|         rivertile.strip = strip; | ||||
|         rivertile.pie = pie; | ||||
|         rivertile.install(); | ||||
|  | ||||
|         b.installArtifact(rivertile); | ||||
|     } | ||||
|  | ||||
|     { | ||||
|         const file = try fs.path.join(b.allocator, &[_][]const u8{ b.cache_root, "river-protocols.pc" }); | ||||
|         const pkgconfig_file = try fs.cwd().createFile(file, .{}); | ||||
|  | ||||
|         const writer = pkgconfig_file.writer(); | ||||
|         try writer.print( | ||||
|         const wf = Build.Step.WriteFile.create(b); | ||||
|         const pc_file = wf.add("river-protocols.pc", b.fmt( | ||||
|             \\prefix={s} | ||||
|             \\datadir=${{prefix}}/share | ||||
|             \\pkgdatadir=${{datadir}}/river-protocols | ||||
| @ -232,16 +234,23 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|             \\URL: https://github.com/riverwm/river | ||||
|             \\Description: protocol files for the river wayland compositor | ||||
|             \\Version: {s} | ||||
|         , .{ b.install_prefix, full_version }); | ||||
|         defer pkgconfig_file.close(); | ||||
|         , .{ b.install_prefix, full_version })); | ||||
|  | ||||
|         b.installFile("protocol/river-layout-v3.xml", "share/river-protocols/river-layout-v3.xml"); | ||||
|         b.installFile(file, "share/pkgconfig/river-protocols.pc"); | ||||
|         b.getInstallStep().dependOn(&b.addInstallFile(pc_file, "share/pkgconfig/river-protocols.pc").step); | ||||
|     } | ||||
|  | ||||
|     if (man_pages) { | ||||
|         const scdoc_step = ScdocStep.create(b); | ||||
|         try scdoc_step.install(); | ||||
|         inline for (.{ "river", "riverctl", "rivertile" }) |page| { | ||||
|             // Workaround for https://github.com/ziglang/zig/issues/16369 | ||||
|             // Even passing a buffer to std.Build.Step.Run appears to be racy and occasionally deadlocks. | ||||
|             const scdoc = b.addSystemCommand(&.{ "/bin/sh", "-c", "scdoc < doc/" ++ page ++ ".1.scd" }); | ||||
|             // This makes the caching work for the Workaround, and the extra argument is ignored by /bin/sh. | ||||
|             scdoc.addFileArg(.{ .path = "doc/" ++ page ++ ".1.scd" }); | ||||
|  | ||||
|             const stdout = scdoc.captureStdOut(); | ||||
|             b.getInstallStep().dependOn(&b.addInstallFile(stdout, "share/man/man1/" ++ page ++ ".1").step); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (bash_completion) { | ||||
| @ -257,65 +266,14 @@ pub fn build(b: *zbs.Builder) !void { | ||||
|     } | ||||
|  | ||||
|     { | ||||
|         const globber_test = b.addTest("common/globber.zig"); | ||||
|         globber_test.setTarget(target); | ||||
|         globber_test.setBuildMode(mode); | ||||
|         const globber_test = b.addTest(.{ | ||||
|             .root_source_file = .{ .path = "common/globber.zig" }, | ||||
|             .target = target, | ||||
|             .optimize = optimize, | ||||
|         }); | ||||
|         const run_globber_test = b.addRunArtifact(globber_test); | ||||
|  | ||||
|         const test_step = b.step("test", "Run the tests"); | ||||
|         test_step.dependOn(&globber_test.step); | ||||
|         test_step.dependOn(&run_globber_test.step); | ||||
|     } | ||||
| } | ||||
|  | ||||
| const ScdocStep = struct { | ||||
|     const scd_paths = [_][]const u8{ | ||||
|         "doc/river.1.scd", | ||||
|         "doc/riverctl.1.scd", | ||||
|         "doc/rivertile.1.scd", | ||||
|     }; | ||||
|  | ||||
|     builder: *zbs.Builder, | ||||
|     step: zbs.Step, | ||||
|  | ||||
|     fn create(builder: *zbs.Builder) *ScdocStep { | ||||
|         const self = builder.allocator.create(ScdocStep) catch @panic("out of memory"); | ||||
|         self.* = init(builder); | ||||
|         return self; | ||||
|     } | ||||
|  | ||||
|     fn init(builder: *zbs.Builder) ScdocStep { | ||||
|         return ScdocStep{ | ||||
|             .builder = builder, | ||||
|             .step = zbs.Step.init(.custom, "Generate man pages", builder.allocator, make), | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     fn make(step: *zbs.Step) !void { | ||||
|         const self = @fieldParentPtr(ScdocStep, "step", step); | ||||
|         for (scd_paths) |path| { | ||||
|             const command = try std.fmt.allocPrint( | ||||
|                 self.builder.allocator, | ||||
|                 "scdoc < {s} > {s}", | ||||
|                 .{ path, path[0..(path.len - 4)] }, | ||||
|             ); | ||||
|             _ = try self.builder.exec(&[_][]const u8{ "sh", "-c", command }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn install(self: *ScdocStep) !void { | ||||
|         self.builder.getInstallStep().dependOn(&self.step); | ||||
|  | ||||
|         for (scd_paths) |path| { | ||||
|             const path_no_ext = path[0..(path.len - 4)]; | ||||
|             const basename_no_ext = fs.path.basename(path_no_ext); | ||||
|             const section = path_no_ext[(path_no_ext.len - 1)..]; | ||||
|  | ||||
|             const output = try std.fmt.allocPrint( | ||||
|                 self.builder.allocator, | ||||
|                 "share/man/man{s}/{s}", | ||||
|                 .{ section, basename_no_ext }, | ||||
|             ); | ||||
|  | ||||
|             self.builder.installFile(path_no_ext, output); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|  | ||||
| @ -41,14 +41,14 @@ pub fn parser(comptime Arg: type, comptime flags: []const Flag) type { | ||||
|                     const field: std.builtin.Type.StructField = switch (flag.kind) { | ||||
|                         .boolean => .{ | ||||
|                             .name = flag.name, | ||||
|                             .field_type = bool, | ||||
|                             .type = bool, | ||||
|                             .default_value = &false, | ||||
|                             .is_comptime = false, | ||||
|                             .alignment = @alignOf(bool), | ||||
|                         }, | ||||
|                         .arg => .{ | ||||
|                             .name = flag.name, | ||||
|                             .field_type = ?[:0]const u8, | ||||
|                             .type = ?[:0]const u8, | ||||
|                             .default_value = &@as(?[:0]const u8, null), | ||||
|                             .is_comptime = false, | ||||
|                             .alignment = @alignOf(?[:0]const u8), | ||||
| @ -70,8 +70,13 @@ pub fn parser(comptime Arg: type, comptime flags: []const Flag) type { | ||||
|  | ||||
|             var i: usize = 0; | ||||
|             outer: while (i < args.len) : (i += 1) { | ||||
|                 const arg = switch (Arg) { | ||||
|                     [*:0]const u8 => mem.sliceTo(args[i], 0), | ||||
|                     [:0]const u8 => args[i], | ||||
|                     else => unreachable, | ||||
|                 }; | ||||
|                 inline for (flags) |flag| { | ||||
|                     if (mem.eql(u8, "-" ++ flag.name, mem.span(args[i]))) { | ||||
|                     if (mem.eql(u8, "-" ++ flag.name, arg)) { | ||||
|                         switch (flag.kind) { | ||||
|                             .boolean => @field(result_flags, flag.name) = true, | ||||
|                             .arg => { | ||||
| @ -81,7 +86,11 @@ pub fn parser(comptime Arg: type, comptime flags: []const Flag) type { | ||||
|                                         "' requires an argument but none was provided!", .{}); | ||||
|                                     return error.MissingFlagArgument; | ||||
|                                 } | ||||
|                                 @field(result_flags, flag.name) = mem.span(args[i]); | ||||
|                                 @field(result_flags, flag.name) = switch (Arg) { | ||||
|                                     [*:0]const u8 => mem.sliceTo(args[i], 0), | ||||
|                                     [:0]const u8 => args[i], | ||||
|                                     else => unreachable, | ||||
|                                 }; | ||||
|                             }, | ||||
|                         } | ||||
|                         continue :outer; | ||||
|  | ||||
| @ -34,19 +34,19 @@ pub fn validate(glob: []const u8) error{InvalidGlob}!void { | ||||
| test validate { | ||||
|     const testing = std.testing; | ||||
|  | ||||
|     _ = try validate("*"); | ||||
|     _ = try validate("a"); | ||||
|     _ = try validate("*a"); | ||||
|     _ = try validate("a*"); | ||||
|     _ = try validate("*a*"); | ||||
|     _ = try validate("ab"); | ||||
|     _ = try validate("*ab"); | ||||
|     _ = try validate("ab*"); | ||||
|     _ = try validate("*ab*"); | ||||
|     _ = try validate("abc"); | ||||
|     _ = try validate("*abc"); | ||||
|     _ = try validate("abc*"); | ||||
|     _ = try validate("*abc*"); | ||||
|     try validate("*"); | ||||
|     try validate("a"); | ||||
|     try validate("*a"); | ||||
|     try validate("a*"); | ||||
|     try validate("*a*"); | ||||
|     try validate("ab"); | ||||
|     try validate("*ab"); | ||||
|     try validate("ab*"); | ||||
|     try validate("*ab*"); | ||||
|     try validate("abc"); | ||||
|     try validate("*abc"); | ||||
|     try validate("abc*"); | ||||
|     try validate("*abc*"); | ||||
|  | ||||
|     try testing.expectError(error.InvalidGlob, validate("")); | ||||
|     try testing.expectError(error.InvalidGlob, validate("**")); | ||||
| @ -165,8 +165,8 @@ pub fn order(a: []const u8, b: []const u8) std.math.Order { | ||||
|         return .lt; | ||||
|     } | ||||
|  | ||||
|     const count_a = @as(u2, @boolToInt(a[0] == '*')) + @boolToInt(a[a.len - 1] == '*'); | ||||
|     const count_b = @as(u2, @boolToInt(b[0] == '*')) + @boolToInt(b[b.len - 1] == '*'); | ||||
|     const count_a = @as(u2, @intFromBool(a[0] == '*')) + @intFromBool(a[a.len - 1] == '*'); | ||||
|     const count_b = @as(u2, @intFromBool(b[0] == '*')) + @intFromBool(b[b.len - 1] == '*'); | ||||
|  | ||||
|     if (count_a == 0 and count_b == 0) { | ||||
|         return .eq; | ||||
| @ -206,7 +206,7 @@ test order { | ||||
|         "a", | ||||
|     }; | ||||
|  | ||||
|     for (descending) |a, i| { | ||||
|     for (descending, 0..) |a, i| { | ||||
|         for (descending[i..]) |b| { | ||||
|             try testing.expect(order(a, b) != .lt); | ||||
|         } | ||||
| @ -215,7 +215,7 @@ test order { | ||||
|     var ascending = descending; | ||||
|     mem.reverse([]const u8, &ascending); | ||||
|  | ||||
|     for (ascending) |a, i| { | ||||
|     for (ascending, 0..) |a, i| { | ||||
|         for (ascending[i..]) |b| { | ||||
|             try testing.expect(order(a, b) != .gt); | ||||
|         } | ||||
|  | ||||
							
								
								
									
										2
									
								
								deps/zig-pixman
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								deps/zig-pixman
									
									
									
									
										vendored
									
									
								
							 Submodule deps/zig-pixman updated: 4a49ba13eb...b0a961079d
									
								
							
							
								
								
									
										2
									
								
								deps/zig-wayland
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								deps/zig-wayland
									
									
									
									
										vendored
									
									
								
							 Submodule deps/zig-wayland updated: e9484c8148...b9c6fcb8ca
									
								
							
							
								
								
									
										2
									
								
								deps/zig-wlroots
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								deps/zig-wlroots
									
									
									
									
										vendored
									
									
								
							 Submodule deps/zig-wlroots updated: c4cdb08505...021fb4bbae
									
								
							
							
								
								
									
										2
									
								
								deps/zig-xkbcommon
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								deps/zig-xkbcommon
									
									
									
									
										vendored
									
									
								
							 Submodule deps/zig-xkbcommon updated: bfd1f97c27...e93ceb0436
									
								
							| @ -71,7 +71,7 @@ fn handleRequest(control: *zriver.ControlV1, request: zriver.ControlV1.Request, | ||||
|     switch (request) { | ||||
|         .destroy => control.destroy(), | ||||
|         .add_argument => |add_argument| { | ||||
|             const owned_slice = util.gpa.dupeZ(u8, mem.span(add_argument.argument)) catch { | ||||
|             const owned_slice = util.gpa.dupeZ(u8, mem.sliceTo(add_argument.argument, 0)) catch { | ||||
|                 control.getClient().postNoMemory(); | ||||
|                 return; | ||||
|             }; | ||||
| @ -84,7 +84,7 @@ fn handleRequest(control: *zriver.ControlV1, request: zriver.ControlV1.Request, | ||||
|             }; | ||||
|         }, | ||||
|         .run_command => |run_command| { | ||||
|             const seat = @intToPtr(*Seat, wlr.Seat.Client.fromWlSeat(run_command.seat).?.seat.data); | ||||
|             const seat: *Seat = @ptrFromInt(wlr.Seat.Client.fromWlSeat(run_command.seat).?.seat.data); | ||||
|  | ||||
|             const callback = zriver.CommandCallbackV1.create( | ||||
|                 control.getClient(), | ||||
| @ -109,7 +109,7 @@ fn handleRequest(control: *zriver.ControlV1, request: zriver.ControlV1.Request, | ||||
|                         callback.getClient().postNoMemory(); | ||||
|                         return; | ||||
|                     }, | ||||
|                     command.Error.Other => std.cstr.addNullByte(util.gpa, out.?) catch { | ||||
|                     command.Error.Other => util.gpa.dupeZ(u8, out.?) catch { | ||||
|                         callback.getClient().postNoMemory(); | ||||
|                         return; | ||||
|                     }, | ||||
|  | ||||
| @ -287,8 +287,8 @@ pub fn setTheme(self: *Self, theme: ?[*:0]const u8, _size: ?u32) !void { | ||||
|                 image.width * 4, | ||||
|                 image.width, | ||||
|                 image.height, | ||||
|                 @intCast(i32, image.hotspot_x), | ||||
|                 @intCast(i32, image.hotspot_y), | ||||
|                 @intCast(image.hotspot_x), | ||||
|                 @intCast(image.hotspot_y), | ||||
|             ); | ||||
|         } | ||||
|  | ||||
| @ -427,7 +427,7 @@ fn updateKeyboardFocus(self: Self, result: Root.AtResult) void { | ||||
| /// Requires a call to Root.applyPending() | ||||
| fn updateOutputFocus(self: Self, lx: f64, ly: f64) void { | ||||
|     if (server.root.output_layout.outputAt(lx, ly)) |wlr_output| { | ||||
|         const output = @intToPtr(*Output, wlr_output.data); | ||||
|         const output: *Output = @ptrFromInt(wlr_output.data); | ||||
|         self.seat.focusOutput(output); | ||||
|     } | ||||
| } | ||||
| @ -712,8 +712,8 @@ pub fn startMove(cursor: *Self, view: *View) void { | ||||
|  | ||||
|     const new_mode: Mode = .{ .move = .{ | ||||
|         .view = view, | ||||
|         .offset_x = @floatToInt(i32, cursor.wlr_cursor.x) - view.current.box.x, | ||||
|         .offset_y = @floatToInt(i32, cursor.wlr_cursor.y) - view.current.box.y, | ||||
|         .offset_x = @as(i32, @intFromFloat(cursor.wlr_cursor.x)) - view.current.box.x, | ||||
|         .offset_y = @as(i32, @intFromFloat(cursor.wlr_cursor.y)) - view.current.box.y, | ||||
|     } }; | ||||
|     cursor.enterMode(new_mode, view, .move); | ||||
| } | ||||
| @ -733,8 +733,8 @@ pub fn startResize(cursor: *Self, view: *View, proposed_edges: ?wlr.Edges) void | ||||
|     }; | ||||
|  | ||||
|     const box = &view.current.box; | ||||
|     const lx = @floatToInt(i32, cursor.wlr_cursor.x); | ||||
|     const ly = @floatToInt(i32, cursor.wlr_cursor.y); | ||||
|     const lx: i32 = @intFromFloat(cursor.wlr_cursor.x); | ||||
|     const ly: i32 = @intFromFloat(cursor.wlr_cursor.y); | ||||
|     const offset_x = if (edges.left) lx - box.x else box.x + box.width - lx; | ||||
|     const offset_y = if (edges.top) ly - box.y else box.y + box.height - ly; | ||||
|  | ||||
| @ -756,13 +756,13 @@ fn computeEdges(cursor: *const Self, view: *const View) wlr.Edges { | ||||
|     var output_box: wlr.Box = undefined; | ||||
|     server.root.output_layout.getBox(view.current.output.?.wlr_output, &output_box); | ||||
|  | ||||
|     const sx = @floatToInt(i32, cursor.wlr_cursor.x) - output_box.x - box.x; | ||||
|     const sy = @floatToInt(i32, cursor.wlr_cursor.y) - output_box.y - box.y; | ||||
|     const sx = @as(i32, @intFromFloat(cursor.wlr_cursor.x)) - output_box.x - box.x; | ||||
|     const sy = @as(i32, @intFromFloat(cursor.wlr_cursor.y)) - output_box.y - box.y; | ||||
|  | ||||
|     var edges: wlr.Edges = .{}; | ||||
|  | ||||
|     if (box.width > min_handle_size * 2) { | ||||
|         const handle = math.max(min_handle_size, @divFloor(box.width, 5)); | ||||
|         const handle = @max(min_handle_size, @divFloor(box.width, 5)); | ||||
|         if (sx < handle) { | ||||
|             edges.left = true; | ||||
|         } else if (sx > box.width - handle) { | ||||
| @ -771,7 +771,7 @@ fn computeEdges(cursor: *const Self, view: *const View) wlr.Edges { | ||||
|     } | ||||
|  | ||||
|     if (box.height > min_handle_size * 2) { | ||||
|         const handle = math.max(min_handle_size, @divFloor(box.height, 5)); | ||||
|         const handle = @max(min_handle_size, @divFloor(box.height, 5)); | ||||
|         if (sy < handle) { | ||||
|             edges.top = true; | ||||
|         } else if (sy > box.height - handle) { | ||||
| @ -863,7 +863,7 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64, | ||||
|             data.delta_y = dy - @trunc(dy); | ||||
|  | ||||
|             if (tag == .move) { | ||||
|                 data.view.pending.move(@floatToInt(i32, dx), @floatToInt(i32, dy)); | ||||
|                 data.view.pending.move(@intFromFloat(dx), @intFromFloat(dy)); | ||||
|             } else { | ||||
|                 // Modify width/height of the pending box, taking constraints into account | ||||
|                 // The x/y coordinates of the view will be adjusted as needed in View.resizeCommit() | ||||
| @ -880,31 +880,31 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64, | ||||
|                 if (data.edges.left) { | ||||
|                     var x1 = box.x; | ||||
|                     const x2 = box.x + box.width; | ||||
|                     x1 += @floatToInt(i32, dx); | ||||
|                     x1 = math.max(x1, border_width); | ||||
|                     x1 = math.max(x1, x2 - constraints.max_width); | ||||
|                     x1 = math.min(x1, x2 - constraints.min_width); | ||||
|                     x1 += @intFromFloat(dx); | ||||
|                     x1 = @max(x1, border_width); | ||||
|                     x1 = @max(x1, x2 - constraints.max_width); | ||||
|                     x1 = @min(x1, x2 - constraints.min_width); | ||||
|                     box.width = x2 - x1; | ||||
|                 } else if (data.edges.right) { | ||||
|                     box.width += @floatToInt(i32, dx); | ||||
|                     box.width = math.max(box.width, constraints.min_width); | ||||
|                     box.width = math.min(box.width, constraints.max_width); | ||||
|                     box.width = math.min(box.width, output_width - border_width - box.x); | ||||
|                     box.width += @intFromFloat(dx); | ||||
|                     box.width = @max(box.width, constraints.min_width); | ||||
|                     box.width = @min(box.width, constraints.max_width); | ||||
|                     box.width = @min(box.width, output_width - border_width - box.x); | ||||
|                 } | ||||
|  | ||||
|                 if (data.edges.top) { | ||||
|                     var y1 = box.y; | ||||
|                     const y2 = box.y + box.height; | ||||
|                     y1 += @floatToInt(i32, dy); | ||||
|                     y1 = math.max(y1, border_width); | ||||
|                     y1 = math.max(y1, y2 - constraints.max_height); | ||||
|                     y1 = math.min(y1, y2 - constraints.min_height); | ||||
|                     y1 += @intFromFloat(dy); | ||||
|                     y1 = @max(y1, border_width); | ||||
|                     y1 = @max(y1, y2 - constraints.max_height); | ||||
|                     y1 = @min(y1, y2 - constraints.min_height); | ||||
|                     box.height = y2 - y1; | ||||
|                 } else if (data.edges.bottom) { | ||||
|                     box.height += @floatToInt(i32, dy); | ||||
|                     box.height = math.max(box.height, constraints.min_height); | ||||
|                     box.height = math.min(box.height, constraints.max_height); | ||||
|                     box.height = math.min(box.height, output_height - border_width - box.y); | ||||
|                     box.height += @intFromFloat(dy); | ||||
|                     box.height = @max(box.height, constraints.min_height); | ||||
|                     box.height = @min(box.height, constraints.max_height); | ||||
|                     box.height = @min(box.height, output_height - border_width - box.y); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @ -943,8 +943,9 @@ fn updateFocusFollowsCursorTarget(self: *Self) void { | ||||
|                 // in order to avoid clashes with cursor warping on focus change. | ||||
|                 var output_layout_box: wlr.Box = undefined; | ||||
|                 server.root.output_layout.getBox(view.current.output.?.wlr_output, &output_layout_box); | ||||
|                 const cursor_ox = self.wlr_cursor.x - @intToFloat(f64, output_layout_box.x); | ||||
|                 const cursor_oy = self.wlr_cursor.y - @intToFloat(f64, output_layout_box.y); | ||||
|  | ||||
|                 const cursor_ox = self.wlr_cursor.x - @as(f64, @floatFromInt(output_layout_box.x)); | ||||
|                 const cursor_oy = self.wlr_cursor.y - @as(f64, @floatFromInt(output_layout_box.y)); | ||||
|                 if (view.current.box.containsPoint(cursor_ox, cursor_oy)) { | ||||
|                     self.focus_follows_cursor_target = view; | ||||
|                 } | ||||
| @ -981,7 +982,7 @@ pub fn updateState(self: *Self) void { | ||||
|             if (!self.hidden) { | ||||
|                 var now: os.timespec = undefined; | ||||
|                 os.clock_gettime(os.CLOCK.MONOTONIC, &now) catch @panic("CLOCK_MONOTONIC not supported"); | ||||
|                 const msec = @intCast(u32, now.tv_sec * std.time.ms_per_s + | ||||
|                 const msec: u32 = @intCast(now.tv_sec * std.time.ms_per_s + | ||||
|                     @divTrunc(now.tv_nsec, std.time.ns_per_ms)); | ||||
|                 self.passthrough(msec); | ||||
|             } | ||||
| @ -998,20 +999,20 @@ pub fn updateState(self: *Self) void { | ||||
|  | ||||
|             // Keep the cursor locked to the original offset from the edges of the view. | ||||
|             const box = &data.view.current.box; | ||||
|             const new_x = blk: { | ||||
|             const new_x: f64 = blk: { | ||||
|                 if (mode == .move or data.edges.left) { | ||||
|                     break :blk @intToFloat(f64, data.offset_x + box.x); | ||||
|                     break :blk @floatFromInt(data.offset_x + box.x); | ||||
|                 } else if (data.edges.right) { | ||||
|                     break :blk @intToFloat(f64, box.x + box.width - data.offset_x); | ||||
|                     break :blk @floatFromInt(box.x + box.width - data.offset_x); | ||||
|                 } else { | ||||
|                     break :blk self.wlr_cursor.x; | ||||
|                 } | ||||
|             }; | ||||
|             const new_y = blk: { | ||||
|             const new_y: f64 = blk: { | ||||
|                 if (mode == .move or data.edges.top) { | ||||
|                     break :blk @intToFloat(f64, data.offset_y + box.y); | ||||
|                     break :blk @floatFromInt(data.offset_y + box.y); | ||||
|                 } else if (data.edges.bottom) { | ||||
|                     break :blk @intToFloat(f64, box.y + box.height - data.offset_y); | ||||
|                     break :blk @floatFromInt(box.y + box.height - data.offset_y); | ||||
|                 } else { | ||||
|                     break :blk self.wlr_cursor.y; | ||||
|                 } | ||||
| @ -1083,8 +1084,8 @@ fn warp(self: *Self) void { | ||||
|         (usable_layout_box.containsPoint(self.wlr_cursor.x, self.wlr_cursor.y) and | ||||
|         !target_box.containsPoint(self.wlr_cursor.x, self.wlr_cursor.y))) | ||||
|     { | ||||
|         const lx = @intToFloat(f64, target_box.x + @divTrunc(target_box.width, 2)); | ||||
|         const ly = @intToFloat(f64, target_box.y + @divTrunc(target_box.height, 2)); | ||||
|         const lx: f64 = @floatFromInt(target_box.x + @divTrunc(target_box.width, 2)); | ||||
|         const ly: f64 = @floatFromInt(target_box.y + @divTrunc(target_box.height, 2)); | ||||
|         if (!self.wlr_cursor.warp(null, lx, ly)) { | ||||
|             log.err("failed to warp cursor on focus change", .{}); | ||||
|         } | ||||
| @ -1094,7 +1095,7 @@ fn warp(self: *Self) void { | ||||
| fn updateDragIcons(self: *Self) void { | ||||
|     var it = server.root.drag_icons.children.iterator(.forward); | ||||
|     while (it.next()) |node| { | ||||
|         const icon = @intToPtr(*DragIcon, node.data); | ||||
|         const icon = @as(*DragIcon, @ptrFromInt(node.data)); | ||||
|  | ||||
|         if (icon.wlr_drag_icon.drag.seat != self.seat.wlr_seat) continue; | ||||
|  | ||||
| @ -1102,16 +1103,16 @@ fn updateDragIcons(self: *Self) void { | ||||
|             .keyboard => unreachable, | ||||
|             .keyboard_pointer => { | ||||
|                 icon.tree.node.setPosition( | ||||
|                     @floatToInt(c_int, self.wlr_cursor.x), | ||||
|                     @floatToInt(c_int, self.wlr_cursor.y), | ||||
|                     @intFromFloat(self.wlr_cursor.x), | ||||
|                     @intFromFloat(self.wlr_cursor.y), | ||||
|                 ); | ||||
|             }, | ||||
|             .keyboard_touch => { | ||||
|                 const touch_id = icon.wlr_drag_icon.drag.touch_id; | ||||
|                 const point = self.touch_points.get(touch_id) orelse continue; | ||||
|                 icon.tree.node.setPosition( | ||||
|                     @floatToInt(c_int, point.lx), | ||||
|                     @floatToInt(c_int, point.ly), | ||||
|                     @intFromFloat(point.lx), | ||||
|                     @intFromFloat(point.ly), | ||||
|                 ); | ||||
|             }, | ||||
|         } | ||||
|  | ||||
| @ -47,7 +47,7 @@ pub fn create(wlr_drag_icon: *wlr.Drag.Icon) error{OutOfMemory}!void { | ||||
|         .tree = tree, | ||||
|         .surface = try tree.createSceneSubsurfaceTree(wlr_drag_icon.surface), | ||||
|     }; | ||||
|     tree.node.data = @ptrToInt(drag_icon); | ||||
|     tree.node.data = @intFromPtr(drag_icon); | ||||
|  | ||||
|     tree.node.setEnabled(wlr_drag_icon.mapped); | ||||
|  | ||||
|  | ||||
| @ -89,7 +89,7 @@ fn handleForeignActivate( | ||||
| ) void { | ||||
|     const handle = @fieldParentPtr(ForeignToplevelHandle, "foreign_activate", listener); | ||||
|     const view = @fieldParentPtr(View, "foreign_toplevel_handle", handle); | ||||
|     const seat = @intToPtr(*Seat, event.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(event.seat.data); | ||||
|  | ||||
|     seat.focus(view); | ||||
|     server.root.applyPending(); | ||||
|  | ||||
| @ -281,10 +281,7 @@ pub fn deinit(self: *Self) void { | ||||
| } | ||||
|  | ||||
| pub fn apply(self: *Self, device: *InputDevice) void { | ||||
|     const libinput_device = @ptrCast( | ||||
|         *c.libinput_device, | ||||
|         device.wlr_device.getLibinputDevice() orelse return, | ||||
|     ); | ||||
|     const libinput_device: *c.libinput_device = @ptrCast(device.wlr_device.getLibinputDevice() orelse return); | ||||
|     log.debug("applying input configuration to device: {s}", .{device.identifier}); | ||||
|     if (self.event_state) |setting| setting.apply(libinput_device); | ||||
|     if (self.accel_profile) |setting| setting.apply(libinput_device); | ||||
|  | ||||
| @ -57,13 +57,13 @@ pub fn init(device: *InputDevice, seat: *Seat, wlr_device: *wlr.InputDevice) !vo | ||||
|             device_type, | ||||
|             wlr_device.vendor, | ||||
|             wlr_device.product, | ||||
|             mem.trim(u8, mem.span(wlr_device.name), &ascii.spaces), | ||||
|             mem.trim(u8, mem.sliceTo(wlr_device.name, 0), &ascii.whitespace), | ||||
|         }, | ||||
|     ); | ||||
|     errdefer util.gpa.free(identifier); | ||||
|  | ||||
|     for (identifier) |*char| { | ||||
|         if (!ascii.isGraph(char.*)) { | ||||
|         if (!ascii.isPrint(char.*) or ascii.isWhitespace(char.*)) { | ||||
|             char.* = '_'; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -145,7 +145,7 @@ fn handleNewVirtualKeyboard( | ||||
|     _: *wl.Listener(*wlr.VirtualKeyboardV1), | ||||
|     virtual_keyboard: *wlr.VirtualKeyboardV1, | ||||
| ) void { | ||||
|     const seat = @intToPtr(*Seat, virtual_keyboard.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(virtual_keyboard.seat.data); | ||||
|     seat.addDevice(&virtual_keyboard.keyboard.base); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -47,7 +47,7 @@ pub fn init(self: *Self, seat: *Seat, wlr_device: *wlr.InputDevice) !void { | ||||
|     errdefer self.device.deinit(); | ||||
|  | ||||
|     const wlr_keyboard = self.device.wlr_device.toKeyboard(); | ||||
|     wlr_keyboard.data = @ptrToInt(self); | ||||
|     wlr_keyboard.data = @intFromPtr(self); | ||||
|  | ||||
|     // wlroots will log a more detailed error if this fails. | ||||
|     if (!wlr_keyboard.setKeymap(server.config.keymap)) return error.OutOfMemory; | ||||
| @ -127,7 +127,7 @@ fn handleKey(listener: *wl.Listener(*wlr.Keyboard.event.Key), event: *wlr.Keyboa | ||||
| } | ||||
|  | ||||
| fn isModifier(keysym: xkb.Keysym) bool { | ||||
|     return @enumToInt(keysym) >= xkb.Keysym.Shift_L and @enumToInt(keysym) <= xkb.Keysym.Hyper_R; | ||||
|     return @intFromEnum(keysym) >= xkb.Keysym.Shift_L and @intFromEnum(keysym) <= xkb.Keysym.Hyper_R; | ||||
| } | ||||
|  | ||||
| fn handleModifiers(listener: *wl.Listener(*wlr.Keyboard), _: *wlr.Keyboard) void { | ||||
| @ -144,12 +144,12 @@ fn handleModifiers(listener: *wl.Listener(*wlr.Keyboard), _: *wlr.Keyboard) void | ||||
| /// Handle any builtin, harcoded compsitor mappings such as VT switching. | ||||
| /// Returns true if the keysym was handled. | ||||
| fn handleBuiltinMapping(keysym: xkb.Keysym) bool { | ||||
|     switch (@enumToInt(keysym)) { | ||||
|     switch (@intFromEnum(keysym)) { | ||||
|         xkb.Keysym.XF86Switch_VT_1...xkb.Keysym.XF86Switch_VT_12 => { | ||||
|             log.debug("switch VT keysym received", .{}); | ||||
|             if (server.backend.isMulti()) { | ||||
|                 if (server.backend.getSession()) |session| { | ||||
|                     const vt = @enumToInt(keysym) - xkb.Keysym.XF86Switch_VT_1 + 1; | ||||
|                     const vt = @intFromEnum(keysym) - xkb.Keysym.XF86Switch_VT_1 + 1; | ||||
|                     const log_server = std.log.scoped(.server); | ||||
|                     log_server.info("switching to VT {}", .{vt}); | ||||
|                     session.changeVt(vt) catch log_server.err("changing VT failed", .{}); | ||||
|  | ||||
| @ -28,8 +28,8 @@ len: usize = 0, | ||||
| pub fn add(self: *Self, new: u32) void { | ||||
|     for (self.items[0..self.len]) |item| if (new == item) return; | ||||
|  | ||||
|     comptime assert(@typeInfo(std.meta.fieldInfo(Self, .items).field_type).Array.len == | ||||
|         @typeInfo(std.meta.fieldInfo(wlr.Keyboard, .keycodes).field_type).Array.len); | ||||
|     comptime assert(@typeInfo(std.meta.fieldInfo(Self, .items).type).Array.len == | ||||
|         @typeInfo(std.meta.fieldInfo(wlr.Keyboard, .keycodes).type).Array.len); | ||||
|  | ||||
|     if (self.len == self.items.len) { | ||||
|         log.err("KeycodeSet limit reached, code {d} omitted", .{new}); | ||||
| @ -41,7 +41,7 @@ pub fn add(self: *Self, new: u32) void { | ||||
| } | ||||
|  | ||||
| pub fn remove(self: *Self, old: u32) bool { | ||||
|     for (self.items[0..self.len]) |item, idx| if (old == item) { | ||||
|     for (self.items[0..self.len], 0..) |item, idx| if (old == item) { | ||||
|         self.len -= 1; | ||||
|         if (self.len > 0) self.items[idx] = self.items[self.len]; | ||||
|  | ||||
|  | ||||
| @ -43,7 +43,7 @@ commit: wl.Listener(*wlr.Surface) = wl.Listener(*wlr.Surface).init(handleCommit) | ||||
| new_popup: wl.Listener(*wlr.XdgPopup) = wl.Listener(*wlr.XdgPopup).init(handleNewPopup), | ||||
|  | ||||
| pub fn create(wlr_layer_surface: *wlr.LayerSurfaceV1) error{OutOfMemory}!void { | ||||
|     const output = @intToPtr(*Output, wlr_layer_surface.output.?.data); | ||||
|     const output: *Output = @ptrFromInt(wlr_layer_surface.output.?.data); | ||||
|     const layer_surface = try util.gpa.create(LayerSurface); | ||||
|     errdefer util.gpa.destroy(layer_surface); | ||||
|  | ||||
| @ -55,12 +55,12 @@ pub fn create(wlr_layer_surface: *wlr.LayerSurfaceV1) error{OutOfMemory}!void { | ||||
|         .scene_layer_surface = try layer_tree.createSceneLayerSurfaceV1(wlr_layer_surface), | ||||
|         .popup_tree = try output.layers.popups.createSceneTree(), | ||||
|     }; | ||||
|     wlr_layer_surface.data = @ptrToInt(layer_surface); | ||||
|     wlr_layer_surface.data = @intFromPtr(layer_surface); | ||||
|  | ||||
|     try SceneNodeData.attach(&layer_surface.scene_layer_surface.tree.node, .{ .layer_surface = layer_surface }); | ||||
|     try SceneNodeData.attach(&layer_surface.popup_tree.node, .{ .layer_surface = layer_surface }); | ||||
|  | ||||
|     wlr_layer_surface.surface.data = @ptrToInt(&layer_surface.scene_layer_surface.tree.node); | ||||
|     wlr_layer_surface.surface.data = @intFromPtr(&layer_surface.scene_layer_surface.tree.node); | ||||
|  | ||||
|     wlr_layer_surface.events.destroy.add(&layer_surface.destroy); | ||||
|     wlr_layer_surface.events.map.add(&layer_surface.map); | ||||
| @ -131,7 +131,7 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), _: *wlr.Surface) void { | ||||
|     // If a surface is committed while it is not mapped, we must send a configure. | ||||
|     // TODO: this mapped check is not correct as it will be true in the commit | ||||
|     // that triggers the unmap as well. | ||||
|     if (!wlr_layer_surface.mapped or @bitCast(u32, wlr_layer_surface.current.committed) != 0) { | ||||
|     if (!wlr_layer_surface.mapped or @as(u32, @bitCast(wlr_layer_surface.current.committed)) != 0) { | ||||
|         layer_surface.output.arrangeLayers(); | ||||
|         handleKeyboardInteractiveExclusive(layer_surface.output); | ||||
|         server.root.applyPending(); | ||||
| @ -150,7 +150,7 @@ fn handleKeyboardInteractiveExclusive(output: *Output) void { | ||||
|         var it = tree.children.iterator(.reverse); | ||||
|         while (it.next()) |node| { | ||||
|             assert(node.type == .tree); | ||||
|             if (@intToPtr(?*SceneNodeData, node.data)) |node_data| { | ||||
|             if (@as(?*SceneNodeData, @ptrFromInt(node.data))) |node_data| { | ||||
|                 const layer_surface = node_data.data.layer_surface; | ||||
|                 const wlr_layer_surface = layer_surface.wlr_layer_surface; | ||||
|                 if (wlr_layer_surface.mapped and | ||||
|  | ||||
| @ -109,8 +109,8 @@ pub fn startLayoutDemand(self: *Self, views: u32) void { | ||||
|  | ||||
|     self.layout.sendLayoutDemand( | ||||
|         views, | ||||
|         @intCast(u32, self.output.usable_box.width), | ||||
|         @intCast(u32, self.output.usable_box.height), | ||||
|         @intCast(self.output.usable_box.width), | ||||
|         @intCast(self.output.usable_box.height), | ||||
|         self.output.pending.tags, | ||||
|         self.output.inflight.layout_demand.?.serial, | ||||
|     ); | ||||
| @ -138,8 +138,8 @@ fn handleRequest(layout: *river.LayoutV3, request: river.LayoutV3.Request, self: | ||||
|                 layout_demand.pushViewDimensions( | ||||
|                     req.x, | ||||
|                     req.y, | ||||
|                     @intCast(u31, math.min(math.maxInt(u31), req.width)), | ||||
|                     @intCast(u31, math.min(math.maxInt(u31), req.height)), | ||||
|                     @min(math.maxInt(u31), req.width), | ||||
|                     @min(math.maxInt(u31), req.height), | ||||
|                 ); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
| @ -52,7 +52,7 @@ pub fn init(layout: *Layout, views: u32) !Self { | ||||
|  | ||||
|     return Self{ | ||||
|         .serial = server.wl_server.nextSerial(), | ||||
|         .views = @intCast(i32, views), | ||||
|         .views = @intCast(views), | ||||
|         .view_boxen = try util.gpa.alloc(wlr.Box, views), | ||||
|         .timeout_timer = timeout_timer, | ||||
|     }; | ||||
| @ -86,7 +86,7 @@ pub fn pushViewDimensions(self: *Self, x: i32, y: i32, width: u31, height: u31) | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     self.view_boxen[self.view_boxen.len - @intCast(usize, self.views)] = .{ | ||||
|     self.view_boxen[self.view_boxen.len - @as(usize, @intCast(self.views))] = .{ | ||||
|         .x = x, | ||||
|         .y = y, | ||||
|         .width = width, | ||||
| @ -114,7 +114,7 @@ pub fn apply(self: *Self, layout: *Layout) void { | ||||
|     if (self.views != 0) { | ||||
|         log.err( | ||||
|             "proposed dimension count ({}) does not match view count ({}), aborting layout demand", | ||||
|             .{ -self.views + @intCast(i32, self.view_boxen.len), self.view_boxen.len }, | ||||
|             .{ -self.views + @as(i32, @intCast(self.view_boxen.len)), self.view_boxen.len }, | ||||
|         ); | ||||
|         layout.layout.postError( | ||||
|             .count_mismatch, | ||||
|  | ||||
| @ -68,7 +68,7 @@ fn handleRequest( | ||||
|         .get_layout => |req| { | ||||
|             // Ignore if the output is inert | ||||
|             const wlr_output = wlr.Output.fromWlOutput(req.output) orelse return; | ||||
|             const output = @intToPtr(*Output, wlr_output.data); | ||||
|             const output: *Output = @ptrFromInt(wlr_output.data); | ||||
|  | ||||
|             log.debug("bind layout '{s}' on output '{s}'", .{ req.namespace, output.wlr_output.name }); | ||||
|  | ||||
| @ -77,7 +77,7 @@ fn handleRequest( | ||||
|                 layout_manager.getVersion(), | ||||
|                 req.id, | ||||
|                 output, | ||||
|                 mem.span(req.namespace), | ||||
|                 mem.sliceTo(req.namespace, 0), | ||||
|             ) catch { | ||||
|                 layout_manager.getClient().postNoMemory(); | ||||
|                 log.err("out of memory", .{}); | ||||
|  | ||||
| @ -43,7 +43,7 @@ pub fn create(wlr_lock_surface: *wlr.SessionLockSurfaceV1, lock: *wlr.SessionLoc | ||||
|         .wlr_lock_surface = wlr_lock_surface, | ||||
|         .lock = lock, | ||||
|     }; | ||||
|     wlr_lock_surface.data = @ptrToInt(lock_surface); | ||||
|     wlr_lock_surface.data = @intFromPtr(lock_surface); | ||||
|  | ||||
|     const output = lock_surface.getOutput(); | ||||
|     const tree = try output.locked_content.createSceneSubsurfaceTree(wlr_lock_surface.surface); | ||||
| @ -51,7 +51,7 @@ pub fn create(wlr_lock_surface: *wlr.SessionLockSurfaceV1, lock: *wlr.SessionLoc | ||||
|  | ||||
|     try SceneNodeData.attach(&tree.node, .{ .lock_surface = lock_surface }); | ||||
|  | ||||
|     wlr_lock_surface.surface.data = @ptrToInt(&tree.node); | ||||
|     wlr_lock_surface.surface.data = @intFromPtr(&tree.node); | ||||
|  | ||||
|     wlr_lock_surface.output.events.mode.add(&lock_surface.output_mode); | ||||
|     wlr_lock_surface.events.map.add(&lock_surface.map); | ||||
| @ -65,7 +65,7 @@ pub fn destroy(lock_surface: *LockSurface) void { | ||||
|         var surface_it = lock_surface.lock.surfaces.iterator(.forward); | ||||
|         const new_focus: Seat.FocusTarget = while (surface_it.next()) |surface| { | ||||
|             if (surface != lock_surface.wlr_lock_surface) | ||||
|                 break .{ .lock_surface = @intToPtr(*LockSurface, surface.data) }; | ||||
|                 break .{ .lock_surface = @ptrFromInt(surface.data) }; | ||||
|         } else .none; | ||||
|  | ||||
|         var seat_it = server.input_manager.seats.first; | ||||
| @ -86,7 +86,7 @@ pub fn destroy(lock_surface: *LockSurface) void { | ||||
| } | ||||
|  | ||||
| fn getOutput(lock_surface: *LockSurface) *Output { | ||||
|     return @intToPtr(*Output, lock_surface.wlr_lock_surface.output.data); | ||||
|     return @ptrFromInt(lock_surface.wlr_lock_surface.output.data); | ||||
| } | ||||
|  | ||||
| fn handleOutputMode(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { | ||||
| @ -95,7 +95,7 @@ fn handleOutputMode(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void { | ||||
|     var output_width: i32 = undefined; | ||||
|     var output_height: i32 = undefined; | ||||
|     lock_surface.getOutput().wlr_output.effectiveResolution(&output_width, &output_height); | ||||
|     _ = lock_surface.wlr_lock_surface.configure(@intCast(u32, output_width), @intCast(u32, output_height)); | ||||
|     _ = lock_surface.wlr_lock_surface.configure(@intCast(output_width), @intCast(output_height)); | ||||
| } | ||||
|  | ||||
| fn handleMap(listener: *wl.Listener(void)) void { | ||||
|  | ||||
| @ -45,7 +45,7 @@ pub fn init( | ||||
| ) !Self { | ||||
|     const owned_args = try util.gpa.alloc([:0]u8, command_args.len); | ||||
|     errdefer util.gpa.free(owned_args); | ||||
|     for (command_args) |arg, i| { | ||||
|     for (command_args, 0..) |arg, i| { | ||||
|         errdefer for (owned_args[0..i]) |a| util.gpa.free(a); | ||||
|         owned_args[i] = try util.gpa.dupeZ(u8, arg); | ||||
|     } | ||||
|  | ||||
| @ -257,7 +257,7 @@ pub fn create(wlr_output: *wlr.Output) !void { | ||||
|         }, | ||||
|         .status = undefined, | ||||
|     }; | ||||
|     wlr_output.data = @ptrToInt(output); | ||||
|     wlr_output.data = @intFromPtr(output); | ||||
|  | ||||
|     output.pending.focus_stack.init(); | ||||
|     output.pending.wm_stack.init(); | ||||
| @ -299,7 +299,7 @@ pub fn layerSurfaceTree(self: Self, layer: zwlr.LayerShellV1.Layer) *wlr.SceneTr | ||||
|         self.layers.top, | ||||
|         self.layers.overlay, | ||||
|     }; | ||||
|     return trees[@intCast(usize, @enumToInt(layer))]; | ||||
|     return trees[@intCast(@intFromEnum(layer))]; | ||||
| } | ||||
|  | ||||
| /// Arrange all layer surfaces of this output and adjust the usable area. | ||||
| @ -336,7 +336,7 @@ fn sendLayerConfigures( | ||||
|         var it = tree.children.iterator(.forward); | ||||
|         while (it.next()) |node| { | ||||
|             assert(node.type == .tree); | ||||
|             if (@intToPtr(?*SceneNodeData, node.data)) |node_data| { | ||||
|             if (@as(?*SceneNodeData, @ptrFromInt(node.data))) |node_data| { | ||||
|                 const layer_surface = node_data.data.layer_surface; | ||||
|  | ||||
|                 const exclusive = layer_surface.wlr_layer_surface.current.exclusive_zone > 0; | ||||
|  | ||||
| @ -47,7 +47,7 @@ set_region: wl.Listener(void) = wl.Listener(void).init(handleSetRegion), | ||||
| node_destroy: wl.Listener(void) = wl.Listener(void).init(handleNodeDestroy), | ||||
|  | ||||
| pub fn create(wlr_constraint: *wlr.PointerConstraintV1) error{OutOfMemory}!void { | ||||
|     const seat = @intToPtr(*Seat, wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(wlr_constraint.seat.data); | ||||
|  | ||||
|     const constraint = try util.gpa.create(PointerConstraint); | ||||
|     errdefer util.gpa.destroy(constraint); | ||||
| @ -55,7 +55,7 @@ pub fn create(wlr_constraint: *wlr.PointerConstraintV1) error{OutOfMemory}!void | ||||
|     constraint.* = .{ | ||||
|         .wlr_constraint = wlr_constraint, | ||||
|     }; | ||||
|     wlr_constraint.data = @ptrToInt(constraint); | ||||
|     wlr_constraint.data = @intFromPtr(constraint); | ||||
|  | ||||
|     wlr_constraint.events.destroy.add(&constraint.destroy); | ||||
|     wlr_constraint.events.set_region.add(&constraint.set_region); | ||||
| @ -70,7 +70,7 @@ pub fn create(wlr_constraint: *wlr.PointerConstraintV1) error{OutOfMemory}!void | ||||
| } | ||||
|  | ||||
| pub fn maybeActivate(constraint: *PointerConstraint) void { | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     assert(seat.cursor.constraint == constraint); | ||||
|     assert(seat.wlr_seat.keyboard_state.focused_surface == constraint.wlr_constraint.surface); | ||||
| @ -82,8 +82,8 @@ pub fn maybeActivate(constraint: *PointerConstraint) void { | ||||
|     const result = server.root.at(seat.cursor.wlr_cursor.x, seat.cursor.wlr_cursor.y) orelse return; | ||||
|     if (result.surface != constraint.wlr_constraint.surface) return; | ||||
|  | ||||
|     const sx = @floatToInt(i32, result.sx); | ||||
|     const sy = @floatToInt(i32, result.sy); | ||||
|     const sx: i32 = @intFromFloat(result.sx); | ||||
|     const sy: i32 = @intFromFloat(result.sy); | ||||
|     if (!constraint.wlr_constraint.region.containsPoint(sx, sy, null)) return; | ||||
|  | ||||
|     assert(constraint.state == .inactive); | ||||
| @ -103,7 +103,7 @@ pub fn maybeActivate(constraint: *PointerConstraint) void { | ||||
|  | ||||
| /// Called when the cursor position or content in the scene graph changes | ||||
| pub fn updateState(constraint: *PointerConstraint) void { | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     assert(seat.wlr_seat.keyboard_state.focused_surface == constraint.wlr_constraint.surface); | ||||
|  | ||||
| @ -119,8 +119,8 @@ pub fn updateState(constraint: *PointerConstraint) void { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const warp_lx = @intToFloat(f64, lx) + constraint.state.active.sx; | ||||
|     const warp_ly = @intToFloat(f64, ly) + constraint.state.active.sy; | ||||
|     const warp_lx = @as(f64, @floatFromInt(lx)) + constraint.state.active.sx; | ||||
|     const warp_ly = @as(f64, @floatFromInt(ly)) + constraint.state.active.sy; | ||||
|     if (!seat.cursor.wlr_cursor.warp(null, warp_lx, warp_ly)) { | ||||
|         log.info("deactivating pointer constraint, could not warp cursor", .{}); | ||||
|         constraint.deactivate(); | ||||
| @ -147,7 +147,7 @@ pub fn confine(constraint: *PointerConstraint, dx: *f64, dy: *f64) void { | ||||
| } | ||||
|  | ||||
| pub fn deactivate(constraint: *PointerConstraint) void { | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     assert(seat.cursor.constraint == constraint); | ||||
|     assert(constraint.state == .active); | ||||
| @ -160,7 +160,7 @@ pub fn deactivate(constraint: *PointerConstraint) void { | ||||
| } | ||||
|  | ||||
| fn warpToHintIfSet(constraint: *PointerConstraint) void { | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     if (constraint.wlr_constraint.current.committed.cursor_hint) { | ||||
|         var lx: i32 = undefined; | ||||
| @ -169,7 +169,7 @@ fn warpToHintIfSet(constraint: *PointerConstraint) void { | ||||
|  | ||||
|         const sx = constraint.wlr_constraint.current.cursor_hint.x; | ||||
|         const sy = constraint.wlr_constraint.current.cursor_hint.y; | ||||
|         _ = seat.cursor.wlr_cursor.warp(null, @intToFloat(f64, lx) + sx, @intToFloat(f64, ly) + sy); | ||||
|         _ = seat.cursor.wlr_cursor.warp(null, @as(f64, @floatFromInt(lx)) + sx, @as(f64, @floatFromInt(ly)) + sy); | ||||
|         _ = seat.wlr_seat.pointerWarp(sx, sy); | ||||
|     } | ||||
| } | ||||
| @ -183,7 +183,7 @@ fn handleNodeDestroy(listener: *wl.Listener(void)) void { | ||||
|  | ||||
| fn handleDestroy(listener: *wl.Listener(*wlr.PointerConstraintV1), _: *wlr.PointerConstraintV1) void { | ||||
|     const constraint = @fieldParentPtr(PointerConstraint, "destroy", listener); | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     if (constraint.state == .active) { | ||||
|         // We can't simply call deactivate() here as it calls sendDeactivated(), | ||||
| @ -205,12 +205,12 @@ fn handleDestroy(listener: *wl.Listener(*wlr.PointerConstraintV1), _: *wlr.Point | ||||
|  | ||||
| fn handleSetRegion(listener: *wl.Listener(void)) void { | ||||
|     const constraint = @fieldParentPtr(PointerConstraint, "set_region", listener); | ||||
|     const seat = @intToPtr(*Seat, constraint.wlr_constraint.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(constraint.wlr_constraint.seat.data); | ||||
|  | ||||
|     switch (constraint.state) { | ||||
|         .active => |state| { | ||||
|             const sx = @floatToInt(i32, state.sx); | ||||
|             const sy = @floatToInt(i32, state.sy); | ||||
|             const sx: i32 = @intFromFloat(state.sx); | ||||
|             const sy: i32 = @intFromFloat(state.sy); | ||||
|             if (!constraint.wlr_constraint.region.containsPoint(sx, sy, null)) { | ||||
|                 log.info("deactivating pointer constraint, region change left pointer outside constraint", .{}); | ||||
|                 constraint.deactivate(); | ||||
|  | ||||
| @ -52,7 +52,7 @@ pub fn init( | ||||
|             const arena_allocator = arena.allocator(); | ||||
|  | ||||
|             const owned_args = try arena_allocator.alloc([:0]const u8, command_args.len); | ||||
|             for (command_args) |arg, i| { | ||||
|             for (command_args, 0..) |arg, i| { | ||||
|                 owned_args[i] = try arena_allocator.dupeZ(u8, arg); | ||||
|             } | ||||
|  | ||||
|  | ||||
| @ -312,7 +312,7 @@ pub fn deactivateOutput(root: *Self, output: *Output) void { | ||||
|         var it = tree.children.safeIterator(.forward); | ||||
|         while (it.next()) |scene_node| { | ||||
|             assert(scene_node.type == .tree); | ||||
|             if (@intToPtr(?*SceneNodeData, scene_node.data)) |node_data| { | ||||
|             if (@as(?*SceneNodeData, @ptrFromInt(scene_node.data))) |node_data| { | ||||
|                 node_data.data.layer_surface.wlr_layer_surface.destroy(); | ||||
|             } | ||||
|         } | ||||
| @ -751,7 +751,7 @@ fn processOutputConfig( | ||||
|     var it = config.heads.iterator(.forward); | ||||
|     while (it.next()) |head| { | ||||
|         const wlr_output = head.state.output; | ||||
|         const output = @intToPtr(*Output, wlr_output.data); | ||||
|         const output: *Output = @ptrFromInt(wlr_output.data); | ||||
|  | ||||
|         var proposed_state = wlr.Output.State.init(); | ||||
|         head.state.apply(&proposed_state); | ||||
|  | ||||
| @ -45,7 +45,7 @@ pub fn attach(node: *wlr.SceneNode, data: Data) error{OutOfMemory}!void { | ||||
|         .node = node, | ||||
|         .data = data, | ||||
|     }; | ||||
|     node.data = @ptrToInt(scene_node_data); | ||||
|     node.data = @intFromPtr(scene_node_data); | ||||
|  | ||||
|     node.events.destroy.add(&scene_node_data.destroy); | ||||
| } | ||||
| @ -53,7 +53,7 @@ pub fn attach(node: *wlr.SceneNode, data: Data) error{OutOfMemory}!void { | ||||
| pub fn fromNode(node: *wlr.SceneNode) ?*SceneNodeData { | ||||
|     var it: ?*wlr.SceneNode = node; | ||||
|     while (it) |n| : (it = n.parent) { | ||||
|         if (@intToPtr(?*SceneNodeData, n.data)) |scene_node_data| { | ||||
|         if (@as(?*SceneNodeData, @ptrFromInt(n.data))) |scene_node_data| { | ||||
|             return scene_node_data; | ||||
|         } | ||||
|     } | ||||
| @ -62,7 +62,7 @@ pub fn fromNode(node: *wlr.SceneNode) ?*SceneNodeData { | ||||
|  | ||||
| pub fn fromSurface(surface: *wlr.Surface) ?*SceneNodeData { | ||||
|     if (surface.getRootSurface()) |root_surface| { | ||||
|         if (@intToPtr(?*wlr.SceneNode, root_surface.data)) |node| { | ||||
|         if (@as(?*wlr.SceneNode, @ptrFromInt(root_surface.data))) |node| { | ||||
|             return fromNode(node); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -107,7 +107,7 @@ pub fn init(self: *Self, name: [*:0]const u8) !void { | ||||
|         .wlr_seat = try wlr.Seat.create(server.wl_server, name), | ||||
|         .mapping_repeat_timer = mapping_repeat_timer, | ||||
|     }; | ||||
|     self.wlr_seat.data = @ptrToInt(self); | ||||
|     self.wlr_seat.data = @intFromPtr(self); | ||||
|  | ||||
|     try self.cursor.init(self); | ||||
|  | ||||
| @ -267,7 +267,8 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void { | ||||
|             if (self.cursor.constraint) |constraint| { | ||||
|                 assert(constraint.wlr_constraint == wlr_constraint); | ||||
|             } else { | ||||
|                 self.cursor.constraint = @intToPtr(*PointerConstraint, wlr_constraint.data); | ||||
|                 self.cursor.constraint = @ptrFromInt(wlr_constraint.data); | ||||
|                 assert(self.cursor.constraint != null); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -299,7 +300,7 @@ fn keyboardNotifyEnter(self: *Self, wlr_surface: *wlr.Surface) void { | ||||
|             .len = wlr_keyboard.num_keycodes, | ||||
|         }; | ||||
|  | ||||
|         const keyboard = @intToPtr(*Keyboard, wlr_keyboard.data); | ||||
|         const keyboard: *Keyboard = @ptrFromInt(wlr_keyboard.data); | ||||
|         keycodes.subtract(keyboard.eaten_keycodes); | ||||
|  | ||||
|         self.wlr_seat.keyboardNotifyEnter( | ||||
|  | ||||
| @ -214,7 +214,7 @@ fn handleNewToplevelDecoration( | ||||
|     _: *wl.Listener(*wlr.XdgToplevelDecorationV1), | ||||
|     wlr_decoration: *wlr.XdgToplevelDecorationV1, | ||||
| ) void { | ||||
|     const xdg_toplevel = @intToPtr(*XdgToplevel, wlr_decoration.surface.data); | ||||
|     const xdg_toplevel: *XdgToplevel = @ptrFromInt(wlr_decoration.surface.data); | ||||
|  | ||||
|     // TODO(wlroots): The next wlroots version will handle this for us | ||||
|     if (xdg_toplevel.decoration != null) { | ||||
| @ -236,7 +236,7 @@ fn handleNewLayerSurface(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_ | ||||
|         .{ | ||||
|             wlr_layer_surface.namespace, | ||||
|             @tagName(wlr_layer_surface.current.layer), | ||||
|             @bitCast(u32, wlr_layer_surface.current.anchor), | ||||
|             @as(u32, @bitCast(wlr_layer_surface.current.anchor)), | ||||
|             wlr_layer_surface.current.desired_width, | ||||
|             wlr_layer_surface.current.desired_height, | ||||
|             wlr_layer_surface.current.margin.top, | ||||
|  | ||||
| @ -69,7 +69,7 @@ fn handleRequest( | ||||
|         .get_river_output_status => |req| { | ||||
|             // ignore if the output is inert | ||||
|             const wlr_output = wlr.Output.fromWlOutput(req.output) orelse return; | ||||
|             const output = @intToPtr(*Output, wlr_output.data); | ||||
|             const output: *Output = @ptrFromInt(wlr_output.data); | ||||
|  | ||||
|             const resource = zriver.OutputStatusV1.create( | ||||
|                 status_manager.getClient(), | ||||
| @ -86,7 +86,7 @@ fn handleRequest( | ||||
|         .get_river_seat_status => |req| { | ||||
|             // ignore if the seat is inert | ||||
|             const wlr_seat = wlr.Seat.Client.fromWlSeat(req.seat) orelse return; | ||||
|             const seat = @intToPtr(*Seat, wlr_seat.seat.data); | ||||
|             const seat: *Seat = @ptrFromInt(wlr_seat.seat.data); | ||||
|  | ||||
|             const node = util.gpa.create(std.SinglyLinkedList(SeatStatus).Node) catch { | ||||
|                 status_manager.getClient().postNoMemory(); | ||||
|  | ||||
| @ -30,7 +30,7 @@ pub fn init( | ||||
| ) !Self { | ||||
|     const owned_args = try util.gpa.alloc([:0]u8, command_args.len); | ||||
|     errdefer util.gpa.free(owned_args); | ||||
|     for (command_args) |arg, i| { | ||||
|     for (command_args, 0..) |arg, i| { | ||||
|         errdefer for (owned_args[0..i]) |a| util.gpa.free(a); | ||||
|         owned_args[i] = try util.gpa.dupeZ(u8, arg); | ||||
|     } | ||||
|  | ||||
| @ -54,5 +54,5 @@ pub fn direction(self: Vector) ?wlr.OutputLayout.Direction { | ||||
|  | ||||
| /// Returns the length of the vector. | ||||
| pub fn length(self: Vector) u31 { | ||||
|     return math.sqrt(@intCast(u31, (self.x *| self.x) +| (self.y *| self.y))); | ||||
|     return math.sqrt(@as(u31, @intCast((self.x *| self.x) +| (self.y *| self.y)))); | ||||
| } | ||||
|  | ||||
| @ -88,15 +88,15 @@ pub const State = struct { | ||||
|  | ||||
|         const max_x = output_width - state.box.width - border_width; | ||||
|         state.box.x += delta_x; | ||||
|         state.box.x = math.max(state.box.x, border_width); | ||||
|         state.box.x = math.min(state.box.x, max_x); | ||||
|         state.box.x = math.max(state.box.x, 0); | ||||
|         state.box.x = @max(state.box.x, border_width); | ||||
|         state.box.x = @min(state.box.x, max_x); | ||||
|         state.box.x = @max(state.box.x, 0); | ||||
|  | ||||
|         const max_y = output_height - state.box.height - border_width; | ||||
|         state.box.y += delta_y; | ||||
|         state.box.y = math.max(state.box.y, border_width); | ||||
|         state.box.y = math.min(state.box.y, max_y); | ||||
|         state.box.y = math.max(state.box.y, 0); | ||||
|         state.box.y = @max(state.box.y, border_width); | ||||
|         state.box.y = @min(state.box.y, max_y); | ||||
|         state.box.y = @max(state.box.y, 0); | ||||
|     } | ||||
|  | ||||
|     pub fn clampToOutput(state: *State) void { | ||||
| @ -107,8 +107,8 @@ pub const State = struct { | ||||
|         output.wlr_output.effectiveResolution(&output_width, &output_height); | ||||
|  | ||||
|         const border_width = if (state.ssd) server.config.border_width else 0; | ||||
|         state.box.width = math.min(state.box.width, output_width - (2 * border_width)); | ||||
|         state.box.height = math.min(state.box.height, output_height - (2 * border_width)); | ||||
|         state.box.width = @min(state.box.width, output_width - (2 * border_width)); | ||||
|         state.box.height = @min(state.box.height, output_height - (2 * border_width)); | ||||
|  | ||||
|         state.move(0, 0); | ||||
|     } | ||||
| @ -504,8 +504,8 @@ pub fn map(view: *Self) !void { | ||||
|  | ||||
|     if (server.input_manager.defaultSeat().focused_output) |output| { | ||||
|         // Center the initial pending box on the output | ||||
|         view.pending.box.x = @divTrunc(math.max(0, output.usable_box.width - view.pending.box.width), 2); | ||||
|         view.pending.box.y = @divTrunc(math.max(0, output.usable_box.height - view.pending.box.height), 2); | ||||
|         view.pending.box.x = @divTrunc(@max(0, output.usable_box.width - view.pending.box.width), 2); | ||||
|         view.pending.box.y = @divTrunc(@max(0, output.usable_box.height - view.pending.box.height), 2); | ||||
|  | ||||
|         view.pending.tags = blk: { | ||||
|             if (server.config.tag_rules.match(view)) |tags| break :blk tags; | ||||
|  | ||||
| @ -34,7 +34,7 @@ request_mode: wl.Listener(*wlr.XdgToplevelDecorationV1) = | ||||
|     wl.Listener(*wlr.XdgToplevelDecorationV1).init(handleRequestMode), | ||||
|  | ||||
| pub fn init(wlr_decoration: *wlr.XdgToplevelDecorationV1) void { | ||||
|     const xdg_toplevel = @intToPtr(*XdgToplevel, wlr_decoration.surface.data); | ||||
|     const xdg_toplevel: *XdgToplevel = @ptrFromInt(wlr_decoration.surface.data); | ||||
|  | ||||
|     xdg_toplevel.decoration = .{ .wlr_decoration = wlr_decoration }; | ||||
|     const decoration = &xdg_toplevel.decoration.?; | ||||
| @ -64,7 +64,7 @@ fn handleDestroy( | ||||
|     _: *wlr.XdgToplevelDecorationV1, | ||||
| ) void { | ||||
|     const decoration = @fieldParentPtr(XdgDecoration, "destroy", listener); | ||||
|     const xdg_toplevel = @intToPtr(*XdgToplevel, decoration.wlr_decoration.surface.data); | ||||
|     const xdg_toplevel: *XdgToplevel = @ptrFromInt(decoration.wlr_decoration.surface.data); | ||||
|  | ||||
|     decoration.deinit(); | ||||
|  | ||||
| @ -78,7 +78,7 @@ fn handleRequestMode( | ||||
| ) void { | ||||
|     const decoration = @fieldParentPtr(XdgDecoration, "request_mode", listener); | ||||
|  | ||||
|     const xdg_toplevel = @intToPtr(*XdgToplevel, decoration.wlr_decoration.surface.data); | ||||
|     const xdg_toplevel: *XdgToplevel = @ptrFromInt(decoration.wlr_decoration.surface.data); | ||||
|     const view = xdg_toplevel.view; | ||||
|  | ||||
|     const ssd = server.config.ssd_rules.match(xdg_toplevel.view) orelse | ||||
|  | ||||
| @ -85,8 +85,8 @@ pub fn create(xdg_toplevel: *wlr.XdgToplevel) error{OutOfMemory}!void { | ||||
|  | ||||
|     self.view = view; | ||||
|  | ||||
|     xdg_toplevel.base.data = @ptrToInt(self); | ||||
|     xdg_toplevel.base.surface.data = @ptrToInt(&view.tree.node); | ||||
|     xdg_toplevel.base.data = @intFromPtr(self); | ||||
|     xdg_toplevel.base.surface.data = @intFromPtr(&view.tree.node); | ||||
|  | ||||
|     // Add listeners that are active over the toplevel's entire lifetime | ||||
|     xdg_toplevel.base.events.destroy.add(&self.destroy); | ||||
| @ -307,10 +307,10 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), _: *wlr.Surface) void { | ||||
|     { | ||||
|         const state = &self.xdg_toplevel.current; | ||||
|         view.constraints = .{ | ||||
|             .min_width = @intCast(u31, math.max(state.min_width, 1)), | ||||
|             .max_width = if (state.max_width > 0) @intCast(u31, state.max_width) else math.maxInt(u31), | ||||
|             .min_height = @intCast(u31, math.max(state.min_height, 1)), | ||||
|             .max_height = if (state.max_height > 0) @intCast(u31, state.max_height) else math.maxInt(u31), | ||||
|             .min_width = @max(state.min_width, 1), | ||||
|             .max_width = if (state.max_width > 0) @intCast(state.max_width) else math.maxInt(u31), | ||||
|             .min_height = @max(state.min_height, 1), | ||||
|             .max_height = if (state.max_height > 0) @intCast(state.max_height) else math.maxInt(u31), | ||||
|         }; | ||||
|     } | ||||
|  | ||||
| @ -376,7 +376,7 @@ fn handleRequestMove( | ||||
|     event: *wlr.XdgToplevel.event.Move, | ||||
| ) void { | ||||
|     const self = @fieldParentPtr(Self, "request_move", listener); | ||||
|     const seat = @intToPtr(*Seat, event.seat.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(event.seat.seat.data); | ||||
|     const view = self.view; | ||||
|  | ||||
|     if (view.current.output == null or view.pending.output == null) return; | ||||
| @ -389,7 +389,7 @@ fn handleRequestMove( | ||||
|  | ||||
| fn handleRequestResize(listener: *wl.Listener(*wlr.XdgToplevel.event.Resize), event: *wlr.XdgToplevel.event.Resize) void { | ||||
|     const self = @fieldParentPtr(Self, "request_resize", listener); | ||||
|     const seat = @intToPtr(*Seat, event.seat.seat.data); | ||||
|     const seat: *Seat = @ptrFromInt(event.seat.seat.data); | ||||
|     const view = self.view; | ||||
|  | ||||
|     { | ||||
|  | ||||
| @ -93,7 +93,7 @@ fn mapImpl(self: *Self) error{OutOfMemory}!void { | ||||
|     self.surface_tree = try server.root.layers.xwayland_override_redirect.createSceneSubsurfaceTree(surface); | ||||
|     try SceneNodeData.attach(&self.surface_tree.?.node, .{ .xwayland_override_redirect = self }); | ||||
|  | ||||
|     surface.data = @ptrToInt(&self.surface_tree.?.node); | ||||
|     surface.data = @intFromPtr(&self.surface_tree.?.node); | ||||
|  | ||||
|     self.surface_tree.?.node.setPosition(self.xwayland_surface.x, self.xwayland_surface.y); | ||||
|  | ||||
|  | ||||
| @ -102,10 +102,10 @@ pub fn configure(self: Self) bool { | ||||
|     } | ||||
|  | ||||
|     self.xwayland_surface.configure( | ||||
|         @intCast(i16, inflight.box.x + output_box.x), | ||||
|         @intCast(i16, inflight.box.y + output_box.y), | ||||
|         @intCast(u16, inflight.box.width), | ||||
|         @intCast(u16, inflight.box.height), | ||||
|         @intCast(inflight.box.x + output_box.x), | ||||
|         @intCast(inflight.box.y + output_box.y), | ||||
|         @intCast(inflight.box.width), | ||||
|         @intCast(inflight.box.height), | ||||
|     ); | ||||
|  | ||||
|     self.setActivated(inflight.focus != 0); | ||||
| @ -165,7 +165,7 @@ pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: | ||||
|     const view = self.view; | ||||
|  | ||||
|     const surface = xwayland_surface.surface.?; | ||||
|     surface.data = @ptrToInt(&view.tree.node); | ||||
|     surface.data = @intFromPtr(&view.tree.node); | ||||
|  | ||||
|     // Add listeners that are only active while mapped | ||||
|     xwayland_surface.events.set_title.add(&self.set_title); | ||||
|  | ||||
| @ -108,12 +108,12 @@ fn parseRgba(string: []const u8) ![4]f32 { | ||||
|     const b = try fmt.parseInt(u8, string[6..8], 16); | ||||
|     const a = if (string.len == 10) try fmt.parseInt(u8, string[8..10], 16) else 255; | ||||
|  | ||||
|     const alpha = @intToFloat(f32, a) / 255.0; | ||||
|     const alpha = @as(f32, @floatFromInt(a)) / 255.0; | ||||
|  | ||||
|     return [4]f32{ | ||||
|         @intToFloat(f32, r) / 255.0 * alpha, | ||||
|         @intToFloat(f32, g) / 255.0 * alpha, | ||||
|         @intToFloat(f32, b) / 255.0 * alpha, | ||||
|         @as(f32, @floatFromInt(r)) / 255.0 * alpha, | ||||
|         @as(f32, @floatFromInt(g)) / 255.0 * alpha, | ||||
|         @as(f32, @floatFromInt(b)) / 255.0 * alpha, | ||||
|         alpha, | ||||
|     }; | ||||
| } | ||||
|  | ||||
| @ -43,7 +43,7 @@ pub fn declareMode( | ||||
|  | ||||
|     const owned_name = try util.gpa.dupeZ(u8, new_mode_name); | ||||
|  | ||||
|     const id = @intCast(u32, config.modes.items.len); | ||||
|     const id: u32 = @intCast(config.modes.items.len); | ||||
|     config.mode_to_id.putAssumeCapacityNoClobber(owned_name, id); | ||||
|     config.modes.appendAssumeCapacity(.{ .name = owned_name }); | ||||
| } | ||||
|  | ||||
| @ -55,7 +55,7 @@ pub fn listInputs( | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     out.* = input_list.toOwnedSlice(); | ||||
|     out.* = try input_list.toOwnedSlice(); | ||||
| } | ||||
|  | ||||
| pub fn listInputConfigs( | ||||
| @ -68,7 +68,7 @@ pub fn listInputConfigs( | ||||
|     var input_list = std.ArrayList(u8).init(util.gpa); | ||||
|     const writer = input_list.writer(); | ||||
|  | ||||
|     for (server.input_manager.configs.items) |*input_config, i| { | ||||
|     for (server.input_manager.configs.items, 0..) |*input_config, i| { | ||||
|         if (i > 0) try input_list.appendSlice("\n"); | ||||
|  | ||||
|         try writer.print("{s}\n", .{input_config.identifier}); | ||||
| @ -119,7 +119,7 @@ pub fn listInputConfigs( | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     out.* = input_list.toOwnedSlice(); | ||||
|     out.* = try input_list.toOwnedSlice(); | ||||
| } | ||||
|  | ||||
| pub fn input( | ||||
| @ -197,7 +197,7 @@ pub fn input( | ||||
|     } else if (mem.eql(u8, "scroll-button", args[2])) { | ||||
|         const ret = c.libevdev_event_code_from_name(c.EV_KEY, args[3].ptr); | ||||
|         if (ret < 1) return Error.InvalidButton; | ||||
|         input_config.scroll_button = InputConfig.ScrollButton{ .button = @intCast(u32, ret) }; | ||||
|         input_config.scroll_button = InputConfig.ScrollButton{ .button = @intCast(ret) }; | ||||
|     } else { | ||||
|         return Error.UnknownCommand; | ||||
|     } | ||||
|  | ||||
| @ -200,7 +200,7 @@ fn mappingExists( | ||||
|     keysym: xkb.Keysym, | ||||
|     release: bool, | ||||
| ) ?usize { | ||||
|     for (mappings.items) |mapping, i| { | ||||
|     for (mappings.items, 0..) |mapping, i| { | ||||
|         if (meta.eql(mapping.modifiers, modifiers) and | ||||
|             mapping.keysym == keysym and mapping.options.release == release) | ||||
|         { | ||||
| @ -217,7 +217,7 @@ fn switchMappingExists( | ||||
|     switch_type: Switch.Type, | ||||
|     switch_state: Switch.State, | ||||
| ) ?usize { | ||||
|     for (switch_mappings.items) |mapping, i| { | ||||
|     for (switch_mappings.items, 0..) |mapping, i| { | ||||
|         if (mapping.switch_type == switch_type and meta.eql(mapping.switch_state, switch_state)) { | ||||
|             return i; | ||||
|         } | ||||
| @ -232,7 +232,7 @@ fn pointerMappingExists( | ||||
|     modifiers: wlr.Keyboard.ModifierMask, | ||||
|     event_code: u32, | ||||
| ) ?usize { | ||||
|     for (pointer_mappings.items) |mapping, i| { | ||||
|     for (pointer_mappings.items, 0..) |mapping, i| { | ||||
|         if (meta.eql(mapping.modifiers, modifiers) and mapping.event_code == event_code) { | ||||
|             return i; | ||||
|         } | ||||
| @ -248,7 +248,7 @@ fn parseEventCode(name: [:0]const u8, out: *?[]const u8) !u32 { | ||||
|         return Error.Other; | ||||
|     } | ||||
|  | ||||
|     return @intCast(u32, event_code); | ||||
|     return @intCast(event_code); | ||||
| } | ||||
|  | ||||
| fn parseKeysym(name: [:0]const u8, out: *?[]const u8) !xkb.Keysym { | ||||
|  | ||||
| @ -104,7 +104,7 @@ pub fn resize( | ||||
|             // up against an output edge. | ||||
|             const diff_width = prev_width - view.pending.box.width; | ||||
|             // Do not grow bigger than the output | ||||
|             view.pending.box.width = math.min( | ||||
|             view.pending.box.width = @min( | ||||
|                 view.pending.box.width, | ||||
|                 output_width - 2 * server.config.border_width, | ||||
|             ); | ||||
| @ -116,7 +116,7 @@ pub fn resize( | ||||
|             view.applyConstraints(&view.pending.box); | ||||
|             const diff_height = prev_height - view.pending.box.height; | ||||
|             // Do not grow bigger than the output | ||||
|             view.pending.box.height = math.min( | ||||
|             view.pending.box.height = @min( | ||||
|                 view.pending.box.height, | ||||
|                 output_height - 2 * server.config.border_width, | ||||
|             ); | ||||
|  | ||||
| @ -109,15 +109,15 @@ fn getOutput(seat: *Seat, str: []const u8) !?*Output { | ||||
|         const wlr_output = server.root.output_layout.adjacentOutput( | ||||
|             direction, | ||||
|             seat.focused_output.?.wlr_output, | ||||
|             @intToFloat(f64, focus_box.x + @divTrunc(focus_box.width, 2)), | ||||
|             @intToFloat(f64, focus_box.y + @divTrunc(focus_box.height, 2)), | ||||
|             @floatFromInt(focus_box.x + @divTrunc(focus_box.width, 2)), | ||||
|             @floatFromInt(focus_box.y + @divTrunc(focus_box.height, 2)), | ||||
|         ) orelse return null; | ||||
|         return @intToPtr(*Output, wlr_output.data); | ||||
|         return @as(*Output, @ptrFromInt(wlr_output.data)); | ||||
|     } else { | ||||
|         // Check if an output matches by name | ||||
|         var it = server.root.active_outputs.iterator(.forward); | ||||
|         while (it.next()) |output| { | ||||
|             if (mem.eql(u8, mem.span(output.wlr_output.name), str)) { | ||||
|             if (mem.eql(u8, mem.sliceTo(output.wlr_output.name, 0), str)) { | ||||
|                 return output; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -157,8 +157,8 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error! | ||||
|     var buffer = std.ArrayList(u8).init(util.gpa); | ||||
|     const writer = buffer.writer(); | ||||
|  | ||||
|     try fmt.formatBuf("title", .{ .width = title_column_max, .alignment = .Left }, writer); | ||||
|     try fmt.formatBuf("app-id", .{ .width = app_id_column_max, .alignment = .Left }, writer); | ||||
|     try fmt.formatBuf("title", .{ .width = title_column_max, .alignment = .left }, writer); | ||||
|     try fmt.formatBuf("app-id", .{ .width = app_id_column_max, .alignment = .left }, writer); | ||||
|     try writer.writeAll("action\n"); | ||||
|  | ||||
|     switch (list) { | ||||
| @ -169,8 +169,8 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error! | ||||
|                 else => unreachable, | ||||
|             }; | ||||
|             for (rules) |rule| { | ||||
|                 try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .Left }, writer); | ||||
|                 try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .Left }, writer); | ||||
|                 try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .left }, writer); | ||||
|                 try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .left }, writer); | ||||
|                 try writer.print("{s}\n", .{switch (list) { | ||||
|                     .float => if (rule.value) "float" else "no-float", | ||||
|                     .ssd => if (rule.value) "ssd" else "csd", | ||||
| @ -181,12 +181,12 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error! | ||||
|         .tag => { | ||||
|             const rules = server.config.tag_rules.rules.items; | ||||
|             for (rules) |rule| { | ||||
|                 try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .Left }, writer); | ||||
|                 try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .Left }, writer); | ||||
|                 try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .left }, writer); | ||||
|                 try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .left }, writer); | ||||
|                 try writer.print("{b}\n", .{rule.value}); | ||||
|             } | ||||
|         }, | ||||
|     } | ||||
|  | ||||
|     out.* = buffer.toOwnedSlice(); | ||||
|     out.* = try buffer.toOwnedSlice(); | ||||
| } | ||||
|  | ||||
| @ -175,7 +175,7 @@ pub fn log( | ||||
|     comptime format: []const u8, | ||||
|     args: anytype, | ||||
| ) void { | ||||
|     if (@enumToInt(level) > @enumToInt(runtime_log_level)) return; | ||||
|     if (@intFromEnum(level) > @intFromEnum(runtime_log_level)) return; | ||||
|  | ||||
|     const scope_prefix = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "): "; | ||||
|  | ||||
|  | ||||
| @ -50,7 +50,7 @@ pub fn RuleList(comptime T: type) type { | ||||
|         } | ||||
|  | ||||
|         pub fn add(list: *Self, rule: Rule) error{OutOfMemory}!void { | ||||
|             const index = for (list.rules.items) |*existing, i| { | ||||
|             const index = for (list.rules.items, 0..) |*existing, i| { | ||||
|                 if (mem.eql(u8, rule.app_id_glob, existing.app_id_glob) and | ||||
|                     mem.eql(u8, rule.title_glob, existing.title_glob)) | ||||
|                 { | ||||
| @ -83,7 +83,7 @@ pub fn RuleList(comptime T: type) type { | ||||
|         } | ||||
|  | ||||
|         pub fn del(list: *Self, rule: struct { app_id_glob: []const u8, title_glob: []const u8 }) void { | ||||
|             for (list.rules.items) |existing, i| { | ||||
|             for (list.rules.items, 0..) |existing, i| { | ||||
|                 if (mem.eql(u8, rule.app_id_glob, existing.app_id_glob) and | ||||
|                     mem.eql(u8, rule.title_glob, existing.title_glob)) | ||||
|                 { | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| #include <assert.h> | ||||
| #include <stdarg.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| #include <wlr/util/log.h> | ||||
|  | ||||
|  | ||||
| @ -110,10 +110,10 @@ fn _main() !void { | ||||
| fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, globals: *Globals) void { | ||||
|     switch (event) { | ||||
|         .global => |global| { | ||||
|             if (std.cstr.cmp(global.interface, wl.Seat.getInterface().name) == 0) { | ||||
|             if (mem.orderZ(u8, global.interface, wl.Seat.getInterface().name) == .eq) { | ||||
|                 assert(globals.seat == null); // TODO: support multiple seats | ||||
|                 globals.seat = registry.bind(global.name, wl.Seat, 1) catch @panic("out of memory"); | ||||
|             } else if (std.cstr.cmp(global.interface, zriver.ControlV1.getInterface().name) == 0) { | ||||
|             } else if (mem.orderZ(u8, global.interface, zriver.ControlV1.getInterface().name) == .eq) { | ||||
|                 globals.control = registry.bind(global.name, zriver.ControlV1, 1) catch @panic("out of memory"); | ||||
|             } | ||||
|         }, | ||||
| @ -132,7 +132,7 @@ fn callbackListener(_: *zriver.CommandCallbackV1, event: zriver.CommandCallbackV | ||||
|         }, | ||||
|         .failure => |failure| { | ||||
|             // A small hack to provide usage text when river reports an unknown command. | ||||
|             if (std.cstr.cmp(failure.failure_message, "unknown command") == 0) { | ||||
|             if (mem.orderZ(u8, failure.failure_message, "unknown command") == .eq) { | ||||
|                 std.log.err("unknown command", .{}); | ||||
|                 io.getStdErr().writeAll(usage) catch {}; | ||||
|                 os.exit(1); | ||||
|  | ||||
| @ -170,13 +170,13 @@ const Output = struct { | ||||
|                             return; | ||||
|                         }; | ||||
|                         switch (raw_arg[0]) { | ||||
|                             '+' => output.main_count +|= @intCast(u31, arg), | ||||
|                             '+' => output.main_count +|= @intCast(arg), | ||||
|                             '-' => { | ||||
|                                 const result = output.main_count +| arg; | ||||
|                                 if (result >= 1) output.main_count = @intCast(u31, result); | ||||
|                                 if (result >= 1) output.main_count = @intCast(result); | ||||
|                             }, | ||||
|                             else => { | ||||
|                                 if (arg >= 1) output.main_count = @intCast(u31, arg); | ||||
|                                 if (arg >= 1) output.main_count = @intCast(arg); | ||||
|                             }, | ||||
|                         } | ||||
|                     }, | ||||
| @ -198,16 +198,16 @@ const Output = struct { | ||||
|             .layout_demand => |ev| { | ||||
|                 assert(ev.view_count > 0); | ||||
|  | ||||
|                 const main_count = math.min(output.main_count, @truncate(u31, ev.view_count)); | ||||
|                 const secondary_count = @truncate(u31, ev.view_count) -| main_count; | ||||
|                 const main_count = @min(output.main_count, ev.view_count); | ||||
|                 const secondary_count = saturatingCast(u31, ev.view_count) -| main_count; | ||||
|  | ||||
|                 const usable_width = switch (output.main_location) { | ||||
|                     .left, .right => @truncate(u31, ev.usable_width) -| (2 *| outer_padding), | ||||
|                     .top, .bottom => @truncate(u31, ev.usable_height) -| (2 *| outer_padding), | ||||
|                     .left, .right => saturatingCast(u31, ev.usable_width) -| (2 *| outer_padding), | ||||
|                     .top, .bottom => saturatingCast(u31, ev.usable_height) -| (2 *| outer_padding), | ||||
|                 }; | ||||
|                 const usable_height = switch (output.main_location) { | ||||
|                     .left, .right => @truncate(u31, ev.usable_height) -| (2 *| outer_padding), | ||||
|                     .top, .bottom => @truncate(u31, ev.usable_width) -| (2 *| outer_padding), | ||||
|                     .left, .right => saturatingCast(u31, ev.usable_height) -| (2 *| outer_padding), | ||||
|                     .top, .bottom => saturatingCast(u31, ev.usable_width) -| (2 *| outer_padding), | ||||
|                 }; | ||||
|  | ||||
|                 // to make things pixel-perfect, we make the first main and first secondary | ||||
| @ -221,7 +221,7 @@ const Output = struct { | ||||
|                 var secondary_height_rem: u31 = undefined; | ||||
|  | ||||
|                 if (secondary_count > 0) { | ||||
|                     main_width = @floatToInt(u31, output.main_ratio * @intToFloat(f64, usable_width)); | ||||
|                     main_width = @intFromFloat(output.main_ratio * @as(f64, @floatFromInt(usable_width))); | ||||
|                     main_height = usable_height / main_count; | ||||
|                     main_height_rem = usable_height % main_count; | ||||
|  | ||||
| @ -382,9 +382,9 @@ pub fn main() !void { | ||||
| fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, context: *Context) void { | ||||
|     switch (event) { | ||||
|         .global => |global| { | ||||
|             if (std.cstr.cmp(global.interface, river.LayoutManagerV3.getInterface().name) == 0) { | ||||
|             if (mem.orderZ(u8, global.interface, river.LayoutManagerV3.getInterface().name) == .eq) { | ||||
|                 context.layout_manager = registry.bind(global.name, river.LayoutManagerV3, 1) catch return; | ||||
|             } else if (std.cstr.cmp(global.interface, wl.Output.getInterface().name) == 0) { | ||||
|             } else if (mem.orderZ(u8, global.interface, wl.Output.getInterface().name) == .eq) { | ||||
|                 context.addOutput(registry, global.name) catch |err| fatal("failed to bind output: {}", .{err}); | ||||
|             } | ||||
|         }, | ||||
| @ -413,3 +413,7 @@ fn fatalPrintUsage(comptime format: []const u8, args: anytype) noreturn { | ||||
|     std.io.getStdErr().writeAll(usage) catch {}; | ||||
|     os.exit(1); | ||||
| } | ||||
|  | ||||
| fn saturatingCast(comptime T: type, x: anytype) T { | ||||
|     return @intCast(math.clamp(x, math.minInt(T), math.maxInt(T))); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user