From bbd42fec1693deab6fdd0cc671bb64d4c0ead694 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 5 Dec 2024 19:49:02 +0100 Subject: [PATCH] fix: don't revert to default mode on keybind namespace change --- src/keybind/keybind.zig | 5 +++++ src/tui/tui.zig | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/keybind/keybind.zig b/src/keybind/keybind.zig index cb2712e..84ccaa3 100644 --- a/src/keybind/keybind.zig +++ b/src/keybind/keybind.zig @@ -52,8 +52,10 @@ const Handler = struct { ), }; return .{ + .allocator = allocator, .input_handler = EventHandler.to_owned(self), .keybind_hints = self.bindings.hints(), + .mode = try allocator.dupe(u8, mode_name), .name = self.bindings.name, .line_numbers = self.bindings.line_numbers, .cursor_shape = self.bindings.cursor_shape, @@ -68,15 +70,18 @@ const Handler = struct { }; pub const Mode = struct { + allocator: std.mem.Allocator, input_handler: EventHandler, event_handler: ?EventHandler = null, + mode: []const u8, name: []const u8 = "", line_numbers: LineNumbers = .absolute, keybind_hints: *const KeybindHints, cursor_shape: CursorShape = .block, pub fn deinit(self: *Mode) void { + self.allocator.free(self.mode); self.input_handler.deinit(); if (self.event_handler) |eh| eh.deinit(); } diff --git a/src/tui/tui.zig b/src/tui/tui.zig index 0f934ec..29d1b7e 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -597,7 +597,7 @@ fn get_input_mode(self: *Self, mode_name: []const u8) !Mode { return keybind.mode(mode_name, self.allocator, .{}); } -fn enter_input_mode(self: *Self, new_mode: Mode, mode_name: []const u8) command.Result { +fn enter_input_mode(self: *Self, new_mode: Mode) command.Result { if (self.mini_mode) |_| try cmds.exit_mini_mode(self, .{}); if (self.input_mode_outer) |_| try cmds.exit_overlay_mode(self, .{}); if (self.input_mode) |*m| { @@ -607,6 +607,21 @@ fn enter_input_mode(self: *Self, new_mode: Mode, mode_name: []const u8) command. self.input_mode = new_mode; } +fn refresh_input_mode(self: *Self) command.Result { + const mode = (self.input_mode orelse return).mode; + var new_mode = self.get_input_mode(mode) catch ret: { + self.logger.print("unknown mode {s}", .{mode}); + break :ret try self.get_input_mode(keybind.default_mode); + }; + errdefer new_mode.deinit(); + if (self.input_mode) |*m| { + m.deinit(); + self.input_mode = null; + } + self.input_mode = new_mode; +} +pub const enter_mode_meta = .{ .arguments = &.{.string} }; + const cmds = struct { pub const Target = Self; const Ctx = command.Context; @@ -691,7 +706,7 @@ const cmds = struct { try self.save_config(); self.logger.print("input mode {s}", .{self.config.input_mode}); try keybind.set_namespace(self.config.input_mode); - return enter_mode(self, Ctx.fmt(.{keybind.default_mode})); + return self.refresh_input_mode(); } pub const toggle_input_mode_meta = .{ .description = "Switch to next input mode" };