diff options
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r-- | sway/tree/view.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c index 8da72667..ec7f3031 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -23,6 +23,7 @@ void view_init(struct sway_view *view, enum sway_view_type type, | |||
23 | view->type = type; | 23 | view->type = type; |
24 | view->impl = impl; | 24 | view->impl = impl; |
25 | view->executed_criteria = create_list(); | 25 | view->executed_criteria = create_list(); |
26 | view->marks = create_list(); | ||
26 | wl_signal_init(&view->events.unmap); | 27 | wl_signal_init(&view->events.unmap); |
27 | } | 28 | } |
28 | 29 | ||
@@ -37,6 +38,11 @@ void view_destroy(struct sway_view *view) { | |||
37 | 38 | ||
38 | list_free(view->executed_criteria); | 39 | list_free(view->executed_criteria); |
39 | 40 | ||
41 | for (int i = 0; i < view->marks->length; ++i) { | ||
42 | free(view->marks->items[i]); | ||
43 | } | ||
44 | list_free(view->marks); | ||
45 | |||
40 | container_destroy(view->swayc); | 46 | container_destroy(view->swayc); |
41 | 47 | ||
42 | if (view->impl->destroy) { | 48 | if (view->impl->destroy) { |
@@ -721,3 +727,46 @@ void view_update_title(struct sway_view *view, bool force) { | |||
721 | container_notify_child_title_changed(view->swayc->parent); | 727 | container_notify_child_title_changed(view->swayc->parent); |
722 | config_update_font_height(false); | 728 | config_update_font_height(false); |
723 | } | 729 | } |
730 | |||
731 | static bool find_by_mark_iterator(struct sway_container *con, | ||
732 | void *data) { | ||
733 | char *mark = data; | ||
734 | return con->type == C_VIEW && view_has_mark(con->sway_view, mark); | ||
735 | } | ||
736 | |||
737 | bool view_find_and_unmark(char *mark) { | ||
738 | struct sway_container *container = container_find(&root_container, | ||
739 | find_by_mark_iterator, mark); | ||
740 | if (!container) { | ||
741 | return false; | ||
742 | } | ||
743 | struct sway_view *view = container->sway_view; | ||
744 | |||
745 | for (int i = 0; i < view->marks->length; ++i) { | ||
746 | char *view_mark = view->marks->items[i]; | ||
747 | if (strcmp(view_mark, mark) == 0) { | ||
748 | free(view_mark); | ||
749 | list_del(view->marks, i); | ||
750 | return true; | ||
751 | } | ||
752 | } | ||
753 | return false; | ||
754 | } | ||
755 | |||
756 | void view_clear_marks(struct sway_view *view) { | ||
757 | for (int i = 0; i < view->marks->length; ++i) { | ||
758 | free(view->marks->items[i]); | ||
759 | } | ||
760 | list_free(view->marks); | ||
761 | view->marks = create_list(); | ||
762 | } | ||
763 | |||
764 | bool view_has_mark(struct sway_view *view, char *mark) { | ||
765 | for (int i = 0; i < view->marks->length; ++i) { | ||
766 | char *item = view->marks->items[i]; | ||
767 | if (strcmp(item, mark) == 0) { | ||
768 | return true; | ||
769 | } | ||
770 | } | ||
771 | return false; | ||
772 | } | ||