Change unmark implemention to match i3's

This commit is contained in:
Ryan Dwyer 2018-05-15 11:24:16 +10:00
parent 22d38600d0
commit 4d1edfcba9
4 changed files with 44 additions and 16 deletions

View file

@ -368,6 +368,7 @@ struct sway_config {
struct seat_config *seat_config;
struct sway_seat *seat;
struct sway_container *current_container;
bool using_criteria;
} handler_context;
};

View file

@ -302,7 +302,7 @@ struct cmd_results *execute_command(char *_exec, struct sway_seat *seat) {
head = exec;
do {
// Extract criteria (valid for this command list only).
bool has_criteria = false;
config->handler_context.using_criteria = false;
if (*head == '[') {
char *error = NULL;
struct criteria *criteria = criteria_parse(head, &error);
@ -315,7 +315,7 @@ struct cmd_results *execute_command(char *_exec, struct sway_seat *seat) {
views = criteria_get_views(criteria);
head += strlen(criteria->raw);
criteria_destroy(criteria);
has_criteria = true;
config->handler_context.using_criteria = true;
// Skip leading whitespace
head += strspn(head, whitespace);
}
@ -352,7 +352,7 @@ struct cmd_results *execute_command(char *_exec, struct sway_seat *seat) {
goto cleanup;
}
if (!has_criteria) {
if (!config->handler_context.using_criteria) {
// without criteria, the command acts upon the focused
// container
config->handler_context.current_container =

View file

@ -57,7 +57,7 @@ struct cmd_results *cmd_mark(int argc, char **argv) {
view_find_and_unmark(mark);
if (!toggle || (toggle && !had_mark)) {
if (!toggle || !had_mark) {
list_add(view->marks, strdup(mark));
}

View file

@ -7,26 +7,53 @@
#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) {
if (argc == 0) {
// Remove all marks from the current container
// 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_clear_marks(container->sway_view);
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 a single mark from whichever container has it
char *mark = join_args(argv, argc);
if (!view_find_and_unmark(mark)) {
free(mark);
return cmd_results_new(CMD_INVALID, "unmark",
"No view exists with that mark");
// 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);
}