mirror of
https://github.com/swaywm/sway.git
synced 2024-11-26 18:01:29 +00:00
var replacement changes
This commit is contained in:
parent
fd6d06ff61
commit
aa22dc3113
|
@ -15,6 +15,8 @@ struct cmd_handler {
|
||||||
|
|
||||||
struct cmd_handler *find_handler(char *line);
|
struct cmd_handler *find_handler(char *line);
|
||||||
bool handle_command(char *command);
|
bool handle_command(char *command);
|
||||||
|
// Handles commands during config
|
||||||
|
bool config_command(char *command);
|
||||||
|
|
||||||
void remove_view_from_scratchpad();
|
void remove_view_from_scratchpad();
|
||||||
|
|
||||||
|
|
|
@ -835,7 +835,7 @@ static int compare_set(const void *_l, const void *_r) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cmd_set(int argc, char **argv) {
|
static bool cmd_set(int argc, char **argv) {
|
||||||
if (!checkarg(argc, "set", EXPECTED_EQUAL_TO, 2)) {
|
if (!checkarg(argc, "set", EXPECTED_AT_LEAST, 2)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct sway_variable *var = NULL;
|
struct sway_variable *var = NULL;
|
||||||
|
@ -856,7 +856,7 @@ static bool cmd_set(int argc, char **argv) {
|
||||||
list_add(config->symbols, var);
|
list_add(config->symbols, var);
|
||||||
list_sort(config->symbols, compare_set);
|
list_sort(config->symbols, compare_set);
|
||||||
}
|
}
|
||||||
var->value = strdup(argv[1]);
|
var->value = join_args(argv + 1, argc - 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1067,17 +1067,54 @@ bool handle_command(char *exec) {
|
||||||
}
|
}
|
||||||
struct cmd_handler *handler = find_handler(argv[0]);
|
struct cmd_handler *handler = find_handler(argv[0]);
|
||||||
bool exec_success = false;
|
bool exec_success = false;
|
||||||
if (handler) {
|
if (handler && !(handler->handle(argc - 1, argv + 1))) {
|
||||||
int i;
|
|
||||||
// Skip var replacement for first value of cmd_set
|
|
||||||
for (i = (handler->handle == cmd_set ? 2 : 1); i < argc; ++i) {
|
|
||||||
argv[i] = do_var_replacement(argv[i]);
|
|
||||||
}
|
|
||||||
exec_success = handler->handle(argc - 1, argv + 1);
|
|
||||||
}
|
|
||||||
if (exec_success == false) {
|
|
||||||
sway_log(L_ERROR, "Command failed: %s", argv[0]);
|
sway_log(L_ERROR, "Command failed: %s", argv[0]);
|
||||||
}
|
}
|
||||||
free_argv(argc, argv);
|
free_argv(argc, argv);
|
||||||
return exec_success;
|
return exec_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool config_command(char *exec) {
|
||||||
|
sway_log(L_INFO, "handling config command '%s'", exec);
|
||||||
|
struct cmd_handler *handler;
|
||||||
|
int argc;
|
||||||
|
char **argv = split_args(exec, &argc);
|
||||||
|
bool res = false;
|
||||||
|
if (!argc) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//TODO make this better, it only handles modes right now, and very
|
||||||
|
//simply at that
|
||||||
|
if (strncmp(argv[0], "}", 1) == 0) {
|
||||||
|
config->current_mode = config->modes->items[0];
|
||||||
|
res = true;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
if ((handler = find_handler(argv[0]))) {
|
||||||
|
int i = 1, e = argc;
|
||||||
|
// dont var replace first argument
|
||||||
|
if (handler->handle == cmd_set) {
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
|
for (; i < e; ++i) {
|
||||||
|
argv[i] = do_var_replacement(argv[i]);
|
||||||
|
}
|
||||||
|
if (handler->config_type == CMD_KEYBIND) {
|
||||||
|
sway_log(L_ERROR, "Invalid command during config `%s'", exec);
|
||||||
|
} else if (handler->config_type == CMD_COMPOSITOR_READY && !config->active) {
|
||||||
|
sway_log(L_DEBUG, "Defferring command `%s'", exec);
|
||||||
|
char *cmd = join_args(argv, argc);
|
||||||
|
list_add(config->cmd_queue, cmd);
|
||||||
|
res = true;
|
||||||
|
} else if (!handler->handle(argc-1, argv+1)) {
|
||||||
|
sway_log(L_DEBUG, "Config load failed for line `%s'", exec);
|
||||||
|
} else {
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sway_log(L_ERROR, "Unknown command `%s'", exec);
|
||||||
|
}
|
||||||
|
cleanup:
|
||||||
|
free_argv(argc, argv);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
|
@ -231,34 +231,9 @@ bool read_config(FILE *file, bool is_active) {
|
||||||
while (!feof(file)) {
|
while (!feof(file)) {
|
||||||
line = read_line(file);
|
line = read_line(file);
|
||||||
line = strip_comments(line);
|
line = strip_comments(line);
|
||||||
list_t *args = split_string(line, whitespace);
|
if (!config_command(line)) {
|
||||||
if (!args->length) {
|
success = false;
|
||||||
goto cleanup;
|
|
||||||
}
|
}
|
||||||
//TODO make this better, it only handles modes right now, and very
|
|
||||||
//simply at that
|
|
||||||
if (strncmp(args->items[0], "}", 1) == 0) {
|
|
||||||
config->current_mode = default_mode;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
struct cmd_handler *handler;
|
|
||||||
if ((handler = find_handler(args->items[0]))) {
|
|
||||||
if (handler->config_type == CMD_KEYBIND) {
|
|
||||||
sway_log(L_ERROR, "Invalid command during config ``%s''", line);
|
|
||||||
} else if (handler->config_type == CMD_COMPOSITOR_READY && !is_active) {
|
|
||||||
sway_log(L_DEBUG, "Deferring command ``%s''", line);
|
|
||||||
char *cmd = strdup(line);
|
|
||||||
list_add(config->cmd_queue, cmd);
|
|
||||||
} else if (!handle_command(line)) {
|
|
||||||
sway_log(L_DEBUG, "Config load failed for line ``%s''", line);
|
|
||||||
success = false;
|
|
||||||
config->failed = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sway_log(L_ERROR, "Invalid command ``%s''", line);
|
|
||||||
}
|
|
||||||
cleanup:
|
|
||||||
free_flat_list(args);
|
|
||||||
free(line);
|
free(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,76 +179,82 @@ int unescape_string(char *string) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; string[i]; ++i) {
|
for (i = 0; string[i]; ++i) {
|
||||||
if (string[i] == '\\') {
|
if (string[i] == '\\') {
|
||||||
--len;
|
|
||||||
int shift = 0;
|
|
||||||
switch (string[++i]) {
|
switch (string[++i]) {
|
||||||
case '0':
|
case '0':
|
||||||
string[i - 1] = '\0';
|
string[i - 1] = '\0';
|
||||||
shift = 1;
|
return i - 1;
|
||||||
break;
|
|
||||||
case 'a':
|
case 'a':
|
||||||
string[i - 1] = '\a';
|
string[i - 1] = '\a';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
string[i - 1] = '\b';
|
string[i - 1] = '\b';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
string[i - 1] = '\f';
|
string[i - 1] = '\f';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
string[i - 1] = '\n';
|
string[i - 1] = '\n';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
string[i - 1] = '\r';
|
string[i - 1] = '\r';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
string[i - 1] = '\t';
|
string[i - 1] = '\t';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
string[i - 1] = '\v';
|
string[i - 1] = '\v';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case '\\':
|
case '\\':
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case '\'':
|
case '\'':
|
||||||
string[i - 1] = '\'';
|
string[i - 1] = '\'';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case '\"':
|
case '\"':
|
||||||
string[i - 1] = '\"';
|
string[i - 1] = '\"';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
string[i - 1] = '?';
|
string[i - 1] = '?';
|
||||||
shift = 1;
|
string[i] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
{
|
{
|
||||||
unsigned char c = 0;
|
unsigned char c = 0;
|
||||||
shift = 1;
|
|
||||||
if (string[i+1] >= '0' && string[i+1] <= '9') {
|
if (string[i+1] >= '0' && string[i+1] <= '9') {
|
||||||
shift = 2;
|
|
||||||
c = string[i+1] - '0';
|
c = string[i+1] - '0';
|
||||||
if (string[i+2] >= '0' && string[i+2] <= '9') {
|
if (string[i+2] >= '0' && string[i+2] <= '9') {
|
||||||
shift = 3;
|
|
||||||
c *= 0x10;
|
c *= 0x10;
|
||||||
c += string[i+2] - '0';
|
c += string[i+2] - '0';
|
||||||
|
string[i+2] = '\0';
|
||||||
}
|
}
|
||||||
|
string[i+1] = '\0';
|
||||||
}
|
}
|
||||||
|
string[i] = '\0';
|
||||||
string[i - 1] = c;
|
string[i - 1] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memmove(string + i, string + i + shift, len - i + 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return len;
|
// Shift characters over nullspaces
|
||||||
|
int shift = 0;
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
|
if (string[i] == 0) {
|
||||||
|
shift++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string[i-shift] = string[i];
|
||||||
|
}
|
||||||
|
string[len - shift] = 0;
|
||||||
|
return len - shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *join_args(char **argv, int argc) {
|
char *join_args(char **argv, int argc) {
|
||||||
|
|
Loading…
Reference in a new issue