diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-15 13:14:18 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-17 08:29:14 +1000 |
commit | 0e2cc0af3049c6d1b91bda3081238e2e723e81b7 (patch) | |
tree | 34a18b12524c8de5bf68712162071abe3e574d71 /sway/tree/view.c | |
parent | Merge pull request #1995 from RedSoxFan/fix-1985 (diff) | |
download | sway-0e2cc0af3049c6d1b91bda3081238e2e723e81b7.tar.gz sway-0e2cc0af3049c6d1b91bda3081238e2e723e81b7.tar.zst sway-0e2cc0af3049c6d1b91bda3081238e2e723e81b7.zip |
Implement show_marks
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r-- | sway/tree/view.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c index 833345c5..e26159d2 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -746,6 +746,7 @@ bool view_find_and_unmark(char *mark) { | |||
746 | if (strcmp(view_mark, mark) == 0) { | 746 | if (strcmp(view_mark, mark) == 0) { |
747 | free(view_mark); | 747 | free(view_mark); |
748 | list_del(view->marks, i); | 748 | list_del(view->marks, i); |
749 | view_update_marks_textures(view); | ||
749 | return true; | 750 | return true; |
750 | } | 751 | } |
751 | } | 752 | } |
@@ -769,3 +770,80 @@ bool view_has_mark(struct sway_view *view, char *mark) { | |||
769 | } | 770 | } |
770 | return false; | 771 | return false; |
771 | } | 772 | } |
773 | |||
774 | static void update_marks_texture(struct sway_view *view, | ||
775 | struct wlr_texture **texture, struct border_colors *class) { | ||
776 | struct sway_container *output = container_parent(view->swayc, C_OUTPUT); | ||
777 | if (!output) { | ||
778 | return; | ||
779 | } | ||
780 | if (*texture) { | ||
781 | wlr_texture_destroy(*texture); | ||
782 | } | ||
783 | if (!view->marks->length) { | ||
784 | return; | ||
785 | } | ||
786 | |||
787 | size_t len = 0; | ||
788 | for (int i = 0; i < view->marks->length; ++i) { | ||
789 | len += strlen((char *)view->marks->items[i]) + 2; | ||
790 | } | ||
791 | char *buffer = calloc(len + 1, 1); | ||
792 | char *part = malloc(len + 1); | ||
793 | |||
794 | for (int i = 0; i < view->marks->length; ++i) { | ||
795 | char *mark = view->marks->items[i]; | ||
796 | sprintf(part, "[%s]", mark); | ||
797 | strcat(buffer, part); | ||
798 | } | ||
799 | free(part); | ||
800 | |||
801 | double scale = output->sway_output->wlr_output->scale; | ||
802 | int width = 0; | ||
803 | int height = config->font_height * scale; | ||
804 | |||
805 | cairo_t *c = cairo_create(NULL); | ||
806 | get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer); | ||
807 | cairo_destroy(c); | ||
808 | |||
809 | cairo_surface_t *surface = cairo_image_surface_create( | ||
810 | CAIRO_FORMAT_ARGB32, width, height); | ||
811 | cairo_t *cairo = cairo_create(surface); | ||
812 | cairo_set_source_rgba(cairo, class->background[0], class->background[1], | ||
813 | class->background[2], class->background[3]); | ||
814 | cairo_paint(cairo); | ||
815 | PangoContext *pango = pango_cairo_create_context(cairo); | ||
816 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); | ||
817 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | ||
818 | class->text[2], class->text[3]); | ||
819 | cairo_move_to(cairo, 0, 0); | ||
820 | |||
821 | pango_printf(cairo, config->font, scale, false, "%s", buffer); | ||
822 | |||
823 | cairo_surface_flush(surface); | ||
824 | unsigned char *data = cairo_image_surface_get_data(surface); | ||
825 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); | ||
826 | struct wlr_renderer *renderer = wlr_backend_get_renderer( | ||
827 | output->sway_output->wlr_output->backend); | ||
828 | *texture = wlr_texture_from_pixels( | ||
829 | renderer, WL_SHM_FORMAT_ARGB8888, stride, width, height, data); | ||
830 | cairo_surface_destroy(surface); | ||
831 | g_object_unref(pango); | ||
832 | cairo_destroy(cairo); | ||
833 | free(buffer); | ||
834 | } | ||
835 | |||
836 | void view_update_marks_textures(struct sway_view *view) { | ||
837 | if (!config->show_marks) { | ||
838 | return; | ||
839 | } | ||
840 | update_marks_texture(view, &view->marks_focused, | ||
841 | &config->border_colors.focused); | ||
842 | update_marks_texture(view, &view->marks_focused_inactive, | ||
843 | &config->border_colors.focused_inactive); | ||
844 | update_marks_texture(view, &view->marks_unfocused, | ||
845 | &config->border_colors.unfocused); | ||
846 | update_marks_texture(view, &view->marks_urgent, | ||
847 | &config->border_colors.urgent); | ||
848 | container_damage_whole(view->swayc); | ||
849 | } | ||