diff options
author | Drew DeVault <sir@cmpwn.com> | 2019-02-15 21:01:54 -0500 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2019-02-17 11:50:07 -0500 |
commit | 487c83f0de9ca2a7650ad636eed6fd694ddcb82e (patch) | |
tree | 1d679e8eb33c62bd60c14a4be4f3d5c8d89082fe /sway | |
parent | Remove refs to unimplemented debuglog command (diff) | |
download | sway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.tar.gz sway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.tar.zst sway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.zip |
Add workspace {prev,next}_on_output --create
This creates the next workspace if you hit the end.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands/workspace.c | 13 | ||||
-rw-r--r-- | sway/tree/workspace.c | 29 |
2 files changed, 28 insertions, 14 deletions
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c index 65a3f407..5fde8129 100644 --- a/sway/commands/workspace.c +++ b/sway/commands/workspace.c | |||
@@ -181,7 +181,9 @@ struct cmd_results *cmd_workspace(int argc, char **argv) { | |||
181 | ++argv; | 181 | ++argv; |
182 | } | 182 | } |
183 | 183 | ||
184 | 184 | bool create = argc > 1 && strcasecmp(argv[1], "--create") == 0; | |
185 | struct sway_seat *seat = config->handler_context.seat; | ||
186 | struct sway_workspace *current = seat_get_focused_workspace(seat); | ||
185 | struct sway_workspace *ws = NULL; | 187 | struct sway_workspace *ws = NULL; |
186 | if (strcasecmp(argv[0], "number") == 0) { | 188 | if (strcasecmp(argv[0], "number") == 0) { |
187 | if (argc < 2) { | 189 | if (argc < 2) { |
@@ -199,12 +201,13 @@ struct cmd_results *cmd_workspace(int argc, char **argv) { | |||
199 | } | 201 | } |
200 | } else if (strcasecmp(argv[0], "next") == 0 || | 202 | } else if (strcasecmp(argv[0], "next") == 0 || |
201 | strcasecmp(argv[0], "prev") == 0 || | 203 | strcasecmp(argv[0], "prev") == 0 || |
202 | strcasecmp(argv[0], "next_on_output") == 0 || | ||
203 | strcasecmp(argv[0], "prev_on_output") == 0 || | ||
204 | strcasecmp(argv[0], "current") == 0) { | 204 | strcasecmp(argv[0], "current") == 0) { |
205 | ws = workspace_by_name(argv[0]); | 205 | ws = workspace_by_name(argv[0]); |
206 | } else if (strcasecmp(argv[0], "next_on_output") == 0) { | ||
207 | ws = workspace_output_next(current, create); | ||
208 | } else if (strcasecmp(argv[0], "prev_on_output") == 0) { | ||
209 | ws = workspace_output_prev(current, create); | ||
206 | } else if (strcasecmp(argv[0], "back_and_forth") == 0) { | 210 | } else if (strcasecmp(argv[0], "back_and_forth") == 0) { |
207 | struct sway_seat *seat = config->handler_context.seat; | ||
208 | if (!seat->prev_workspace_name) { | 211 | if (!seat->prev_workspace_name) { |
209 | return cmd_results_new(CMD_INVALID, | 212 | return cmd_results_new(CMD_INVALID, |
210 | "There is no previous workspace"); | 213 | "There is no previous workspace"); |
@@ -220,7 +223,7 @@ struct cmd_results *cmd_workspace(int argc, char **argv) { | |||
220 | free(name); | 223 | free(name); |
221 | } | 224 | } |
222 | workspace_switch(ws, no_auto_back_and_forth); | 225 | workspace_switch(ws, no_auto_back_and_forth); |
223 | seat_consider_warp_to_focus(config->handler_context.seat); | 226 | seat_consider_warp_to_focus(seat); |
224 | } | 227 | } |
225 | return cmd_results_new(CMD_SUCCESS, NULL); | 228 | return cmd_results_new(CMD_SUCCESS, NULL); |
226 | } | 229 | } |
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index cda6caf7..68f1de50 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c | |||
@@ -230,8 +230,10 @@ static void workspace_name_from_binding(const struct sway_binding * binding, | |||
230 | // not a command about workspaces | 230 | // not a command about workspaces |
231 | if (strcmp(_target, "next") == 0 || | 231 | if (strcmp(_target, "next") == 0 || |
232 | strcmp(_target, "prev") == 0 || | 232 | strcmp(_target, "prev") == 0 || |
233 | strcmp(_target, "next_on_output") == 0 || | 233 | strncmp(_target, "next_on_output", |
234 | strcmp(_target, "prev_on_output") == 0 || | 234 | strlen("next_on_output")) == 0 || |
235 | strncmp(_target, "prev_on_output", | ||
236 | strlen("next_on_output")) == 0 || | ||
235 | strcmp(_target, "number") == 0 || | 237 | strcmp(_target, "number") == 0 || |
236 | strcmp(_target, "back_and_forth") == 0 || | 238 | strcmp(_target, "back_and_forth") == 0 || |
237 | strcmp(_target, "current") == 0) { | 239 | strcmp(_target, "current") == 0) { |
@@ -372,11 +374,11 @@ struct sway_workspace *workspace_by_name(const char *name) { | |||
372 | if (strcmp(name, "prev") == 0) { | 374 | if (strcmp(name, "prev") == 0) { |
373 | return workspace_prev(current); | 375 | return workspace_prev(current); |
374 | } else if (strcmp(name, "prev_on_output") == 0) { | 376 | } else if (strcmp(name, "prev_on_output") == 0) { |
375 | return workspace_output_prev(current); | 377 | return workspace_output_prev(current, false); |
376 | } else if (strcmp(name, "next") == 0) { | 378 | } else if (strcmp(name, "next") == 0) { |
377 | return workspace_next(current); | 379 | return workspace_next(current); |
378 | } else if (strcmp(name, "next_on_output") == 0) { | 380 | } else if (strcmp(name, "next_on_output") == 0) { |
379 | return workspace_output_next(current); | 381 | return workspace_output_next(current, false); |
380 | } else if (strcmp(name, "current") == 0) { | 382 | } else if (strcmp(name, "current") == 0) { |
381 | return current; | 383 | return current; |
382 | } else if (strcasecmp(name, "back_and_forth") == 0) { | 384 | } else if (strcasecmp(name, "back_and_forth") == 0) { |
@@ -397,11 +399,18 @@ struct sway_workspace *workspace_by_name(const char *name) { | |||
397 | * otherwise the next one is returned. | 399 | * otherwise the next one is returned. |
398 | */ | 400 | */ |
399 | static struct sway_workspace *workspace_output_prev_next_impl( | 401 | static struct sway_workspace *workspace_output_prev_next_impl( |
400 | struct sway_output *output, int dir) { | 402 | struct sway_output *output, int dir, bool create) { |
401 | struct sway_seat *seat = input_manager_current_seat(); | 403 | struct sway_seat *seat = input_manager_current_seat(); |
402 | struct sway_workspace *workspace = seat_get_focused_workspace(seat); | 404 | struct sway_workspace *workspace = seat_get_focused_workspace(seat); |
403 | 405 | ||
404 | int index = list_find(output->workspaces, workspace); | 406 | int index = list_find(output->workspaces, workspace); |
407 | if (!workspace_is_empty(workspace) && create && | ||
408 | (index + dir < 0 || index + dir == output->workspaces->length)) { | ||
409 | struct sway_output *output = workspace->output; | ||
410 | char *next = workspace_next_name(output->wlr_output->name); | ||
411 | workspace_create(output, next); | ||
412 | free(next); | ||
413 | } | ||
405 | size_t new_index = wrap(index + dir, output->workspaces->length); | 414 | size_t new_index = wrap(index + dir, output->workspaces->length); |
406 | return output->workspaces->items[new_index]; | 415 | return output->workspaces->items[new_index]; |
407 | } | 416 | } |
@@ -432,16 +441,18 @@ static struct sway_workspace *workspace_prev_next_impl( | |||
432 | } | 441 | } |
433 | } | 442 | } |
434 | 443 | ||
435 | struct sway_workspace *workspace_output_next(struct sway_workspace *current) { | 444 | struct sway_workspace *workspace_output_next( |
436 | return workspace_output_prev_next_impl(current->output, 1); | 445 | struct sway_workspace *current, bool create) { |
446 | return workspace_output_prev_next_impl(current->output, 1, create); | ||
437 | } | 447 | } |
438 | 448 | ||
439 | struct sway_workspace *workspace_next(struct sway_workspace *current) { | 449 | struct sway_workspace *workspace_next(struct sway_workspace *current) { |
440 | return workspace_prev_next_impl(current, 1); | 450 | return workspace_prev_next_impl(current, 1); |
441 | } | 451 | } |
442 | 452 | ||
443 | struct sway_workspace *workspace_output_prev(struct sway_workspace *current) { | 453 | struct sway_workspace *workspace_output_prev( |
444 | return workspace_output_prev_next_impl(current->output, -1); | 454 | struct sway_workspace *current, bool create) { |
455 | return workspace_output_prev_next_impl(current->output, -1, create); | ||
445 | } | 456 | } |
446 | 457 | ||
447 | struct sway_workspace *workspace_prev(struct sway_workspace *current) { | 458 | struct sway_workspace *workspace_prev(struct sway_workspace *current) { |