mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
input: new_split binding, can parse enums
This commit is contained in:
@ -940,6 +940,12 @@ pub fn keyCallback(
|
|||||||
} else log.warn("runtime doesn't implement gotoTab", .{});
|
} else log.warn("runtime doesn't implement gotoTab", .{});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.new_split => |direction| {
|
||||||
|
if (@hasDecl(apprt.Surface, "newSplit")) {
|
||||||
|
try self.rt_surface.newSplit(direction);
|
||||||
|
} else log.warn("runtime doesn't implement newSplit", .{});
|
||||||
|
},
|
||||||
|
|
||||||
.close_window => {
|
.close_window => {
|
||||||
_ = self.app_mailbox.push(.{ .close = self }, .{ .instant = {} });
|
_ = self.app_mailbox.push(.{ .close = self }, .{ .instant = {} });
|
||||||
},
|
},
|
||||||
|
@ -296,6 +296,16 @@ pub const Config = struct {
|
|||||||
.{ .key = .right_bracket, .mods = .{ .super = true, .shift = true } },
|
.{ .key = .right_bracket, .mods = .{ .super = true, .shift = true } },
|
||||||
.{ .next_tab = {} },
|
.{ .next_tab = {} },
|
||||||
);
|
);
|
||||||
|
try result.keybind.set.put(
|
||||||
|
alloc,
|
||||||
|
.{ .key = .d, .mods = .{ .super = true } },
|
||||||
|
.{ .new_split = .right },
|
||||||
|
);
|
||||||
|
try result.keybind.set.put(
|
||||||
|
alloc,
|
||||||
|
.{ .key = .d, .mods = .{ .super = true, .shift = true } },
|
||||||
|
.{ .new_split = .down },
|
||||||
|
);
|
||||||
{
|
{
|
||||||
// Cmd+N for goto tab N
|
// Cmd+N for goto tab N
|
||||||
const start = @enumToInt(inputpkg.Key.one);
|
const start = @enumToInt(inputpkg.Key.one);
|
||||||
|
@ -105,7 +105,20 @@ pub fn parse(input: []const u8) !Binding {
|
|||||||
// Cursor keys can't be set currently
|
// Cursor keys can't be set currently
|
||||||
Action.CursorKey => return Error.InvalidAction,
|
Action.CursorKey => return Error.InvalidAction,
|
||||||
|
|
||||||
else => unreachable,
|
else => switch (@typeInfo(field.type)) {
|
||||||
|
.Enum => {
|
||||||
|
const idx = colonIdx orelse return Error.InvalidFormat;
|
||||||
|
const param = actionRaw[idx + 1 ..];
|
||||||
|
const value = std.meta.stringToEnum(
|
||||||
|
field.type,
|
||||||
|
param,
|
||||||
|
) orelse return Error.InvalidFormat;
|
||||||
|
|
||||||
|
break :action @unionInit(Action, field.name, value);
|
||||||
|
},
|
||||||
|
|
||||||
|
else => unreachable,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,6 +180,10 @@ pub const Action = union(enum) {
|
|||||||
/// Go to the tab with the specific number, 1-indexed.
|
/// Go to the tab with the specific number, 1-indexed.
|
||||||
goto_tab: usize,
|
goto_tab: usize,
|
||||||
|
|
||||||
|
/// Create a new split in the given direction. The new split will appear
|
||||||
|
/// in the direction given.
|
||||||
|
new_split: SplitDirection,
|
||||||
|
|
||||||
/// Close the current window or tab
|
/// Close the current window or tab
|
||||||
close_window: void,
|
close_window: void,
|
||||||
|
|
||||||
@ -177,6 +194,13 @@ pub const Action = union(enum) {
|
|||||||
normal: []const u8,
|
normal: []const u8,
|
||||||
application: []const u8,
|
application: []const u8,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const SplitDirection = enum {
|
||||||
|
right,
|
||||||
|
down,
|
||||||
|
|
||||||
|
// Note: we don't support top or left yet
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Trigger is the associated key state that can trigger an action.
|
/// Trigger is the associated key state that can trigger an action.
|
||||||
@ -286,11 +310,15 @@ test "parse: triggers" {
|
|||||||
try testing.expectError(Error.InvalidFormat, parse("a+b=ignore"));
|
try testing.expectError(Error.InvalidFormat, parse("a+b=ignore"));
|
||||||
}
|
}
|
||||||
|
|
||||||
test "parse: action" {
|
test "parse: action invalid" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
// invalid action
|
// invalid action
|
||||||
try testing.expectError(Error.InvalidFormat, parse("a=nopenopenope"));
|
try testing.expectError(Error.InvalidFormat, parse("a=nopenopenope"));
|
||||||
|
}
|
||||||
|
|
||||||
|
test "parse: action no parameters" {
|
||||||
|
const testing = std.testing;
|
||||||
|
|
||||||
// no parameters
|
// no parameters
|
||||||
try testing.expectEqual(
|
try testing.expectEqual(
|
||||||
@ -298,6 +326,10 @@ test "parse: action" {
|
|||||||
try parse("a=ignore"),
|
try parse("a=ignore"),
|
||||||
);
|
);
|
||||||
try testing.expectError(Error.InvalidFormat, parse("a=ignore:A"));
|
try testing.expectError(Error.InvalidFormat, parse("a=ignore:A"));
|
||||||
|
}
|
||||||
|
|
||||||
|
test "parse: action with string" {
|
||||||
|
const testing = std.testing;
|
||||||
|
|
||||||
// parameter
|
// parameter
|
||||||
{
|
{
|
||||||
@ -306,3 +338,14 @@ test "parse: action" {
|
|||||||
try testing.expectEqualStrings("A", binding.action.csi);
|
try testing.expectEqualStrings("A", binding.action.csi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "parse: action with enum" {
|
||||||
|
const testing = std.testing;
|
||||||
|
|
||||||
|
// parameter
|
||||||
|
{
|
||||||
|
const binding = try parse("a=new_split:right");
|
||||||
|
try testing.expect(binding.action == .new_split);
|
||||||
|
try testing.expectEqual(Action.SplitDirection.right, binding.action.new_split);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user