summaryrefslogtreecommitdiffstats
path: root/sway/tree/view.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r--sway/tree/view.c94
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
779static 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
852void 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}