aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/bind.c5
-rw-r--r--sway/commands/move.c24
-rw-r--r--sway/commands/output.c74
-rw-r--r--sway/commands/set.c2
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;
}