diff options
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r-- | sway/tree/view.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c index 833345c5..648c1655 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -43,6 +43,11 @@ void view_destroy(struct sway_view *view) { | |||
43 | } | 43 | } |
44 | list_free(view->marks); | 44 | list_free(view->marks); |
45 | 45 | ||
46 | wlr_texture_destroy(view->marks_focused); | ||
47 | wlr_texture_destroy(view->marks_focused_inactive); | ||
48 | wlr_texture_destroy(view->marks_unfocused); | ||
49 | wlr_texture_destroy(view->marks_urgent); | ||
50 | |||
46 | container_destroy(view->swayc); | 51 | container_destroy(view->swayc); |
47 | 52 | ||
48 | if (view->impl->destroy) { | 53 | if (view->impl->destroy) { |
@@ -746,6 +751,7 @@ bool view_find_and_unmark(char *mark) { | |||
746 | if (strcmp(view_mark, mark) == 0) { | 751 | if (strcmp(view_mark, mark) == 0) { |
747 | free(view_mark); | 752 | free(view_mark); |
748 | list_del(view->marks, i); | 753 | list_del(view->marks, i); |
754 | view_update_marks_textures(view); | ||
749 | return true; | 755 | return true; |
750 | } | 756 | } |
751 | } | 757 | } |
@@ -769,3 +775,91 @@ bool view_has_mark(struct sway_view *view, char *mark) { | |||
769 | } | 775 | } |
770 | return false; | 776 | return false; |
771 | } | 777 | } |
778 | |||
779 | static void update_marks_texture(struct sway_view *view, | ||
780 | struct wlr_texture **texture, struct border_colors *class) { | ||
781 | struct sway_container *output = container_parent(view->swayc, C_OUTPUT); | ||
782 | if (!output) { | ||
783 | return; | ||
784 | } | ||
785 | if (*texture) { | ||
786 | wlr_texture_destroy(*texture); | ||
787 | *texture = NULL; | ||
788 | } | ||
789 | if (!view->marks->length) { | ||
790 | return; | ||
791 | } | ||
792 | |||
793 | size_t len = 0; | ||
794 | for (int i = 0; i < view->marks->length; ++i) { | ||
795 | char *mark = view->marks->items[i]; | ||
796 | if (mark[0] != '_') { | ||
797 | len += strlen(mark) + 2; | ||
798 | } | ||
799 | } | ||
800 | char *buffer = calloc(len + 1, 1); | ||
801 | char *part = malloc(len + 1); | ||
802 | |||
803 | if (!sway_assert(buffer && part, "Unable to allocate memory")) { | ||
804 | free(buffer); | ||
805 | return; | ||
806 | } | ||
807 | |||
808 | for (int i = 0; i < view->marks->length; ++i) { | ||
809 | char *mark = view->marks->items[i]; | ||
810 | if (mark[0] != '_') { | ||
811 | sprintf(part, "[%s]", mark); | ||
812 | strcat(buffer, part); | ||
813 | } | ||
814 | } | ||
815 | free(part); | ||
816 | |||
817 | double scale = output->sway_output->wlr_output->scale; | ||
818 | int width = 0; | ||
819 | int height = config->font_height * scale; | ||
820 | |||
821 | cairo_t *c = cairo_create(NULL); | ||
822 | get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer); | ||
823 | cairo_destroy(c); | ||
824 | |||
825 | cairo_surface_t *surface = cairo_image_surface_create( | ||
826 | CAIRO_FORMAT_ARGB32, width, height); | ||
827 | cairo_t *cairo = cairo_create(surface); | ||
828 | cairo_set_source_rgba(cairo, class->background[0], class->background[1], | ||
829 | class->background[2], class->background[3]); | ||
830 | cairo_paint(cairo); | ||
831 | PangoContext *pango = pango_cairo_create_context(cairo); | ||
832 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); | ||
833 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | ||
834 | class->text[2], class->text[3]); | ||
835 | cairo_move_to(cairo, 0, 0); | ||
836 | |||
837 | pango_printf(cairo, config->font, scale, false, "%s", buffer); | ||
838 | |||
839 | cairo_surface_flush(surface); | ||
840 | unsigned char *data = cairo_image_surface_get_data(surface); | ||
841 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); | ||
842 | struct wlr_renderer *renderer = wlr_backend_get_renderer( | ||
843 | output->sway_output->wlr_output->backend); | ||
844 | *texture = wlr_texture_from_pixels( | ||
845 | renderer, WL_SHM_FORMAT_ARGB8888, stride, width, height, data); | ||
846 | cairo_surface_destroy(surface); | ||
847 | g_object_unref(pango); | ||
848 | cairo_destroy(cairo); | ||
849 | free(buffer); | ||
850 | } | ||
851 | |||
852 | void view_update_marks_textures(struct sway_view *view) { | ||
853 | if (!config->show_marks) { | ||
854 | return; | ||
855 | } | ||
856 | update_marks_texture(view, &view->marks_focused, | ||
857 | &config->border_colors.focused); | ||
858 | update_marks_texture(view, &view->marks_focused_inactive, | ||
859 | &config->border_colors.focused_inactive); | ||
860 | update_marks_texture(view, &view->marks_unfocused, | ||
861 | &config->border_colors.unfocused); | ||
862 | update_marks_texture(view, &view->marks_urgent, | ||
863 | &config->border_colors.urgent); | ||
864 | container_damage_whole(view->swayc); | ||
865 | } | ||