diff options
Diffstat (limited to 'sway/commands.c')
-rw-r--r-- | sway/commands.c | 167 |
1 files changed, 74 insertions, 93 deletions
diff --git a/sway/commands.c b/sway/commands.c index 3ed0c8db..e79746ae 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -21,35 +21,6 @@ swayc_t *sp_view; int sp_index = 0; -// Commands -static sway_cmd cmd_bindsym; -static sway_cmd cmd_orientation; -static sway_cmd cmd_exec; -static sway_cmd cmd_exec_always; -static sway_cmd cmd_exit; -static sway_cmd cmd_floating; -static sway_cmd cmd_floating_mod; -static sway_cmd cmd_focus; -static sway_cmd cmd_focus_follows_mouse; -static sway_cmd cmd_for_window; -static sway_cmd cmd_fullscreen; -static sway_cmd cmd_gaps; -static sway_cmd cmd_kill; -static sway_cmd cmd_layout; -static sway_cmd cmd_log_colors; -static sway_cmd cmd_mode; -static sway_cmd cmd_move; -static sway_cmd cmd_output; -static sway_cmd cmd_reload; -static sway_cmd cmd_resize; -static sway_cmd cmd_scratchpad; -static sway_cmd cmd_set; -static sway_cmd cmd_split; -static sway_cmd cmd_splith; -static sway_cmd cmd_splitv; -static sway_cmd cmd_workspace; -static sway_cmd cmd_ws_auto_back_and_forth; - static struct modifier_key { char *name; uint32_t mod; @@ -123,7 +94,7 @@ static int bindsym_sort(const void *_lbind, const void *_rbind) { return (rbind->keys->length + rmod) - (lbind->keys->length + lmod); } -enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_bindsym(int argc, char **argv) { if (!checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1) || !config->reading) { return CMD_FAILURE; @@ -132,7 +103,7 @@ enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) { struct sway_binding *binding = malloc(sizeof(struct sway_binding)); binding->keys = create_list(); binding->modifiers = 0; - binding->command = join_args(argc - 1, argv + 1); + binding->command = join_args(argv + 1, argc - 1); list_t *split = split_string(argv[0], "+"); int i; @@ -173,7 +144,7 @@ enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_exec_always(int argc, char **argv) { if (!checkarg(argc, "exec_always", EXPECTED_MORE_THAN, 0)) { return CMD_FAILURE; } @@ -189,7 +160,7 @@ enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) { } /* Child process */ if (pid == 0) { - char *args = join_args(argc, argv); + char *args = join_args(argv, argc); sway_log(L_DEBUG, "Executing %s", args); execl("/bin/sh", "sh", "-c", args, (char *)NULL); /* Execl doesnt return unless failure */ @@ -201,17 +172,17 @@ enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_exec(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_exec(int argc, char **argv) { if (!config->active) { return CMD_DEFER; } if (config->reloading) { - char *args = join_args(argc, argv); + char *args = join_args(argv, argc); sway_log(L_DEBUG, "Ignoring 'exec %s' due to reload", args); free(args); return CMD_SUCCESS; } - return cmd_exec_always(criteria, argc, argv); + return cmd_exec_always(argc, argv); } static void kill_views(swayc_t *container, void *data) { @@ -220,19 +191,18 @@ static void kill_views(swayc_t *container, void *data) { } } -enum cmd_status cmd_exit(char *criteria, int argc, char **argv) { - (void) argv; +static enum cmd_status cmd_exit(int argc, char **argv) { if (!checkarg(argc, "exit", EXPECTED_EQUAL_TO, 0) || config->reading || !config->active) { return CMD_FAILURE; } // Close all views - swayc_map(kill_views, NULL); + container_map(&root_container, kill_views, NULL); sway_terminate(); return CMD_SUCCESS; } -enum cmd_status cmd_floating(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_floating(int argc, char **argv) { if (!checkarg(argc, "floating", EXPECTED_EQUAL_TO, 1) || config->reading || !config->active) { return CMD_FAILURE; @@ -294,7 +264,7 @@ enum cmd_status cmd_floating(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_floating_mod(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_floating_mod(int argc, char **argv) { if (!checkarg(argc, "floating_modifier", EXPECTED_EQUAL_TO, 1) || !config->reading) { return CMD_FAILURE; @@ -319,7 +289,7 @@ enum cmd_status cmd_floating_mod(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_focus(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_focus(int argc, char **argv) { static int floating_toggled_index = 0; static int tiled_toggled_index = 0; if (!checkarg(argc, "focus", EXPECTED_EQUAL_TO, 1) @@ -377,7 +347,7 @@ enum cmd_status cmd_focus(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_focus_follows_mouse(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_focus_follows_mouse(int argc, char **argv) { if (!checkarg(argc, "focus_follows_mouse", EXPECTED_EQUAL_TO, 1)) { return CMD_FAILURE; } @@ -386,21 +356,6 @@ enum cmd_status cmd_focus_follows_mouse(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -static void debug_for_window(swayc_t *view, void *data) { - layout_log(view, 0); -} - -enum cmd_status cmd_for_window(char *criteria, int argc, char **argv) { - if (!checkarg(argc, "for_window", EXPECTED_AT_LEAST, 1)) { - return CMD_FAILURE; - } - //TODO - void *re = compile_regex(argv[0]); - swayc_map_by_test(debug_for_window, test_view_title_regex, NULL, re); - free_regex(re); - return CMD_FAILURE; -} - static void hide_view_in_scratchpad(swayc_t *sp_view) { if(sp_view == NULL) { return; @@ -417,7 +372,7 @@ static void hide_view_in_scratchpad(swayc_t *sp_view) { set_focused_container(container_under_pointer()); } -enum cmd_status cmd_mode(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_mode(int argc, char **argv) { if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)) { return CMD_FAILURE; } @@ -426,7 +381,7 @@ enum cmd_status cmd_mode(char *criteria, int argc, char **argv) { return CMD_FAILURE; } - char *mode_name = join_args(argc - mode_make, argv); + char *mode_name = join_args(argv, argc - mode_make); struct sway_mode *mode = NULL; // Find mode int i, len = config->modes->length; @@ -456,7 +411,7 @@ enum cmd_status cmd_mode(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_move(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_move(int argc, char **argv) { if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1) || config->reading || !config->active) { return CMD_FAILURE; @@ -489,7 +444,11 @@ enum cmd_status cmd_move(char *criteria, int argc, char **argv) { // move "container to workspace number x" ws_name = argv[4]; } - swayc_t *ws = new_workspace(NULL, ws_name); + + swayc_t *ws = workspace_by_name(ws_name); + if (ws == NULL) { + ws = workspace_create(ws_name); + } move_container_to(view, get_focused_container(ws)); } else if (strcasecmp(argv[0], "scratchpad") == 0) { if (view->type != C_CONTAINER && view->type != C_VIEW) { @@ -523,7 +482,7 @@ enum cmd_status cmd_move(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_orientation(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_orientation(int argc, char **argv) { if (!checkarg(argc, "orientation", EXPECTED_EQUAL_TO, 1) || !config->reading) { return CMD_FAILURE; @@ -540,7 +499,7 @@ enum cmd_status cmd_orientation(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_output(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_output(int argc, char **argv) { if (!checkarg(argc, "output", EXPECTED_AT_LEAST, 1)) { return CMD_FAILURE; } @@ -605,7 +564,7 @@ enum cmd_status cmd_output(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_gaps(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_gaps(int argc, char **argv) { if (!checkarg(argc, "gaps", EXPECTED_AT_LEAST, 1)) { return CMD_FAILURE; } @@ -739,14 +698,15 @@ enum cmd_status cmd_gaps(char *criteria, int argc, char **argv) { top = &root_container; } int top_gap = top->gaps; - swayc_map_r(top, method == SET ? set_gaps : add_gaps, &amount); + container_map(top, method == SET ? set_gaps : add_gaps, &amount); top->gaps = top_gap; arrange_windows(top, -1, -1); } + return CMD_SUCCESS; } -enum cmd_status cmd_kill(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_kill(int argc, char **argv) { if (config->reading || !config->active) { return CMD_FAILURE; } @@ -755,7 +715,7 @@ enum cmd_status cmd_kill(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_layout(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_layout(int argc, char **argv) { if (!checkarg(argc, "layout", EXPECTED_MORE_THAN, 0) || config->reading || !config->active) { return CMD_FAILURE; @@ -781,7 +741,7 @@ enum cmd_status cmd_layout(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_reload(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_reload(int argc, char **argv) { if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0) || config->reading || !load_config(NULL)) { @@ -791,7 +751,7 @@ enum cmd_status cmd_reload(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_resize(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_resize(int argc, char **argv) { if (!checkarg(argc, "resize", EXPECTED_AT_LEAST, 3) || config->reading || !config->active) { return CMD_FAILURE; @@ -821,7 +781,7 @@ enum cmd_status cmd_resize(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -static swayc_t *fetch_view_from_scratchpad(void) { +static swayc_t *fetch_view_from_scratchpad() { if (sp_index >= scratchpad->length) { sp_index = 0; } @@ -866,7 +826,7 @@ void remove_view_from_scratchpad(swayc_t *view) { } } -enum cmd_status cmd_scratchpad(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_scratchpad(int argc, char **argv) { if (!checkarg(argc, "scratchpad", EXPECTED_EQUAL_TO, 1) || config->reading || !config->active) { return CMD_FAILURE; @@ -900,7 +860,7 @@ static int compare_set(const void *_l, const void *_r) { return strlen((*r)->name) - strlen((*l)->name); } -enum cmd_status cmd_set(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_set(int argc, char **argv) { if (!checkarg(argc, "set", EXPECTED_AT_LEAST, 2) || !config->reading) { return CMD_FAILURE; @@ -923,11 +883,11 @@ enum cmd_status cmd_set(char *criteria, int argc, char **argv) { list_add(config->symbols, var); list_sort(config->symbols, compare_set); } - var->value = join_args(argc - 1, argv + 1); + var->value = join_args(argv + 1, argc - 1); return CMD_SUCCESS; } -static enum cmd_status _do_split(char *criteria, int argc, char **argv, int layout) { +static enum cmd_status _do_split(int argc, char **argv, int layout) { char *name = layout == L_VERT ? "splitv" : layout == L_HORIZ ? "splith" : "split"; if (!checkarg(argc, name, EXPECTED_EQUAL_TO, 0) @@ -959,16 +919,16 @@ static enum cmd_status _do_split(char *criteria, int argc, char **argv, int layo return CMD_SUCCESS; } -enum cmd_status cmd_split(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_split(int argc, char **argv) { if (!checkarg(argc, "split", EXPECTED_EQUAL_TO, 1) || config->reading || !config->active) { return CMD_FAILURE; } if (strcasecmp(argv[0], "v") == 0 || strcasecmp(argv[0], "vertical") == 0) { - _do_split(criteria, argc - 1, argv + 1, L_VERT); + _do_split(argc - 1, argv + 1, L_VERT); } else if (strcasecmp(argv[0], "h") == 0 || strcasecmp(argv[0], "horizontal") == 0) { - _do_split(criteria, argc - 1, argv + 1, L_HORIZ); + _do_split(argc - 1, argv + 1, L_HORIZ); } else { sway_log(L_ERROR, "Invalid split command (expected either horiziontal or vertical)."); return CMD_FAILURE; @@ -976,15 +936,15 @@ enum cmd_status cmd_split(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_splitv(char *criteria, int argc, char **argv) { - return _do_split(criteria, argc, argv, L_VERT); +static enum cmd_status cmd_splitv(int argc, char **argv) { + return _do_split(argc, argv, L_VERT); } -enum cmd_status cmd_splith(char *criteria, int argc, char **argv) { - return _do_split(criteria, argc, argv, L_HORIZ); +static enum cmd_status cmd_splith(int argc, char **argv) { + return _do_split(argc, argv, L_HORIZ); } -enum cmd_status cmd_log_colors(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_log_colors(int argc, char **argv) { if (!checkarg(argc, "log_colors", EXPECTED_EQUAL_TO, 1) || !config->reading) { return CMD_FAILURE; @@ -1000,7 +960,7 @@ enum cmd_status cmd_log_colors(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_fullscreen(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_fullscreen(int argc, char **argv) { if (!checkarg(argc, "fullscreen", EXPECTED_AT_LEAST, 0) || config->reading || !config->active) { return CMD_FAILURE; @@ -1020,7 +980,7 @@ enum cmd_status cmd_fullscreen(char *criteria, int argc, char **argv) { return CMD_SUCCESS; } -enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_workspace(int argc, char **argv) { if (!checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1)) { return CMD_FAILURE; } @@ -1029,7 +989,28 @@ enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) { if (config->reading || !config->active) { return CMD_DEFER; } - workspace_switch(new_workspace(NULL, argv[0])); + // Handle workspace next/prev + swayc_t *ws = NULL; + if (strcasecmp(argv[0], "next") == 0) { + ws = workspace_next(); + } else if (strcasecmp(argv[0], "prev") == 0) { + ws = workspace_prev(); + } else if (strcasecmp(argv[0], "next_on_output") == 0) { + ws = workspace_output_next(); + } else if (strcasecmp(argv[0], "prev_on_output") == 0) { + ws = workspace_output_prev(); + } else if (strcasecmp(argv[0], "back_and_forth") == 0) { + if (prev_workspace_name) { + if (!(ws = workspace_by_name(prev_workspace_name))) { + ws = workspace_create(prev_workspace_name); + } + } + } else { + if (!(ws= workspace_by_name(argv[0]))) { + ws = workspace_create(argv[0]); + } + } + workspace_switch(ws); } else { if (strcasecmp(argv[1], "output") == 0) { if (!checkarg(argc, "workspace", EXPECTED_EQUAL_TO, 3)) { @@ -1040,12 +1021,15 @@ enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) { wso->workspace = strdup(argv[0]); wso->output = strdup(argv[2]); list_add(config->workspace_outputs, wso); + if (!config->reading) { + // TODO: Move workspace to output. (dont do so when reloading) + } } } return CMD_SUCCESS; } -enum cmd_status cmd_ws_auto_back_and_forth(char *criteria, int argc, char **argv) { +static enum cmd_status cmd_ws_auto_back_and_forth(int argc, char **argv) { if (!checkarg(argc, "workspace_auto_back_and_forth", EXPECTED_EQUAL_TO, 1)) { return CMD_FAILURE; } @@ -1060,7 +1044,7 @@ enum cmd_status cmd_ws_auto_back_and_forth(char *criteria, int argc, char **argv } /* Keep alphabetized */ -static const struct cmd_handler handlers[] = { +static struct cmd_handler handlers[] = { { "bindsym", cmd_bindsym }, { "default_orientation", cmd_orientation }, { "exec", cmd_exec }, @@ -1070,7 +1054,6 @@ static const struct cmd_handler handlers[] = { { "floating_modifier", cmd_floating_mod }, { "focus", cmd_focus }, { "focus_follows_mouse", cmd_focus_follows_mouse }, - { "for_window", cmd_for_window }, { "fullscreen", cmd_fullscreen }, { "gaps", cmd_gaps }, { "kill", cmd_kill }, @@ -1107,7 +1090,6 @@ static struct cmd_handler *find_handler(char *line) { enum cmd_status handle_command(char *exec) { sway_log(L_INFO, "Handling command '%s'", exec); int argc; - char *criteria = NULL; char **argv = split_args(exec, &argc); enum cmd_status status = CMD_FAILURE; struct cmd_handler *handler; @@ -1115,7 +1097,7 @@ enum cmd_status handle_command(char *exec) { return status; } if ((handler = find_handler(argv[0])) == NULL - || (status = handler->handle(criteria, argc - 1, argv + 1)) != CMD_SUCCESS) { + || (status = handler->handle(argc - 1, argv + 1)) != CMD_SUCCESS) { sway_log(L_ERROR, "Command failed: %s", argv[0]); } free_argv(argc, argv); @@ -1126,7 +1108,6 @@ enum cmd_status config_command(char *exec) { sway_log(L_INFO, "handling config command '%s'", exec); int argc; char **argv = split_args(exec, &argc); - char *criteria = NULL; enum cmd_status status = CMD_FAILURE; struct cmd_handler *handler; if (!argc) { @@ -1146,7 +1127,7 @@ enum cmd_status config_command(char *exec) { for (; i < e; ++i) { argv[i] = do_var_replacement(argv[i]); } - status = handler->handle(criteria, argc - 1, argv + 1); + status = handler->handle(argc - 1, argv + 1); if (status == CMD_FAILURE) { sway_log(L_ERROR, "Config load failed for line `%s'", exec); } else if (status == CMD_DEFER) { |