summaryrefslogtreecommitdiffstats
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) {
61 sym = ((char *)split->items[i])[strlen("button")] - '1' + M_LEFT_CLICK; 61 sym = ((char *)split->items[i])[strlen("button")] - '1' + M_LEFT_CLICK;
62 } 62 }
63 if (!sym) { 63 if (!sym) {
64 struct cmd_results *ret = cmd_results_new(CMD_INVALID, "bindsym",
65 "Unknown key '%s'", (char *)split->items[i]);
64 free_sway_binding(binding); 66 free_sway_binding(binding);
65 free_flat_list(split); 67 free_flat_list(split);
66 return cmd_results_new(CMD_INVALID, "bindsym", "Unknown key '%s'", 68 return ret;
67 (char *)split->items[i]);
68 } 69 }
69 xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t)); 70 xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t));
70 if (!key) { 71 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 @@
7#include "sway/output.h" 7#include "sway/output.h"
8#include "sway/workspace.h" 8#include "sway/workspace.h"
9#include "list.h" 9#include "list.h"
10#include "stringop.h"
10 11
11struct cmd_results *cmd_move(int argc, char **argv) { 12struct cmd_results *cmd_move(int argc, char **argv) {
12 struct cmd_results *error = NULL; 13 struct cmd_results *error = NULL;
@@ -59,18 +60,23 @@ struct cmd_results *cmd_move(int argc, char **argv) {
59 return cmd_results_new(CMD_FAILURE, "move", "Can only move containers and views."); 60 return cmd_results_new(CMD_FAILURE, "move", "Can only move containers and views.");
60 } 61 }
61 62
62 const char *ws_name = argv[3];
63 swayc_t *ws; 63 swayc_t *ws;
64 if (argc == 5 && strcasecmp(ws_name, "number") == 0) { 64 const char *num_name = NULL;
65 char *ws_name = NULL;
66 if (argc == 5 && strcasecmp(argv[3], "number") == 0) {
65 // move "container to workspace number x" 67 // move "container to workspace number x"
66 ws_name = argv[4]; 68 num_name = argv[4];
67 ws = workspace_by_number(ws_name); 69 ws = workspace_by_number(num_name);
68 } else { 70 } else {
71 ws_name = join_args(argv + 3, argc - 3);
69 ws = workspace_by_name(ws_name); 72 ws = workspace_by_name(ws_name);
70 } 73 }
71 74
72 if (ws == NULL) { 75 if (ws == NULL) {
73 ws = workspace_create(ws_name); 76 ws = workspace_create(ws_name ? ws_name : num_name);
77 }
78 if (ws_name) {
79 free(ws_name);
74 } 80 }
75 move_container_to(view, get_focused_container(ws)); 81 move_container_to(view, get_focused_container(ws));
76 } else if (strcasecmp(argv[1], "to") == 0 && strcasecmp(argv[2], "output") == 0) { 82 } 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) {
161 wlc_view_get_visible_geometry(view->handle, &g); 167 wlc_view_get_visible_geometry(view->handle, &g);
162 const struct wlc_size *size = wlc_output_get_resolution(output->handle); 168 const struct wlc_size *size = wlc_output_get_resolution(output->handle);
163 169
164 struct wlc_point origin; 170 double x_pos, y_pos;
165 wlc_pointer_get_position(&origin); 171 wlc_pointer_get_position_v2(&x_pos, &y_pos);
166 172
167 int32_t x = origin.x - g.size.w / 2; 173 int32_t x = x_pos - g.size.w / 2;
168 int32_t y = origin.y - g.size.h / 2; 174 int32_t y = y_pos - g.size.h / 2;
169 175
170 uint32_t w = size->w - g.size.w; 176 uint32_t w = size->w - g.size.w;
171 uint32_t h = size->h - g.size.h; 177 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) {
46 output->enabled = 0; 46 output->enabled = 0;
47 } else if (strcasecmp(command, "resolution") == 0 || strcasecmp(command, "res") == 0) { 47 } else if (strcasecmp(command, "resolution") == 0 || strcasecmp(command, "res") == 0) {
48 if (++i >= argc) { 48 if (++i >= argc) {
49 return cmd_results_new(CMD_INVALID, "output", "Missing resolution argument."); 49 error = cmd_results_new(CMD_INVALID, "output", "Missing resolution argument.");
50 goto fail;
50 } 51 }
51 char *res = argv[i]; 52 char *res = argv[i];
52 char *x = strchr(res, 'x'); 53 char *x = strchr(res, 'x');
@@ -61,7 +62,8 @@ struct cmd_results *cmd_output(int argc, char **argv) {
61 // Format is 1234 4321 62 // Format is 1234 4321
62 width = atoi(res); 63 width = atoi(res);
63 if (++i >= argc) { 64 if (++i >= argc) {
64 return cmd_results_new(CMD_INVALID, "output", "Missing resolution argument (height)."); 65 error = cmd_results_new(CMD_INVALID, "output", "Missing resolution argument (height).");
66 goto fail;
65 } 67 }
66 res = argv[i]; 68 res = argv[i];
67 height = atoi(res); 69 height = atoi(res);
@@ -70,7 +72,8 @@ struct cmd_results *cmd_output(int argc, char **argv) {
70 output->height = height; 72 output->height = height;
71 } else if (strcasecmp(command, "position") == 0 || strcasecmp(command, "pos") == 0) { 73 } else if (strcasecmp(command, "position") == 0 || strcasecmp(command, "pos") == 0) {
72 if (++i >= argc) { 74 if (++i >= argc) {
73 return cmd_results_new(CMD_INVALID, "output", "Missing position argument."); 75 error = cmd_results_new(CMD_INVALID, "output", "Missing position argument.");
76 goto fail;
74 } 77 }
75 char *res = argv[i]; 78 char *res = argv[i];
76 char *c = strchr(res, ','); 79 char *c = strchr(res, ',');
@@ -85,7 +88,8 @@ struct cmd_results *cmd_output(int argc, char **argv) {
85 // Format is 1234 4321 88 // Format is 1234 4321
86 x = atoi(res); 89 x = atoi(res);
87 if (++i >= argc) { 90 if (++i >= argc) {
88 return cmd_results_new(CMD_INVALID, "output", "Missing position argument (y)."); 91 error = cmd_results_new(CMD_INVALID, "output", "Missing position argument (y).");
92 goto fail;
89 } 93 }
90 res = argv[i]; 94 res = argv[i];
91 y = atoi(res); 95 y = atoi(res);
@@ -94,25 +98,49 @@ struct cmd_results *cmd_output(int argc, char **argv) {
94 output->y = y; 98 output->y = y;
95 } else if (strcasecmp(command, "scale") == 0) { 99 } else if (strcasecmp(command, "scale") == 0) {
96 if (++i >= argc) { 100 if (++i >= argc) {
97 return cmd_results_new(CMD_INVALID, "output", "Missing scale parameter."); 101 error = cmd_results_new(CMD_INVALID, "output", "Missing scale parameter.");
102 goto fail;
98 } 103 }
99 output->scale = atoi(argv[i]); 104 output->scale = atoi(argv[i]);
100 } else if (strcasecmp(command, "background") == 0 || strcasecmp(command, "bg") == 0) { 105 } else if (strcasecmp(command, "background") == 0 || strcasecmp(command, "bg") == 0) {
101 wordexp_t p; 106 wordexp_t p;
102 if (++i >= argc) { 107 if (++i >= argc) {
103 return cmd_results_new(CMD_INVALID, "output", "Missing background file or color specification."); 108 error = cmd_results_new(CMD_INVALID, "output", "Missing background file or color specification.");
109 goto fail;
104 } 110 }
105 if (i + 1 >= argc) { 111 if (i + 1 >= argc) {
106 return cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode or `solid_color`."); 112 error = cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode or `solid_color`.");
113 goto fail;
107 } 114 }
108 if (strcasecmp(argv[argc - 1], "solid_color") == 0) { 115 if (strcasecmp(argv[i + 1], "solid_color") == 0) {
109 output->background = strdup(argv[argc - 2]); 116 output->background = strdup(argv[argc - 2]);
110 output->background_option = strdup("solid_color"); 117 output->background_option = strdup("solid_color");
111 } else { 118 } else {
112 char *src = join_args(argv + i, argc - i - 1); 119 // argv[i+j]=bg_option
113 char *mode = argv[argc - 1]; 120 bool valid = false;
121 char *mode;
122 size_t j;
123 for (j = 0; j < (size_t) (argc - i); ++j) {
124 mode = argv[i + j];
125 for (size_t k = 0; k < sizeof(bg_options) / sizeof(char *); ++k) {
126 if (strcasecmp(mode, bg_options[k]) == 0) {
127 valid = true;
128 break;
129 }
130 }
131 if (valid) {
132 break;
133 }
134 }
135 if (!valid) {
136 error = cmd_results_new(CMD_INVALID, "output", "Missing background scaling mode.");
137 goto fail;
138 }
139
140 char *src = join_args(argv + i, j);
114 if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { 141 if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) {
115 return cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); 142 error = cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src);
143 goto fail;
116 } 144 }
117 free(src); 145 free(src);
118 src = p.we_wordv[0]; 146 src = p.we_wordv[0];
@@ -132,27 +160,19 @@ struct cmd_results *cmd_output(int argc, char **argv) {
132 } 160 }
133 } 161 }
134 if (!src || access(src, F_OK) == -1) { 162 if (!src || access(src, F_OK) == -1) {
135 return cmd_results_new(CMD_INVALID, "output", "Background file unreadable (%s)", src); 163 error = cmd_results_new(CMD_INVALID, "output", "Background file unreadable (%s)", src);
136 } 164 wordfree(&p);
137 for (char *m = mode; *m; ++m) *m = tolower(*m); 165 goto fail;
138 // Check mode
139 bool valid = false;
140 size_t j;
141 for (j = 0; j < sizeof(bg_options) / sizeof(char *); ++j) {
142 if (strcasecmp(mode, bg_options[j]) == 0) {
143 valid = true;
144 break;
145 }
146 }
147 if (!valid) {
148 return cmd_results_new(CMD_INVALID, "output", "Invalid background scaling mode.");
149 } 166 }
167
150 output->background = strdup(src); 168 output->background = strdup(src);
151 output->background_option = strdup(mode); 169 output->background_option = strdup(mode);
152 if (src != p.we_wordv[0]) { 170 if (src != p.we_wordv[0]) {
153 free(src); 171 free(src);
154 } 172 }
155 wordfree(&p); 173 wordfree(&p);
174
175 i += j;
156 } 176 }
157 } 177 }
158 } 178 }
@@ -192,4 +212,8 @@ struct cmd_results *cmd_output(int argc, char **argv) {
192 } 212 }
193 213
194 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 214 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
215
216fail:
217 free_output_config(output);
218 return error;
195} 219}
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) {
30 if (!tmp) { 30 if (!tmp) {
31 return cmd_results_new(CMD_FAILURE, "set", "Not possible to create variable $'%s'", argv[0]); 31 return cmd_results_new(CMD_FAILURE, "set", "Not possible to create variable $'%s'", argv[0]);
32 } 32 }
33 snprintf(tmp, size, "$%s", argv[0]); 33 snprintf(tmp, size+1, "$%s", argv[0]);
34 34
35 argv[0] = tmp; 35 argv[0] = tmp;
36 } 36 }