This commit is contained in:
Kovid Goyal 2025-04-27 22:46:41 +05:30
parent b0ae88ada9
commit 459d2d8649
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C

View file

@ -340,6 +340,18 @@ parse_and_check_panel_kitten_cli(CLISpec *cli_spec, int argc, char **argv) {
return true;
}
static int
offset_for_plus_subcommand(int argc, char **argv, const char *name) {
int offset = 0;
#define arg_eq(num, what) (strcmp(argv[num], what) == 0)
if (argc > 1 && argv[1][0] == '+' && strcmp(argv[1] + 1, name) == 0) {
offset = 1;
} else if (argc > 2 && arg_eq(1, "+") && arg_eq(2, name)) {
offset = 2;
}
#undef arg_eq
return offset;
}
static void
handle_fast_commandline(CLISpec *cli_spec, const char *instance_group_prefix, int offset_for_panel_kitten) {
@ -347,9 +359,7 @@ handle_fast_commandline(CLISpec *cli_spec, const char *instance_group_prefix, in
RAII_CLISpec(subcommand_cli_spec);
if (offset_for_panel_kitten < 0) {
// Look for +open
int offset = 0;
if (cli_spec->original_argc > 1 && strcmp("+open", cli_spec->original_argv[1]) == 0) offset = 1;
else if (cli_spec->original_argc > 2 && strcmp("+", cli_spec->original_argv[1]) == 0 && strcmp("open", cli_spec->original_argv[2]) == 0) offset = 2;
int offset = offset_for_plus_subcommand(cli_spec->original_argc, cli_spec->original_argv, "open");
if (offset) {
if (!parse_and_check_kitty_cli(&subcommand_cli_spec, cli_spec->original_argc - offset, cli_spec->original_argv + offset)) exit(1);
cli_spec = &subcommand_cli_spec;
@ -403,17 +413,12 @@ static bool
delegate_to_kitten_if_possible(CLISpec *cli_spec, char* exe_dir) {
int argc = cli_spec->original_argc; char **argv = cli_spec->original_argv;
if (argc > 1 && argv[1][0] == '@') exec_kitten(argc, argv, exe_dir);
if (argc > 2 && strcmp(argv[1], "+kitten") == 0) {
if (is_wrapped_kitten(argv[2])) exec_kitten(argc - 1, argv + 1, exe_dir);
if (strcmp(argv[2], "panel") == 0) {
handle_fast_commandline(cli_spec, "panel", 2);
return true;
}
}
if (argc > 3 && strcmp(argv[1], "+") == 0 && strcmp(argv[2], "kitten") == 0) {
if (is_wrapped_kitten(argv[3])) exec_kitten(argc - 2, argv + 2, exe_dir);
if (strcmp(argv[2], "panel") == 0) {
handle_fast_commandline(cli_spec, "panel", 3);
int offset = offset_for_plus_subcommand(argc, argv, "kitten");
if (offset && argc > offset+1) {
const char *kitten = argv[offset + 1];
if (is_wrapped_kitten(kitten)) exec_kitten(argc - offset, argv + offset, exe_dir);
if (strcmp(kitten, "panel") == 0) {
handle_fast_commandline(cli_spec, "panel", offset + 1);
return true;
}
}