diff options
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/bind.c | 5 | ||||
-rw-r--r-- | sway/commands/move.c | 24 | ||||
-rw-r--r-- | sway/commands/output.c | 74 | ||||
-rw-r--r-- | sway/commands/set.c | 2 |
4 files changed, 68 insertions, 37 deletions
diff --git a/sway/commands/bind.c b/sway/commands/bind.c index af5a01e5..d9ea37b7 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -61,10 +61,11 @@ struct cmd_results *cmd_bindsym(int argc, char **argv) { sym = ((char *)split->items[i])[strlen("button")] - '1' + M_LEFT_CLICK; } if (!sym) { + struct cmd_results *ret = cmd_results_new(CMD_INVALID, "bindsym", + "Unknown key '%s'", (char *)split->items[i]); free_sway_binding(binding); free_flat_list(split); - return cmd_results_new(CMD_INVALID, "bindsym", "Unknown key '%s'", - (char *)split->items[i]); + return ret; } xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t)); if (!key) { diff --git a/sway/commands/move.c b/sway/commands/move.c index a38687c1..8d89f2ef 100644 --- a/sway/commands/move.c +++ b/sway/commands/move.c @@ -7,6 +7,7 @@ #include "sway/output.h" #include "sway/workspace.h" #include "list.h" +#include "stringop.h" struct cmd_results *cmd_move(int argc, char **argv) { struct cmd_results *error = NULL; @@ -59,18 +60,23 @@ struct cmd_results *cmd_move(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, "move", "Can only move containers and views."); } - const char *ws_name = argv[3]; swayc_t *ws; - if (argc == 5 && strcasecmp(ws_name, "number") == 0) { + const char *num_name = NULL; + char *ws_name = NULL; + if (argc == 5 && strcasecmp(argv[3], "number") == 0) { // move "container to workspace number x" - ws_name = argv[4]; - ws = workspace_by_number(ws_name); + num_name = argv[4]; + ws = workspace_by_number(num_name); } else { + ws_name = join_args(argv + 3, argc - 3); ws = workspace_by_name(ws_name); } if (ws == NULL) { - ws = workspace_create(ws_name); + ws = workspace_create(ws_name ? ws_name : num_name); + } + if (ws_name) { + free(ws_name); } move_container_to(view, get_focused_container(ws)); } else if (strcasecmp(argv[1], "to") == 0 && strcasecmp(argv[2], "output") == 0) { @@ -161,11 +167,11 @@ struct cmd_results *cmd_move(int argc, char **argv) { wlc_view_get_visible_geometry(view->handle, &g); const struct wlc_size *size = wlc_output_get_resolution(output->handle); - struct wlc_point origin; - wlc_pointer_get_position(&origin); + double x_pos, y_pos; + wlc_pointer_get_position_v2(&x_pos, &y_pos); - int32_t x = origin.x - g.size.w / 2; - int32_t y = origin.y - g.size.h / 2; + int32_t x = x_pos - g.size.w / 2; + int32_t y = y_pos - g.size.h / 2; uint32_t w = size->w - g.size.w; uint32_t h = size->h - g.size.h; diff --git a/sway/commands/output.c b/sway/commands/output.c index e5d4b317..911391d2 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c @@ -46,7 +46,8 @@ struct cmd_results *cmd_output(int argc, char **argv) { output->enabled = 0; } else if (strcasecmp(command, "resolution") == 0 || strcasecmp(command, "res") == 0) { if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing resolution argument."); + error = cmd_results_new(CMD_INVALID, "output", "Missing resolution argument."); + goto fail; } char *res = argv[i]; char *x = strchr(res, 'x'); @@ -61,7 +62,8 @@ struct cmd_results *cmd_output(int argc, char **argv) { // Format is 1234 4321 width = atoi(res); if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing resolution argument (height)."); + error = cmd_results_new(CMD_INVALID, "output", "Missing resolution argument (height)."); + goto fail; } res = argv[i]; height = atoi(res); @@ -70,7 +72,8 @@ struct cmd_results *cmd_output(int argc, char **argv) { output->height = height; } else if (strcasecmp(command, "position") == 0 || strcasecmp(command, "pos") == 0) { if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing position argument."); + error = cmd_results_new(CMD_INVALID, "output", "Missing position argument."); + goto fail; } char *res = argv[i]; char *c = strchr(res, ','); @@ -85,7 +88,8 @@ struct cmd_results *cmd_output(int argc, char **argv) { // Format is 1234 4321 x = atoi(res); if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing position argument (y)."); + error = cmd_results_new(CMD_INVALID, "output", "Missing position argument (y)."); + goto fail; } res = argv[i]; y = atoi(res); @@ -94,25 +98,49 @@ struct cmd_results *cmd_output(int argc, char **argv) { output->y = y; } else if (strcasecmp(command, "scale") == 0) { if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing scale parameter."); + error = cmd_results_new(CMD_INVALID, "output", "Missing scale parameter."); + goto fail; } output->scale = atoi(argv[i]); } else if (strcasecmp(command, "background") == 0 || strcasecmp(command, "bg") == 0) { wordexp_t p; if (++i >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing background file or color specification."); + error = cmd_results_new(CMD_INVALID, "output", "Missing background file or color specification."); + goto fail; } if (i + 1 >= argc) { - return cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode or `solid_color`."); + error = cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode or `solid_color`."); + goto fail; } - if (strcasecmp(argv[argc - 1], "solid_color") == 0) { + if (strcasecmp(argv[i + 1], "solid_color") == 0) { output->background = strdup(argv[argc - 2]); output->background_option = strdup("solid_color"); } else { - char *src = join_args(argv + i, argc - i - 1); - char *mode = argv[argc - 1]; + // argv[i+j]=bg_option + bool valid = false; + char *mode; + size_t j; + for (j = 0; j < (size_t) (argc - i); ++j) { + mode = argv[i + j]; + for (size_t k = 0; k < sizeof(bg_options) / sizeof(char *); ++k) { + if (strcasecmp(mode, bg_options[k]) == 0) { + valid = true; + break; + } + } + if (valid) { + break; + } + } + if (!valid) { + error = cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode."); + goto fail; + } + + char *src = join_args(argv + i, j); if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { - return cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); + error = cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); + goto fail; } free(src); src = p.we_wordv[0]; @@ -132,27 +160,19 @@ struct cmd_results *cmd_output(int argc, char **argv) { } } if (!src || access(src, F_OK) == -1) { - return cmd_results_new(CMD_INVALID, "output", "Background file unreadable (%s)", src); - } - for (char *m = mode; *m; ++m) *m = tolower(*m); - // Check mode - bool valid = false; - size_t j; - for (j = 0; j < sizeof(bg_options) / sizeof(char *); ++j) { - if (strcasecmp(mode, bg_options[j]) == 0) { - valid = true; - break; - } - } - if (!valid) { - return cmd_results_new(CMD_INVALID, "output", "Invalid background scaling mode."); + error = cmd_results_new(CMD_INVALID, "output", "Background file unreadable (%s)", src); + wordfree(&p); + goto fail; } + output->background = strdup(src); output->background_option = strdup(mode); if (src != p.we_wordv[0]) { free(src); } wordfree(&p); + + i += j; } } } @@ -192,4 +212,8 @@ struct cmd_results *cmd_output(int argc, char **argv) { } return cmd_results_new(CMD_SUCCESS, NULL, NULL); + +fail: + free_output_config(output); + return error; } diff --git a/sway/commands/set.c b/sway/commands/set.c index e3d08dd3..46fc6d38 100644 --- a/sway/commands/set.c +++ b/sway/commands/set.c @@ -30,7 +30,7 @@ struct cmd_results *cmd_set(int argc, char **argv) { if (!tmp) { return cmd_results_new(CMD_FAILURE, "set", "Not possible to create variable $'%s'", argv[0]); } - snprintf(tmp, size, "$%s", argv[0]); + snprintf(tmp, size+1, "$%s", argv[0]); argv[0] = tmp; } |