Something went wrong. Try again.
window manager for the river wayland compositor
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788// SPDX-FileCopyrightText: © 2026 mtmn//// SPDX-License-Identifier: BSD-3-Clause// Analyzer does not resolve method-call syntax to free functions.// Module type aliases use PascalCase per Zig convention.// zwanzig-disable: identifier-style, unused-decl
const Binding = @This();
const std = @import("std");const river = @import("wayland").client.river;const xkb = @import("xkbcommon");
const WindowManager = @import("WindowManager.zig");
object: *river.XkbBindingV1,keysym: u32,modifiers: river.SeatV1.Modifiers,/// Borrowed from the mode's binding specification, which outlives every/// live binding made from it.command: [:0]const u8,manager: *WindowManager,enabled: bool = false,
pub fn init( binding: *Binding, object: *river.XkbBindingV1, keysym: u32, modifiers: river.SeatV1.Modifiers, command: [:0]const u8, manager: *WindowManager,) void { binding.* = .{ .object = object, .keysym = keysym, .modifiers = modifiers, .command = command, .manager = manager, }; object.setListener(*Binding, handleEvent, binding);}
pub fn deinit(binding: *Binding) void { binding.object.destroy();}
fn handleEvent(_: *river.XkbBindingV1, event: river.XkbBindingV1.Event, binding: *Binding) void { switch (event) { .pressed => binding.manager.fireBinding(binding.command), .released, .stop_repeat => {}, }}
pub fn parseModifiers(text: []const u8) error{InvalidModifier}!river.SeatV1.Modifiers { var modifiers: river.SeatV1.Modifiers = .{}; var parts = std.mem.splitScalar(u8, text, '+'); while (parts.next()) |name| { if (std.mem.eql(u8, name, "None")) continue; inline for (.{ .{ "Shift", "shift" }, .{ "Control", "ctrl" }, .{ "Alt", "mod1" }, .{ "Mod1", "mod1" }, .{ "Mod3", "mod3" }, .{ "Super", "mod4" }, .{ "Mod4", "mod4" }, .{ "Mod5", "mod5" }, }) |pair| { if (std.mem.eql(u8, name, pair[0])) { @field(modifiers, pair[1]) = true; break; } } else return error.InvalidModifier; } return modifiers;}
pub fn parseKeysym(text: []const u8) error{InvalidKeysym}!u32 { // Every xkb keysym name is far shorter than this. var buffer: [128]u8 = undefined; if (text.len >= buffer.len) return error.InvalidKeysym; @memcpy(buffer[0..text.len], text); buffer[text.len] = 0; const keysym = xkb.Keysym.fromName(buffer[0..text.len :0], .case_insensitive); if (keysym == .NoSymbol) return error.InvalidKeysym; return @backingInt(keysym);}