config: support equality checking keybinds with sequences

This commit is contained in:
Mitchell Hashimoto
2024-08-15 20:03:46 -07:00
committed by Mitchell Hashimoto
parent 9944f5d34d
commit 43176c750e

View File

@ -3322,10 +3322,17 @@ pub const Keybinds = struct {
/// Compare if two of our value are requal. Required by Config. /// Compare if two of our value are requal. Required by Config.
pub fn equal(self: Keybinds, other: Keybinds) bool { pub fn equal(self: Keybinds, other: Keybinds) bool {
return equalSet(&self.set, &other.set);
}
fn equalSet(
self: *const inputpkg.Binding.Set,
other: *const inputpkg.Binding.Set,
) bool {
// Two keybinds are considered equal if their primary bindings // Two keybinds are considered equal if their primary bindings
// are the same. We don't compare reverse mappings and such. // are the same. We don't compare reverse mappings and such.
const self_map = self.set.bindings; const self_map = &self.bindings;
const other_map = other.set.bindings; const other_map = &other.bindings;
// If the count of mappings isn't identical they can't be equal // If the count of mappings isn't identical they can't be equal
if (self_map.count() != other_map.count()) return false; if (self_map.count() != other_map.count()) return false;
@ -3341,7 +3348,11 @@ pub const Keybinds = struct {
std.meta.activeTag(other_entry.value_ptr.*)) return false; std.meta.activeTag(other_entry.value_ptr.*)) return false;
switch (self_entry.value_ptr.*) { switch (self_entry.value_ptr.*) {
.leader => @panic("TODO"), // They're equal if both leader sets are equal.
.leader => if (!equalSet(
self_entry.value_ptr.*.leader,
other_entry.value_ptr.*.leader,
)) return false,
// Actions are compared by field directly // Actions are compared by field directly
inline .action, .action_unconsumed => |_, tag| if (!equalField( inline .action, .action_unconsumed => |_, tag| if (!equalField(