Merge pull request #2232 from ianyfan/ipc

Add some missing ipc message types from i3
This commit is contained in:
Ryan Dwyer 2018-07-10 22:05:33 +10:00 committed by GitHub
commit 8afe68f920
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 96 additions and 18 deletions

View file

@ -13,6 +13,8 @@ enum ipc_command_type {
IPC_GET_MARKS = 5, IPC_GET_MARKS = 5,
IPC_GET_BAR_CONFIG = 6, IPC_GET_BAR_CONFIG = 6,
IPC_GET_VERSION = 7, IPC_GET_VERSION = 7,
IPC_GET_BINDING_MODES = 8,
IPC_GET_CONFIG = 9,
// sway-specific command types // sway-specific command types
IPC_GET_INPUTS = 100, IPC_GET_INPUTS = 100,

View file

@ -341,6 +341,7 @@ struct sway_config {
int gaps_outer; int gaps_outer;
list_t *config_chain; list_t *config_chain;
const char *current_config_path;
const char *current_config; const char *current_config;
enum sway_container_border border; enum sway_container_border border;
@ -496,7 +497,4 @@ void config_update_font_height(bool recalculate);
/* Global config singleton. */ /* Global config singleton. */
extern struct sway_config *config; extern struct sway_config *config;
/* Config file currently being read */
extern const char *current_config_path;
#endif #endif

View file

@ -80,7 +80,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
if (config->reading && *src != '/') { if (config->reading && *src != '/') {
// src file is inside configuration dir // src file is inside configuration dir
char *conf = strdup(config->current_config); char *conf = strdup(config->current_config_path);
if (!conf) { if (!conf) {
wlr_log(WLR_ERROR, "Failed to duplicate string"); wlr_log(WLR_ERROR, "Failed to duplicate string");
free(src); free(src);

View file

@ -7,7 +7,7 @@ struct cmd_results *cmd_reload(int argc, char **argv) {
if ((error = checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0))) { if ((error = checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0))) {
return error; return error;
} }
if (!load_main_config(config->current_config, true)) { if (!load_main_config(config->current_config_path, true)) {
return cmd_results_new(CMD_FAILURE, "reload", "Error(s) reloading config."); return cmd_results_new(CMD_FAILURE, "reload", "Error(s) reloading config.");
} }

View file

@ -117,6 +117,7 @@ void free_config(struct sway_config *config) {
free(config->floating_scroll_left_cmd); free(config->floating_scroll_left_cmd);
free(config->floating_scroll_right_cmd); free(config->floating_scroll_right_cmd);
free(config->font); free(config->font);
free((char *)config->current_config_path);
free((char *)config->current_config); free((char *)config->current_config);
free(config); free(config);
} }
@ -205,6 +206,7 @@ static void config_defaults(struct sway_config *config) {
if (!(config->active_bar_modifiers = create_list())) goto cleanup; if (!(config->active_bar_modifiers = create_list())) goto cleanup;
if (!(config->config_chain = create_list())) goto cleanup; if (!(config->config_chain = create_list())) goto cleanup;
config->current_config_path = NULL;
config->current_config = NULL; config->current_config = NULL;
// borders // borders
@ -304,8 +306,6 @@ static char *get_config_path(void) {
return NULL; // Not reached return NULL; // Not reached
} }
const char *current_config_path;
static bool load_config(const char *path, struct sway_config *config) { static bool load_config(const char *path, struct sway_config *config) {
if (path == NULL) { if (path == NULL) {
wlr_log(WLR_ERROR, "Unable to find a config file!"); wlr_log(WLR_ERROR, "Unable to find a config file!");
@ -313,7 +313,6 @@ static bool load_config(const char *path, struct sway_config *config) {
} }
wlr_log(WLR_INFO, "Loading config from %s", path); wlr_log(WLR_INFO, "Loading config from %s", path);
current_config_path = path;
struct stat sb; struct stat sb;
if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) { if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) {
@ -333,7 +332,6 @@ static bool load_config(const char *path, struct sway_config *config) {
wlr_log(WLR_ERROR, "Error(s) loading config!"); wlr_log(WLR_ERROR, "Error(s) loading config!");
} }
current_config_path = NULL;
return true; return true;
} }
@ -358,7 +356,7 @@ bool load_main_config(const char *file, bool is_active) {
config->active = true; config->active = true;
} }
config->current_config = path; config->current_config_path = path;
list_add(config->config_chain, path); list_add(config->config_chain, path);
config->reading = true; config->reading = true;
@ -428,7 +426,7 @@ bool load_main_config(const char *file, bool is_active) {
static bool load_include_config(const char *path, const char *parent_dir, static bool load_include_config(const char *path, const char *parent_dir,
struct sway_config *config) { struct sway_config *config) {
// save parent config // save parent config
const char *parent_config = config->current_config; const char *parent_config = config->current_config_path;
char *full_path; char *full_path;
int len = strlen(path); int len = strlen(path);
@ -466,25 +464,25 @@ static bool load_include_config(const char *path, const char *parent_dir,
} }
} }
config->current_config = real_path; config->current_config_path = real_path;
list_add(config->config_chain, real_path); list_add(config->config_chain, real_path);
int index = config->config_chain->length - 1; int index = config->config_chain->length - 1;
if (!load_config(real_path, config)) { if (!load_config(real_path, config)) {
free(real_path); free(real_path);
config->current_config = parent_config; config->current_config_path = parent_config;
list_del(config->config_chain, index); list_del(config->config_chain, index);
return false; return false;
} }
// restore current_config // restore current_config_path
config->current_config = parent_config; config->current_config_path = parent_config;
return true; return true;
} }
bool load_include_configs(const char *path, struct sway_config *config) { bool load_include_configs(const char *path, struct sway_config *config) {
char *wd = getcwd(NULL, 0); char *wd = getcwd(NULL, 0);
char *parent_path = strdup(config->current_config); char *parent_path = strdup(config->current_config_path);
const char *parent_dir = dirname(parent_path); const char *parent_dir = dirname(parent_path);
if (chdir(parent_dir) < 0) { if (chdir(parent_dir) < 0) {
@ -561,6 +559,23 @@ static char *expand_line(const char *block, const char *line, bool add_brace) {
} }
bool read_config(FILE *file, struct sway_config *config) { bool read_config(FILE *file, struct sway_config *config) {
bool reading_main_config = false;
char *current_config, *config_pos;
long config_size = 0;
if (config->current_config == NULL) {
reading_main_config = true;
fseek(file, 0, SEEK_END);
config_size = ftell(file);
rewind(file);
config_pos = current_config = malloc(config_size + 1);
if (current_config == NULL) {
wlr_log(WLR_ERROR, "Unable to allocate buffer for config contents");
return false;
}
}
bool success = true; bool success = true;
int line_number = 0; int line_number = 0;
char *line; char *line;
@ -573,6 +588,14 @@ bool read_config(FILE *file, struct sway_config *config) {
} }
line_number++; line_number++;
wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line); wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line);
if (reading_main_config) {
size_t l = strlen(line);
memcpy(config_pos, line, l); // don't copy terminating character
config_pos += l;
*config_pos++ = '\n';
}
line = strip_whitespace(line); line = strip_whitespace(line);
if (line[0] == '#') { if (line[0] == '#') {
free(line); free(line);
@ -592,6 +615,8 @@ bool read_config(FILE *file, struct sway_config *config) {
if (!expanded) { if (!expanded) {
list_foreach(stack, free); list_foreach(stack, free);
list_free(stack); list_free(stack);
free(line);
free(current_config);
return false; return false;
} }
wlr_log(WLR_DEBUG, "Expanded line: %s", expanded); wlr_log(WLR_DEBUG, "Expanded line: %s", expanded);
@ -607,7 +632,7 @@ bool read_config(FILE *file, struct sway_config *config) {
case CMD_FAILURE: case CMD_FAILURE:
case CMD_INVALID: case CMD_INVALID:
wlr_log(WLR_ERROR, "Error on line %i '%s': %s (%s)", line_number, wlr_log(WLR_ERROR, "Error on line %i '%s': %s (%s)", line_number,
line, res->error, config->current_config); line, res->error, config->current_config_path);
success = false; success = false;
break; break;
@ -652,6 +677,10 @@ bool read_config(FILE *file, struct sway_config *config) {
list_foreach(stack, free); list_foreach(stack, free);
list_free(stack); list_free(stack);
if (reading_main_config) {
current_config[config_size - 1] = '\0';
config->current_config = current_config;
}
return success; return success;
} }

View file

@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include "log.h" #include "log.h"
#include "sway/config.h"
#include "sway/ipc-json.h" #include "sway/ipc-json.h"
#include "sway/tree/container.h" #include "sway/tree/container.h"
#include "sway/tree/workspace.h" #include "sway/tree/workspace.h"
@ -41,6 +42,7 @@ json_object *ipc_json_get_version() {
json_object_object_add(version, "major", json_object_new_int(major)); json_object_object_add(version, "major", json_object_new_int(major));
json_object_object_add(version, "minor", json_object_new_int(minor)); json_object_object_add(version, "minor", json_object_new_int(minor));
json_object_object_add(version, "patch", json_object_new_int(patch)); json_object_object_add(version, "patch", json_object_new_int(patch));
json_object_object_add(version, "loaded_config_file_name", json_object_new_string(config->current_config_path));
return version; return version;
} }

View file

@ -17,6 +17,7 @@
#include <unistd.h> #include <unistd.h>
#include <wayland-server.h> #include <wayland-server.h>
#include "sway/commands.h" #include "sway/commands.h"
#include "sway/config.h"
#include "sway/ipc-json.h" #include "sway/ipc-json.h"
#include "sway/ipc-server.h" #include "sway/ipc-server.h"
#include "sway/output.h" #include "sway/output.h"
@ -667,6 +668,31 @@ void ipc_client_handle_command(struct ipc_client *client) {
goto exit_cleanup; goto exit_cleanup;
} }
case IPC_GET_BINDING_MODES:
{
json_object *modes = json_object_new_array();
for (int i = 0; i < config->modes->length; i++) {
struct sway_mode *mode = config->modes->items[i];
json_object_array_add(modes, json_object_new_string(mode->name));
}
const char *json_string = json_object_to_json_string(modes);
client_valid =
ipc_send_reply(client, json_string, (uint32_t)strlen(json_string));
json_object_put(modes); // free
goto exit_cleanup;
}
case IPC_GET_CONFIG:
{
json_object *json = json_object_new_object();
json_object_object_add(json, "config", json_object_new_string(config->current_config));
const char *json_string = json_object_to_json_string(json);
client_valid =
ipc_send_reply(client, json_string, (uint32_t)strlen(json_string));
json_object_put(json); // free
goto exit_cleanup;
}
default: default:
wlr_log(WLR_INFO, "Unknown IPC command type %i", client->current_command); wlr_log(WLR_INFO, "Unknown IPC command type %i", client->current_command);
goto exit_cleanup; goto exit_cleanup;

View file

@ -240,6 +240,12 @@ static void pretty_print_version(json_object *v) {
printf("sway version %s\n", json_object_get_string(ver)); printf("sway version %s\n", json_object_get_string(ver));
} }
static void pretty_print_config(json_object *c) {
json_object *config;
json_object_object_get_ex(c, "config", &config);
printf("%s\n", json_object_get_string(config));
}
static void pretty_print_clipboard(json_object *v) { static void pretty_print_clipboard(json_object *v) {
if (success(v, true)) { if (success(v, true)) {
if (json_object_is_type(v, json_type_array)) { if (json_object_is_type(v, json_type_array)) {
@ -277,7 +283,7 @@ static void pretty_print(int type, json_object *resp) {
if (type != IPC_COMMAND && type != IPC_GET_WORKSPACES && if (type != IPC_COMMAND && type != IPC_GET_WORKSPACES &&
type != IPC_GET_INPUTS && type != IPC_GET_OUTPUTS && type != IPC_GET_INPUTS && type != IPC_GET_OUTPUTS &&
type != IPC_GET_VERSION && type != IPC_GET_CLIPBOARD && type != IPC_GET_VERSION && type != IPC_GET_CLIPBOARD &&
type != IPC_GET_SEATS) { type != IPC_GET_SEATS && type != IPC_GET_CONFIG) {
printf("%s\n", json_object_to_json_string_ext(resp, printf("%s\n", json_object_to_json_string_ext(resp,
JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED)); JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED));
return; return;
@ -288,6 +294,11 @@ static void pretty_print(int type, json_object *resp) {
return; return;
} }
if (type == IPC_GET_CONFIG) {
pretty_print_config(resp);
return;
}
if (type == IPC_GET_CLIPBOARD) { if (type == IPC_GET_CLIPBOARD) {
pretty_print_clipboard(resp); pretty_print_clipboard(resp);
return; return;
@ -407,6 +418,10 @@ int main(int argc, char **argv) {
type = IPC_GET_BAR_CONFIG; type = IPC_GET_BAR_CONFIG;
} else if (strcasecmp(cmdtype, "get_version") == 0) { } else if (strcasecmp(cmdtype, "get_version") == 0) {
type = IPC_GET_VERSION; type = IPC_GET_VERSION;
} else if (strcasecmp(cmdtype, "get_binding_modes") == 0) {
type = IPC_GET_BINDING_MODES;
} else if (strcasecmp(cmdtype, "get_config") == 0) {
type = IPC_GET_CONFIG;
} else if (strcasecmp(cmdtype, "get_clipboard") == 0) { } else if (strcasecmp(cmdtype, "get_clipboard") == 0) {
type = IPC_GET_CLIPBOARD; type = IPC_GET_CLIPBOARD;
} else { } else {

View file

@ -59,6 +59,12 @@ _swaymsg_ [options...] [message]
*get\_version* *get\_version*
Get JSON-encoded version information for the running instance of sway. Get JSON-encoded version information for the running instance of sway.
*get\_binding\_modes*
Gets a JSON-encoded list of currently configured binding modes.
*get\_config*
Gets a JSON-encoded copy of the current configuration.
*get\_clipboard* *get\_clipboard*
Get JSON-encoded information about the clipboard. Get JSON-encoded information about the clipboard.
Returns the current clipboard mime-types if called without Returns the current clipboard mime-types if called without