diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-10-31 21:27:38 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-11-01 18:09:51 +1000 |
commit | 9fc736f4e1804b06538191786500f927ba0cda13 (patch) | |
tree | 8399de2ba00a8a0dd57f49dfc30455c330500b54 /sway/tree/view.c | |
parent | Merge pull request #3040 from RyanDwyer/border-props-to-container (diff) | |
download | sway-9fc736f4e1804b06538191786500f927ba0cda13.tar.gz sway-9fc736f4e1804b06538191786500f927ba0cda13.tar.zst sway-9fc736f4e1804b06538191786500f927ba0cda13.zip |
Move view marks properties to container struct
Like border properties, this will be needed to implement layout saving
and restoring.
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r-- | sway/tree/view.c | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c index 9a89b8ea..1aa59e68 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -35,7 +35,6 @@ void view_init(struct sway_view *view, enum sway_view_type type, | |||
35 | view->type = type; | 35 | view->type = type; |
36 | view->impl = impl; | 36 | view->impl = impl; |
37 | view->executed_criteria = create_list(); | 37 | view->executed_criteria = create_list(); |
38 | view->marks = create_list(); | ||
39 | view->allow_request_urgent = true; | 38 | view->allow_request_urgent = true; |
40 | wl_signal_init(&view->events.unmap); | 39 | wl_signal_init(&view->events.unmap); |
41 | } | 40 | } |
@@ -55,13 +54,6 @@ void view_destroy(struct sway_view *view) { | |||
55 | } | 54 | } |
56 | list_free(view->executed_criteria); | 55 | list_free(view->executed_criteria); |
57 | 56 | ||
58 | list_foreach(view->marks, free); | ||
59 | list_free(view->marks); | ||
60 | |||
61 | wlr_texture_destroy(view->marks_focused); | ||
62 | wlr_texture_destroy(view->marks_focused_inactive); | ||
63 | wlr_texture_destroy(view->marks_unfocused); | ||
64 | wlr_texture_destroy(view->marks_urgent); | ||
65 | free(view->title_format); | 57 | free(view->title_format); |
66 | 58 | ||
67 | if (view->impl->destroy) { | 59 | if (view->impl->destroy) { |
@@ -937,153 +929,6 @@ void view_update_title(struct sway_view *view, bool force) { | |||
937 | ipc_event_window(view->container, "title"); | 929 | ipc_event_window(view->container, "title"); |
938 | } | 930 | } |
939 | 931 | ||
940 | static bool find_by_mark_iterator(struct sway_container *con, | ||
941 | void *data) { | ||
942 | char *mark = data; | ||
943 | return con->view && view_has_mark(con->view, mark); | ||
944 | } | ||
945 | |||
946 | struct sway_view *view_find_mark(char *mark) { | ||
947 | struct sway_container *container = root_find_container( | ||
948 | find_by_mark_iterator, mark); | ||
949 | if (!container) { | ||
950 | return NULL; | ||
951 | } | ||
952 | return container->view; | ||
953 | } | ||
954 | |||
955 | bool view_find_and_unmark(char *mark) { | ||
956 | struct sway_container *container = root_find_container( | ||
957 | find_by_mark_iterator, mark); | ||
958 | if (!container) { | ||
959 | return false; | ||
960 | } | ||
961 | struct sway_view *view = container->view; | ||
962 | |||
963 | for (int i = 0; i < view->marks->length; ++i) { | ||
964 | char *view_mark = view->marks->items[i]; | ||
965 | if (strcmp(view_mark, mark) == 0) { | ||
966 | free(view_mark); | ||
967 | list_del(view->marks, i); | ||
968 | view_update_marks_textures(view); | ||
969 | ipc_event_window(container, "mark"); | ||
970 | return true; | ||
971 | } | ||
972 | } | ||
973 | return false; | ||
974 | } | ||
975 | |||
976 | void view_clear_marks(struct sway_view *view) { | ||
977 | list_foreach(view->marks, free); | ||
978 | view->marks->length = 0; | ||
979 | ipc_event_window(view->container, "mark"); | ||
980 | } | ||
981 | |||
982 | bool view_has_mark(struct sway_view *view, char *mark) { | ||
983 | for (int i = 0; i < view->marks->length; ++i) { | ||
984 | char *item = view->marks->items[i]; | ||
985 | if (strcmp(item, mark) == 0) { | ||
986 | return true; | ||
987 | } | ||
988 | } | ||
989 | return false; | ||
990 | } | ||
991 | |||
992 | void view_add_mark(struct sway_view *view, char *mark) { | ||
993 | list_add(view->marks, strdup(mark)); | ||
994 | ipc_event_window(view->container, "mark"); | ||
995 | } | ||
996 | |||
997 | static void update_marks_texture(struct sway_view *view, | ||
998 | struct wlr_texture **texture, struct border_colors *class) { | ||
999 | struct sway_output *output = | ||
1000 | container_get_effective_output(view->container); | ||
1001 | if (!output) { | ||
1002 | return; | ||
1003 | } | ||
1004 | if (*texture) { | ||
1005 | wlr_texture_destroy(*texture); | ||
1006 | *texture = NULL; | ||
1007 | } | ||
1008 | if (!view->marks->length) { | ||
1009 | return; | ||
1010 | } | ||
1011 | |||
1012 | size_t len = 0; | ||
1013 | for (int i = 0; i < view->marks->length; ++i) { | ||
1014 | char *mark = view->marks->items[i]; | ||
1015 | if (mark[0] != '_') { | ||
1016 | len += strlen(mark) + 2; | ||
1017 | } | ||
1018 | } | ||
1019 | char *buffer = calloc(len + 1, 1); | ||
1020 | char *part = malloc(len + 1); | ||
1021 | |||
1022 | if (!sway_assert(buffer && part, "Unable to allocate memory")) { | ||
1023 | free(buffer); | ||
1024 | return; | ||
1025 | } | ||
1026 | |||
1027 | for (int i = 0; i < view->marks->length; ++i) { | ||
1028 | char *mark = view->marks->items[i]; | ||
1029 | if (mark[0] != '_') { | ||
1030 | sprintf(part, "[%s]", mark); | ||
1031 | strcat(buffer, part); | ||
1032 | } | ||
1033 | } | ||
1034 | free(part); | ||
1035 | |||
1036 | double scale = output->wlr_output->scale; | ||
1037 | int width = 0; | ||
1038 | int height = view->container->title_height * scale; | ||
1039 | |||
1040 | cairo_t *c = cairo_create(NULL); | ||
1041 | get_text_size(c, config->font, &width, NULL, NULL, scale, false, | ||
1042 | "%s", buffer); | ||
1043 | cairo_destroy(c); | ||
1044 | |||
1045 | cairo_surface_t *surface = cairo_image_surface_create( | ||
1046 | CAIRO_FORMAT_ARGB32, width, height); | ||
1047 | cairo_t *cairo = cairo_create(surface); | ||
1048 | cairo_set_source_rgba(cairo, class->background[0], class->background[1], | ||
1049 | class->background[2], class->background[3]); | ||
1050 | cairo_paint(cairo); | ||
1051 | PangoContext *pango = pango_cairo_create_context(cairo); | ||
1052 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); | ||
1053 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | ||
1054 | class->text[2], class->text[3]); | ||
1055 | cairo_move_to(cairo, 0, 0); | ||
1056 | |||
1057 | pango_printf(cairo, config->font, scale, false, "%s", buffer); | ||
1058 | |||
1059 | cairo_surface_flush(surface); | ||
1060 | unsigned char *data = cairo_image_surface_get_data(surface); | ||
1061 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); | ||
1062 | struct wlr_renderer *renderer = wlr_backend_get_renderer( | ||
1063 | output->wlr_output->backend); | ||
1064 | *texture = wlr_texture_from_pixels( | ||
1065 | renderer, WL_SHM_FORMAT_ARGB8888, stride, width, height, data); | ||
1066 | cairo_surface_destroy(surface); | ||
1067 | g_object_unref(pango); | ||
1068 | cairo_destroy(cairo); | ||
1069 | free(buffer); | ||
1070 | } | ||
1071 | |||
1072 | void view_update_marks_textures(struct sway_view *view) { | ||
1073 | if (!config->show_marks) { | ||
1074 | return; | ||
1075 | } | ||
1076 | update_marks_texture(view, &view->marks_focused, | ||
1077 | &config->border_colors.focused); | ||
1078 | update_marks_texture(view, &view->marks_focused_inactive, | ||
1079 | &config->border_colors.focused_inactive); | ||
1080 | update_marks_texture(view, &view->marks_unfocused, | ||
1081 | &config->border_colors.unfocused); | ||
1082 | update_marks_texture(view, &view->marks_urgent, | ||
1083 | &config->border_colors.urgent); | ||
1084 | container_damage_whole(view->container); | ||
1085 | } | ||
1086 | |||
1087 | bool view_is_visible(struct sway_view *view) { | 932 | bool view_is_visible(struct sway_view *view) { |
1088 | if (view->container->node.destroying) { | 933 | if (view->container->node.destroying) { |
1089 | return false; | 934 | return false; |