tiny.xkb.keymap
Defined in tiny.xkb.
API (32)
Actions
Public operations.
Keymap.canonicalModifierMaskKeymap.effectiveModifiersKeymap.groupKeymap.initKeymap.keyKeymap.keyTypeKeymap.layoutCountKeymap.modifierIndexKeymap.modifierMappingKeymap.resolveToCanonicalModifiersLevel.resolvedSymbolsgroupInRangemodifierBit
Types and contracts
Public types and contracts.
DefinitionGroupKeyKeyTypeKeycodeKeymapKeymap.StorageLevelModifierModifier.KindModifierMaskOutOfRangeTypeEntryValidationError
Namespaces
Public namespaces.
Values and defaults
Public values and defaults.
Source
Source: lib/xkb/src/keymap/model.zig:72
pub const Definition = struct { modifiers: []const Modifier, types: []const KeyType, keys: []const Key,};Source: lib/xkb/src/keymap/model.zig:54
pub const Group = struct { type_index: usize, levels: []const Level,};Source: lib/xkb/src/keymap/model.zig:65
pub const Key = struct { code: Keycode, groups: []const Group, out_of_range: OutOfRange = .wrap, repeats: bool = false,};Source: lib/xkb/src/keymap/model.zig:38
pub const KeyType = struct { modifiers: ModifierMask, level_count: usize, entries: []const TypeEntry,};Source: lib/xkb/src/keymap/model.zig:100
pub const Keymap = opaque { pub const Storage = struct { bytes: [@sizeOf(Backing)]u8 align(@alignOf(Backing)), }; pub fn init(storage_value: *Storage, definition: Definition) ValidationError!*const Keymap { const layout_count = try validate(definition); const backing: *Backing = @ptrCast(storage_value); backing.* = .{ .definition = definition, .layout_count = layout_count, }; return @ptrCast(storage_value); } pub fn modifierIndex(self: *const Keymap, name: []const u8) ?usize { for (self.storage().definition.modifiers, 0..) |modifier, index| { if (std.mem.eql(u8, modifier.name, name)) return index; } return null; } pub fn modifierMapping(self: *const Keymap, index: usize) ?ModifierMask { const modifiers = self.storage().definition.modifiers; if (index >= modifiers.len) return null; return modifiers[index].mapping; } pub fn canonicalModifierMask(self: *const Keymap) ModifierMask { _ = self; return core_modifier_mask; } pub fn effectiveModifiers(self: *const Keymap, input: ModifierMask) ModifierMask { const modifiers = self.storage().definition.modifiers; var result = input & core_modifier_mask; for (modifiers[core_modifier_count..], core_modifier_count..) |modifier, index| { if (input & modifierBit(index) != 0) result |= modifier.mapping; } return result; } pub fn resolveToCanonicalModifiers(self: *const Keymap, input: ModifierMask) ModifierMask { return (input & core_modifier_mask) | self.effectiveModifiers(input & ~core_modifier_mask); } pub fn layoutCount(self: *const Keymap) usize { return self.storage().layout_count; } pub fn keyType(self: *const Keymap, index: usize) ?*const KeyType { const types = self.storage().definition.types; if (index >= types.len) return null; return &types[index]; } pub fn key(self: *const Keymap, code: Keycode) ?*const Key { const keys = self.storage().definition.keys; var low: usize = 0; var high = keys.len; while (low < high) { const middle = low + (high - low) / 2; const candidate = &keys[middle]; if (code < candidate.code) { high = middle; } else if (code > candidate.code) { low = middle + 1; } else { return candidate; } } return null; } pub fn group(self: *const Keymap, key_value: *const Key, effective_layout: i32) ?usize { _ = self; if (key_value.groups.len == 0) return null; return groupInRange(effective_layout, key_value.groups.len, key_value.out_of_range); } fn storage(self: *const Keymap) *const Backing { return @ptrCast(@alignCast(self)); }};Source: lib/xkb/src/keymap/model.zig:44
pub const Level = struct { symbols: []const xkb.keysym.Keysym, uppercase_symbols: ?[]const xkb.keysym.Keysym = null, pub fn resolvedSymbols(self: *const Level, uppercase: bool) []const xkb.keysym.Keysym { if (uppercase) return self.uppercase_symbols orelse self.symbols; return self.symbols; }};Source: lib/xkb/src/keymap/model.zig:10
pub const Modifier = struct { name: []const u8, mapping: ModifierMask, kind: Kind, pub const Kind = enum { real, virtual, };};Source: lib/xkb/src/keymap/model.zig:59
pub const OutOfRange = union(enum) { wrap, saturate, redirect: usize,};Source: lib/xkb/src/keymap/model.zig:32
pub const TypeEntry = struct { modifiers: ModifierMask, preserve: ModifierMask = 0, level: usize,};Source: lib/xkb/src/keymap/model.zig:78
pub const ValidationError = error{ TooManyModifiers, InvalidCoreModifiers, DuplicateModifierName, InvalidModifierMapping, EmptyKeyType, InvalidTypeEntry, DuplicateTypeEntry, InvalidGroupType, InvalidGroupLevels, InvalidGroupRedirect, InvalidKeyOrder, InvalidLayoutCount, InvalidKeysym, InvalidUppercaseSymbols,};Source: lib/xkb/src/keymap/model.zig:5
pub const Keycode = u32;Source: lib/xkb/src/keymap/model.zig:4
pub const ModifierMask = u32;Source: lib/xkb/src/keymap/model.zig:7
pub const core_modifier_count = 8;Source: lib/xkb/src/keymap/model.zig:8
pub const core_modifier_mask: ModifierMask = (1 << core_modifier_count) - 1;Source: lib/xkb/src/keymap/model.zig:21
pub const core_modifiers = [_]Modifier{ .{ .name = "Shift", .mapping = 1 << 0, .kind = .real }, .{ .name = "Lock", .mapping = 1 << 1, .kind = .real }, .{ .name = "Control", .mapping = 1 << 2, .kind = .real }, .{ .name = "Mod1", .mapping = 1 << 3, .kind = .real }, .{ .name = "Mod2", .mapping = 1 << 4, .kind = .real }, .{ .name = "Mod3", .mapping = 1 << 5, .kind = .real }, .{ .name = "Mod4", .mapping = 1 << 6, .kind = .real }, .{ .name = "Mod5", .mapping = 1 << 7, .kind = .real },};Source: lib/xkb/src/keymap/model.zig:196
pub fn groupInRange(group: i32, count: usize, out_of_range: OutOfRange) usize { std.debug.assert(count != 0); if (group >= 0 and @as(usize, @intCast(group)) < count) return @intCast(group); return switch (out_of_range) { .redirect => |redirect| if (redirect < count) redirect else 0, .saturate => if (group < 0) 0 else count - 1, .wrap => @intCast(@mod(@as(i64, group), @as(i64, @intCast(count)))), };}Source: lib/xkb/src/keymap/model.zig:6
pub const max_layouts = 32;Source: lib/xkb/src/keymap/model.zig:191
pub fn modifierBit(index: usize) ModifierMask { std.debug.assert(index < @bitSizeOf(ModifierMask)); return @as(ModifierMask, 1) << @intCast(index);}Source: lib/xkb/src/keymap/root.zig
const model = @import("model.zig");pub const text = @import("text/root.zig");pub const ModifierMask = model.ModifierMask;pub const Keycode = model.Keycode;pub const max_layouts = model.max_layouts;pub const core_modifier_count = model.core_modifier_count;pub const core_modifier_mask = model.core_modifier_mask;pub const Modifier = model.Modifier;pub const core_modifiers = model.core_modifiers;pub const TypeEntry = model.TypeEntry;pub const KeyType = model.KeyType;pub const Level = model.Level;pub const Group = model.Group;pub const OutOfRange = model.OutOfRange;pub const Key = model.Key;pub const Definition = model.Definition;pub const ValidationError = model.ValidationError;pub const Keymap = model.Keymap;pub const modifierBit = model.modifierBit;pub const groupInRange = model.groupInRange;Source: lib/xkb/src/root.zig:51
pub const keymap = @import("keymap/root.zig");Audit
| Definitions | 32 |
|---|---|
| Public names | 32 |
| Members | 40 |
| Version | 26.7.0 |
| Revision | daab053ee433 |