Remove 'help' command and clean up help output
The redundant "help" command is now hidden from the wayvncctl UI. This also moves event description help text to: wayvncctl event-receive --show=<event-name> Signed-off-by: Jim Ramsay <i.am@jimramsay.com>pull/218/head
parent
d475e0e52f
commit
fbd373143c
41
README.md
41
README.md
|
@ -159,47 +159,6 @@ the running wayvnc instance.
|
||||||
Use the `wayvncctl` utility to interact with this control socket from the
|
Use the `wayvncctl` utility to interact with this control socket from the
|
||||||
command line.
|
command line.
|
||||||
|
|
||||||
The `help` command can interactively query the available IPC commands:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ wayvncctl help
|
|
||||||
Commands:
|
|
||||||
- help
|
|
||||||
- version
|
|
||||||
- event-receive
|
|
||||||
- set-output
|
|
||||||
- get-clients
|
|
||||||
- get-outputs
|
|
||||||
- disconnect-client
|
|
||||||
- wayvnc-exit
|
|
||||||
|
|
||||||
Run 'wayvncctl command-name --help' for command-specific details.
|
|
||||||
|
|
||||||
Events:
|
|
||||||
- client-connected
|
|
||||||
- client-disconnected
|
|
||||||
- capture-changed
|
|
||||||
|
|
||||||
Run 'wayvncctl help --event=event-name' for event-specific details.
|
|
||||||
```
|
|
||||||
|
|
||||||
And give descriptions and usage for specific commands:
|
|
||||||
```
|
|
||||||
$ wayvncctl set-output --help
|
|
||||||
Usage: wayvncctl [options] set-output [params]
|
|
||||||
|
|
||||||
Switch the actively captured output
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
--switch-to=...
|
|
||||||
The specific output name to capture
|
|
||||||
|
|
||||||
--cycle=...
|
|
||||||
Either "next" or "prev"
|
|
||||||
|
|
||||||
Run 'wayvncctl --help' for allowed options
|
|
||||||
```
|
|
||||||
|
|
||||||
See the `wayvnc(1)` manpage for an in-depth description of the IPC protocol and
|
See the `wayvnc(1)` manpage for an in-depth description of the IPC protocol and
|
||||||
the available commands, and `wayvncctl(1)` for more on the command line
|
the available commands, and `wayvncctl(1)` for more on the command line
|
||||||
interface.
|
interface.
|
||||||
|
|
119
src/ctl-client.c
119
src/ctl-client.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Jim Ramsay
|
* Copyright (c) 2022-2023 Jim Ramsay
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -632,41 +632,14 @@ static int ctl_client_print_single_command(struct ctl_client* self,
|
||||||
void ctl_client_print_command_list(FILE* stream)
|
void ctl_client_print_command_list(FILE* stream)
|
||||||
{
|
{
|
||||||
fprintf(stream, "Commands:\n");
|
fprintf(stream, "Commands:\n");
|
||||||
for (size_t i = 0; i < CMD_LIST_LEN; ++i)
|
for (size_t i = 0; i < CMD_LIST_LEN; ++i) {
|
||||||
fprintf(stream, " - %s\n", ctl_command_list[i].name);
|
if (i == CMD_HELP) // hidden
|
||||||
|
continue;
|
||||||
|
fprintf(stream, " %s\n", ctl_command_list[i].name);
|
||||||
|
}
|
||||||
fprintf(stream, "\nRun 'wayvncctl command-name --help' for command-specific details.\n");
|
fprintf(stream, "\nRun 'wayvncctl command-name --help' for command-specific details.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctl_client_print_event_list(FILE* stream)
|
|
||||||
{
|
|
||||||
printf("Events:\n");
|
|
||||||
for (size_t i = 0; i < EVT_LIST_LEN; ++i)
|
|
||||||
printf(" - %s\n", ctl_event_list[i].name);
|
|
||||||
printf("\nRun 'wayvncctl help --event=event-name' for event-specific details.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int print_command_usage(const char* cmd_name,
|
|
||||||
struct option_parser* cmd_options,
|
|
||||||
struct option_parser* parent_options)
|
|
||||||
{
|
|
||||||
struct cmd_info* info = ctl_command_by_name(cmd_name);
|
|
||||||
if (!info) {
|
|
||||||
WARN("No such command \"%s\"\n", cmd_name);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("Usage: wayvncctl [options] %s [parameters]\n\n%s\n\n", cmd_name,
|
|
||||||
info->description);
|
|
||||||
option_parser_print_options(cmd_options, stdout);
|
|
||||||
printf("\n");
|
|
||||||
option_parser_print_options(parent_options, stdout);
|
|
||||||
enum cmd_type cmd = ctl_command_parse_name(cmd_name);
|
|
||||||
if (cmd == CMD_EVENT_RECEIVE) {
|
|
||||||
printf("\n");
|
|
||||||
ctl_client_print_event_list(stdout);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int print_event_details(const char* evt_name)
|
static int print_event_details(const char* evt_name)
|
||||||
{
|
{
|
||||||
struct cmd_info* info = ctl_event_by_name(evt_name);
|
struct cmd_info* info = ctl_event_by_name(evt_name);
|
||||||
|
@ -685,8 +658,15 @@ static int print_event_details(const char* evt_name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ctl_client_print_help(struct ctl_client* self,
|
void ctl_client_print_event_list(FILE* stream)
|
||||||
struct jsonipc_request* request,
|
{
|
||||||
|
printf("Events:\n");
|
||||||
|
for (size_t i = 0; i < EVT_LIST_LEN; ++i)
|
||||||
|
printf(" %s\n", ctl_event_list[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int print_command_usage(struct ctl_client* self,
|
||||||
|
enum cmd_type cmd,
|
||||||
struct option_parser* cmd_options,
|
struct option_parser* cmd_options,
|
||||||
struct option_parser* parent_options)
|
struct option_parser* parent_options)
|
||||||
{
|
{
|
||||||
|
@ -694,24 +674,20 @@ static int ctl_client_print_help(struct ctl_client* self,
|
||||||
WARN("JSON output is not supported for the \"help\" command");
|
WARN("JSON output is not supported for the \"help\" command");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
struct cmd_info* info = ctl_command_by_type(cmd);
|
||||||
json_t* params = request->params;
|
if (!info) {
|
||||||
const char* cmd_name = NULL;
|
WARN("No such command");
|
||||||
const char* evt_name = NULL;
|
return 1;
|
||||||
if (params)
|
}
|
||||||
json_unpack(params, "{s?s, s?s}", "command", &cmd_name,
|
printf("Usage: wayvncctl [options] %s [parameters]\n\n%s\n\n", info->name,
|
||||||
"event", &evt_name);
|
info->description);
|
||||||
|
option_parser_print_options(cmd_options, stdout);
|
||||||
if (cmd_name)
|
|
||||||
return print_command_usage(cmd_name, cmd_options,
|
|
||||||
parent_options);
|
|
||||||
if (evt_name)
|
|
||||||
return print_event_details(evt_name);
|
|
||||||
|
|
||||||
ctl_client_print_command_list(stdout);
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
ctl_client_print_event_list(stdout);
|
option_parser_print_options(parent_options, stdout);
|
||||||
|
if (cmd == CMD_EVENT_RECEIVE) {
|
||||||
|
printf("\n");
|
||||||
|
ctl_client_print_event_list(stdout);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,7 +704,10 @@ int ctl_client_init_cmd_parser(struct option_parser* parser, enum cmd_type cmd)
|
||||||
param_count++;
|
param_count++;
|
||||||
|
|
||||||
// Add 2: one for --help and one to null-terminate the list
|
// Add 2: one for --help and one to null-terminate the list
|
||||||
struct wv_option* options = calloc(param_count + 2,
|
size_t alloc_count = param_count + 2;
|
||||||
|
if (cmd == CMD_EVENT_RECEIVE)
|
||||||
|
alloc_count++;
|
||||||
|
struct wv_option* options = calloc(alloc_count,
|
||||||
sizeof(struct wv_option));
|
sizeof(struct wv_option));
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < param_count; ++i) {
|
for (i = 0; i < param_count; ++i) {
|
||||||
|
@ -737,6 +716,12 @@ int ctl_client_init_cmd_parser(struct option_parser* parser, enum cmd_type cmd)
|
||||||
option->help = info->params[i].description;
|
option->help = info->params[i].description;
|
||||||
option->schema = "<value>";
|
option->schema = "<value>";
|
||||||
}
|
}
|
||||||
|
if (cmd == CMD_EVENT_RECEIVE) {
|
||||||
|
options[i].long_opt = "show";
|
||||||
|
options[i].schema = "<event-name>";
|
||||||
|
options[i].help = "Display details about the given event";
|
||||||
|
i++;
|
||||||
|
}
|
||||||
options[i].long_opt = "help";
|
options[i].long_opt = "help";
|
||||||
options[i].short_opt = 'h';
|
options[i].short_opt = 'h';
|
||||||
options[i].help = "Display this help text";
|
options[i].help = "Display this help text";
|
||||||
|
@ -759,7 +744,7 @@ int ctl_client_run_command(struct ctl_client* self,
|
||||||
|
|
||||||
const char* method = option_parser_get_value(parent_options, "command");
|
const char* method = option_parser_get_value(parent_options, "command");
|
||||||
enum cmd_type cmd = ctl_command_parse_name(method);
|
enum cmd_type cmd = ctl_command_parse_name(method);
|
||||||
if (cmd == CMD_UNKNOWN) {
|
if (cmd == CMD_UNKNOWN || cmd == CMD_HELP) {
|
||||||
WARN("No such command \"%s\"\n", method);
|
WARN("No such command \"%s\"\n", method);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -772,23 +757,27 @@ int ctl_client_run_command(struct ctl_client* self,
|
||||||
parent_options->remaining_argv) != 0)
|
parent_options->remaining_argv) != 0)
|
||||||
goto parse_failure;
|
goto parse_failure;
|
||||||
|
|
||||||
|
if (option_parser_get_value(&cmd_options, "help")) {
|
||||||
|
result = print_command_usage(self, cmd,
|
||||||
|
&cmd_options, parent_options);
|
||||||
|
goto help_printed;
|
||||||
|
}
|
||||||
|
if (cmd == CMD_EVENT_RECEIVE && option_parser_get_value(&cmd_options, "show")) {
|
||||||
|
result = print_event_details(option_parser_get_value(&cmd_options, "show"));
|
||||||
|
goto help_printed;
|
||||||
|
}
|
||||||
|
|
||||||
struct jsonipc_request* request = ctl_client_parse_args(self, &cmd,
|
struct jsonipc_request* request = ctl_client_parse_args(self, &cmd,
|
||||||
&cmd_options);
|
&cmd_options);
|
||||||
if (!request)
|
if (!request)
|
||||||
goto parse_failure;
|
goto parse_failure;
|
||||||
|
|
||||||
if (cmd != CMD_HELP) {
|
int timeout = (flags & CTL_CLIENT_SOCKET_WAIT) ? -1 : 0;
|
||||||
int timeout = (flags & CTL_CLIENT_SOCKET_WAIT) ? -1 : 0;
|
result = ctl_client_connect(self, timeout);
|
||||||
result = ctl_client_connect(self, timeout);
|
if (result != 0)
|
||||||
if (result != 0)
|
goto connect_failure;
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case CMD_HELP:
|
|
||||||
result = ctl_client_print_help(self, request, &cmd_options,
|
|
||||||
parent_options);
|
|
||||||
break;
|
|
||||||
case CMD_EVENT_RECEIVE:
|
case CMD_EVENT_RECEIVE:
|
||||||
result = ctl_client_event_loop(self, request);
|
result = ctl_client_event_loop(self, request);
|
||||||
break;
|
break;
|
||||||
|
@ -797,7 +786,9 @@ int ctl_client_run_command(struct ctl_client* self,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect_failure:
|
||||||
jsonipc_request_destroy(request);
|
jsonipc_request_destroy(request);
|
||||||
|
help_printed:
|
||||||
parse_failure:
|
parse_failure:
|
||||||
ctl_client_destroy_cmd_parser(&cmd_options);
|
ctl_client_destroy_cmd_parser(&cmd_options);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -40,17 +40,15 @@ wayvncctl - A command line control client for wayvnc(1)
|
||||||
*wayvnc(1)* allows runtime interaction via a unix socket json-ipc mechanism.
|
*wayvnc(1)* allows runtime interaction via a unix socket json-ipc mechanism.
|
||||||
This command line utility provides easy interaction with those commands.
|
This command line utility provides easy interaction with those commands.
|
||||||
|
|
||||||
For a full list of currently supported commands, see
|
This command is largely self-documenting:
|
||||||
*wayvnc(1)* section _IPC COMMANDS_, or run the
|
|
||||||
*wayvncctl help* command.
|
|
||||||
|
|
||||||
Running *wayvncctl help* returns a list of the available commands and events.
|
- Running *wayvncctl --help* lists all supported IPC commands.
|
||||||
|
- Running *wayvncctl command-name --help* returns a description of the given
|
||||||
Running *wayvncctl command-name --help* returns a description of the server-side
|
command and its available parameters.
|
||||||
command and its available parameters.
|
- Running *wayvncctl event-receive --help* includes a list of all supported event
|
||||||
|
names.
|
||||||
Running *wayvncctl help --event=event-name* returns a description of the
|
- Running *wayvncctl event-receive --show=event-name* returns a
|
||||||
server-side event and expected parameters.
|
description of the given event and expected data fields.
|
||||||
|
|
||||||
# ASYNCHRONOUS EVENTS
|
# ASYNCHRONOUS EVENTS
|
||||||
|
|
||||||
|
@ -107,46 +105,12 @@ generate 2 additional events not documented in *wayvnc(1)*:
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
Query the server for all available IPC command names:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ wayvncctl help
|
|
||||||
Commands:
|
|
||||||
- help
|
|
||||||
- version
|
|
||||||
- event-receive
|
|
||||||
- set-output
|
|
||||||
- get-clients
|
|
||||||
- get-outputs
|
|
||||||
- disconnect-client
|
|
||||||
- wayvnc-exit
|
|
||||||
|
|
||||||
Run 'wayvncctl command-name --help' for command-specific details.
|
|
||||||
|
|
||||||
Events:
|
|
||||||
- client-connected
|
|
||||||
- client-disconnected
|
|
||||||
- capture-changed
|
|
||||||
|
|
||||||
Run 'wayvncctl help --event=event-name' for event-specific details.
|
|
||||||
```
|
|
||||||
|
|
||||||
Get help on the "set-output" IPC command:
|
Get help on the "set-output" IPC command:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ wayvncctl set-output --help
|
$ wayvncctl set-output --help
|
||||||
Usage: wayvncctl [options] set-output [params]
|
Usage: wayvncctl [options] set-output [params]
|
||||||
|
...
|
||||||
Switch the actively captured output
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
--switch-to=...
|
|
||||||
The specific output name to capture
|
|
||||||
|
|
||||||
--cycle=...
|
|
||||||
Either "next" or "prev"
|
|
||||||
|
|
||||||
Run 'wayvncctl --help' for allowed options
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Cycle to the next active output:
|
Cycle to the next active output:
|
||||||
|
|
Loading…
Reference in New Issue