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 seat_config *seat_config;
struct sway_seat *seat; struct sway_seat *seat;
struct sway_container *current_container; struct sway_container *current_container;
bool using_criteria;
} handler_context; } handler_context;
}; };

View file

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

View file

@ -7,26 +7,53 @@
#include "log.h" #include "log.h"
#include "stringop.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) { struct cmd_results *cmd_unmark(int argc, char **argv) {
if (argc == 0) { // Determine the view
// Remove all marks from the current container struct sway_view *view = NULL;
if (config->handler_context.using_criteria) {
struct sway_container *container = struct sway_container *container =
config->handler_context.current_container; config->handler_context.current_container;
if (container->type != C_VIEW) { if (container->type != C_VIEW) {
return cmd_results_new(CMD_INVALID, "unmark", return cmd_results_new(CMD_INVALID, "unmark",
"Only views can have marks"); "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 { } else {
// Remove a single mark from whichever container has it // Remove all marks from all views
char *mark = join_args(argv, argc); container_for_each_descendant_dfs(&root_container,
if (!view_find_and_unmark(mark)) { remove_all_marks_iterator, NULL);
free(mark);
return cmd_results_new(CMD_INVALID, "unmark",
"No view exists with that mark");
} }
free(mark); free(mark);
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }