diff --git a/completions/bash/swaymsg b/completions/bash/swaymsg index 1211787d4..f865e4e1a 100644 --- a/completions/bash/swaymsg +++ b/completions/bash/swaymsg @@ -15,6 +15,7 @@ _swaymsg() 'get_bar_config' 'get_version' 'get_binding_modes' + 'get_binding_state' 'get_config' 'send_tick' 'subscribe' diff --git a/completions/fish/swaymsg.fish b/completions/fish/swaymsg.fish index 25085f9a7..5ee7dcc0b 100644 --- a/completions/fish/swaymsg.fish +++ b/completions/fish/swaymsg.fish @@ -18,6 +18,7 @@ complete -c swaymsg -s t -l type -fra 'get_marks' --description "Get a JSON-enco complete -c swaymsg -s t -l type -fra 'get_bar_config' --description "Get a JSON-encoded configuration for swaybar." complete -c swaymsg -s t -l type -fra 'get_version' --description "Get JSON-encoded version information for the running instance of sway." complete -c swaymsg -s t -l type -fra 'get_binding_modes' --description "Gets a JSON-encoded list of currently configured binding modes." +complete -c swaymsg -s t -l type -fra 'get_binding_state' --description "Get JSON-encoded info about the current binding state." complete -c swaymsg -s t -l type -fra 'get_config' --description "Gets a JSON-encoded copy of the current configuration." complete -c swaymsg -s t -l type -fra 'get_seats' --description "Gets a JSON-encoded list of all seats, its properties and all assigned devices." complete -c swaymsg -s t -l type -fra 'send_tick' --description "Sends a tick event to all subscribed clients." diff --git a/completions/zsh/_swaymsg b/completions/zsh/_swaymsg index 3f42a77d7..106f3d9dc 100644 --- a/completions/zsh/_swaymsg +++ b/completions/zsh/_swaymsg @@ -23,6 +23,7 @@ types=( 'get_bar_config' 'get_version' 'get_binding_modes' +'get_binding_state' 'get_config' 'send_tick' 'subscribe' diff --git a/include/ipc.h b/include/ipc.h index 7ae21ab31..ff0117502 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -17,6 +17,7 @@ enum ipc_command_type { IPC_GET_CONFIG = 9, IPC_SEND_TICK = 10, IPC_SYNC = 11, + IPC_GET_BINDING_STATE = 12, // sway-specific command types IPC_GET_INPUTS = 100, diff --git a/include/sway/ipc-json.h b/include/sway/ipc-json.h index 3e584dbbb..6f4ade1ac 100644 --- a/include/sway/ipc-json.h +++ b/include/sway/ipc-json.h @@ -6,6 +6,8 @@ json_object *ipc_json_get_version(void); +json_object *ipc_json_get_binding_mode(void); + json_object *ipc_json_describe_disabled_output(struct sway_output *o); json_object *ipc_json_describe_node(struct sway_node *node); json_object *ipc_json_describe_node_recursive(struct sway_node *node); diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 066fd8db4..70b81ad1d 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -1261,3 +1261,10 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { #endif return json; } + +json_object *ipc_json_get_binding_mode(void) { + json_object *current_mode = json_object_new_object(); + json_object_object_add(current_mode, "name", + json_object_new_string(config->current_mode->name)); + return current_mode; +} diff --git a/sway/ipc-server.c b/sway/ipc-server.c index bd9f40bcc..62bdccb88 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c @@ -876,6 +876,16 @@ void ipc_client_handle_command(struct ipc_client *client, uint32_t payload_lengt goto exit_cleanup; } + case IPC_GET_BINDING_STATE: + { + json_object *current_mode = ipc_json_get_binding_mode(); + const char *json_string = json_object_to_json_string(current_mode); + ipc_send_reply(client, payload_type, json_string, + (uint32_t)strlen(json_string)); + json_object_put(current_mode); // free + goto exit_cleanup; + } + case IPC_GET_CONFIG: { json_object *json = json_object_new_object(); diff --git a/sway/sway-ipc.7.scd b/sway/sway-ipc.7.scd index 63e3ceb68..495e2e7d3 100644 --- a/sway/sway-ipc.7.scd +++ b/sway/sway-ipc.7.scd @@ -75,6 +75,9 @@ supported. *For all replies, any properties not listed are subject to removal.* |- 11 : SYNC : Replies failure object for i3 compatibility +|- 12 +: GET_BINDING_STATE +: Request the current binding state, e.g. the currently active binding mode name. |- 100 : GET_INPUTS : Get the list of input devices @@ -1067,6 +1070,23 @@ boolean value _false_. } ``` +## 12. GET_BINDING_STATE + +*MESSAGE*++ +Returns the currently active binding mode. + +*REPLY*++ +A single object that contains the property _name_, which is set to the +currently active binding mode as a string. + +*Exact Reply:* +``` +{ + "name": "default" +} +``` + + ## 100. GET_INPUTS *MESSAGE*++ diff --git a/swaymsg/main.c b/swaymsg/main.c index f9d3515aa..38976f9c2 100644 --- a/swaymsg/main.c +++ b/swaymsg/main.c @@ -440,6 +440,8 @@ int main(int argc, char **argv) { type = IPC_GET_VERSION; } else if (strcasecmp(cmdtype, "get_binding_modes") == 0) { type = IPC_GET_BINDING_MODES; + } else if (strcasecmp(cmdtype, "get_binding_state") == 0) { + type = IPC_GET_BINDING_STATE; } else if (strcasecmp(cmdtype, "get_config") == 0) { type = IPC_GET_CONFIG; } else if (strcasecmp(cmdtype, "send_tick") == 0) { diff --git a/swaymsg/swaymsg.1.scd b/swaymsg/swaymsg.1.scd index 515d745fd..b8a38b544 100644 --- a/swaymsg/swaymsg.1.scd +++ b/swaymsg/swaymsg.1.scd @@ -80,6 +80,9 @@ _swaymsg_ [options...] [message] *get\_binding\_modes* Gets a JSON-encoded list of currently configured binding modes. +*get\_binding\_state* + Gets JSON-encoded info about the current binding state. + *get\_config* Gets a JSON-encoded copy of the current configuration.