diff options
Diffstat (limited to 'sway/commands')
| -rw-r--r-- | sway/commands/mark.c | 68 | ||||
| -rw-r--r-- | sway/commands/unmark.c | 59 | 
2 files changed, 127 insertions, 0 deletions
| diff --git a/sway/commands/mark.c b/sway/commands/mark.c new file mode 100644 index 00000000..b131f2f3 --- /dev/null +++ b/sway/commands/mark.c @@ -0,0 +1,68 @@ +#define _POSIX_C_SOURCE 200809L +#include <string.h> +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/view.h" +#include "list.h" +#include "log.h" +#include "stringop.h" + +// mark foo                      Same as mark --replace foo +// mark --add foo                Add this mark to view's list +// mark --replace foo            Replace view's marks with this single one +// mark --add --toggle foo       Toggle current mark and persist other marks +// mark --replace --toggle foo   Toggle current mark and remove other marks + +struct cmd_results *cmd_mark(int argc, char **argv) { +	struct cmd_results *error = NULL; +	if ((error = checkarg(argc, "mark", EXPECTED_AT_LEAST, 1))) { +		return error; +	} +	struct sway_container *container = +		config->handler_context.current_container; +	if (container->type != C_VIEW) { +		return cmd_results_new(CMD_INVALID, "mark", +				"Only views can have marks"); +	} +	struct sway_view *view = container->sway_view; + +	bool add = false, toggle = false; +	while (argc > 0 && strncmp(*argv, "--", 2) == 0) { +		if (strcmp(*argv, "--add") == 0) { +			add = true; +		} else if (strcmp(*argv, "--replace") == 0) { +			add = false; +		} else if (strcmp(*argv, "--toggle") == 0) { +			toggle = true; +		} else { +			return cmd_results_new(CMD_INVALID, "mark", +					"Unrecognized argument '%s'", *argv); +		} +		++argv; +		--argc; +	} + +	if (!argc) { +		return cmd_results_new(CMD_INVALID, "mark", +				"Expected '[--add|--replace] [--toggle] <identifier>'"); +	} + +	char *mark = join_args(argv, argc); +	bool had_mark = view_has_mark(view, mark); + +	if (!add) { +		// Replacing +		view_clear_marks(view); +	} + +	view_find_and_unmark(mark); + +	if (!toggle || !had_mark) { +		list_add(view->marks, strdup(mark)); +	} + +	free(mark); +	view_execute_criteria(view); + +	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/unmark.c b/sway/commands/unmark.c new file mode 100644 index 00000000..ea2a5709 --- /dev/null +++ b/sway/commands/unmark.c @@ -0,0 +1,59 @@ +#define _POSIX_C_SOURCE 200809L +#include <string.h> +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/view.h" +#include "list.h" +#include "log.h" +#include "stringop.h" + +static void remove_all_marks_iterator(struct sway_container *con, void *data) { +	if (con->type == C_VIEW) { +		view_clear_marks(con->sway_view); +	} +} + +// unmark                  Remove all marks from all views +// unmark foo              Remove single mark from whichever view has it +// [criteria] unmark       Remove all marks from matched view +// [criteria] unmark foo   Remove single mark from matched view + +struct cmd_results *cmd_unmark(int argc, char **argv) { +	// Determine the view +	struct sway_view *view = NULL; +	if (config->handler_context.using_criteria) { +		struct sway_container *container = +			config->handler_context.current_container; +		if (container->type != C_VIEW) { +			return cmd_results_new(CMD_INVALID, "unmark", +					"Only views can have marks"); +		} +		view = container->sway_view; +	} + +	// Determine the mark +	char *mark = NULL; +	if (argc > 0) { +		mark = join_args(argv, argc); +	} + +	if (view && mark) { +		// Remove the mark from the given view +		if (view_has_mark(view, mark)) { +			view_find_and_unmark(mark); +		} +	} else if (view && !mark) { +		// Clear all marks from the given view +		view_clear_marks(view); +	} else if (!view && mark) { +		// Remove mark from whichever view has it +		view_find_and_unmark(mark); +	} else { +		// Remove all marks from all views +		container_for_each_descendant_dfs(&root_container, +				remove_all_marks_iterator, NULL); +	} +	free(mark); + +	return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} | 
