d6cd79c342
This introduces the following `for_each` functions: * root_for_each_workspace * root_for_each_container * output_for_each_workspace * output_for_each_container * workspace_for_each_container And introduces the following `find` functions: * root_find_output * root_find_workspace * root_find_container * output_find_workspace * output_find_container * workspace_find_container * container_find_child And removes the following functions: * container_descendants * container_for_each_descendant * container_find This change is preparing the way for demoting sway_container. Eventually these functions will accept and return sway_outputs, sway_workspaces and sway_containers (meaning a C_CONTAINER or C_VIEW). This change also makes it easy to handle abnormalities like the workspace floating list, root's scratchpad list and (once implemented) root's saved workspaces list for when there's no connected outputs.
61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
#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);
|
|
view_update_marks_textures(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);
|
|
view_update_marks_textures(view);
|
|
} else if (!view && mark) {
|
|
// Remove mark from whichever view has it
|
|
view_find_and_unmark(mark);
|
|
} else {
|
|
// Remove all marks from all views
|
|
root_for_each_container(remove_all_marks_iterator, NULL);
|
|
}
|
|
free(mark);
|
|
|
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
|
}
|