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 | |
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')
-rw-r--r-- | sway/tree/container.c | 151 | ||||
-rw-r--r-- | sway/tree/view.c | 155 |
2 files changed, 148 insertions, 158 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c index 322f2f67..458ed7ff 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -39,6 +39,7 @@ struct sway_container *container_create(struct sway_view *view) { | |||
39 | c->children = create_list(); | 39 | c->children = create_list(); |
40 | c->current.children = create_list(); | 40 | c->current.children = create_list(); |
41 | } | 41 | } |
42 | c->marks = create_list(); | ||
42 | c->outputs = create_list(); | 43 | c->outputs = create_list(); |
43 | 44 | ||
44 | wl_signal_init(&c->events.destroy); | 45 | wl_signal_init(&c->events.destroy); |
@@ -66,6 +67,13 @@ void container_destroy(struct sway_container *con) { | |||
66 | list_free(con->current.children); | 67 | list_free(con->current.children); |
67 | list_free(con->outputs); | 68 | list_free(con->outputs); |
68 | 69 | ||
70 | list_foreach(con->marks, free); | ||
71 | list_free(con->marks); | ||
72 | wlr_texture_destroy(con->marks_focused); | ||
73 | wlr_texture_destroy(con->marks_focused_inactive); | ||
74 | wlr_texture_destroy(con->marks_unfocused); | ||
75 | wlr_texture_destroy(con->marks_urgent); | ||
76 | |||
69 | if (con->view) { | 77 | if (con->view) { |
70 | if (con->view->container == con) { | 78 | if (con->view->container == con) { |
71 | con->view->container = NULL; | 79 | con->view->container = NULL; |
@@ -996,9 +1004,7 @@ void container_discover_outputs(struct sway_container *con) { | |||
996 | double new_scale = new_output ? new_output->wlr_output->scale : -1; | 1004 | double new_scale = new_output ? new_output->wlr_output->scale : -1; |
997 | if (old_scale != new_scale) { | 1005 | if (old_scale != new_scale) { |
998 | container_update_title_textures(con); | 1006 | container_update_title_textures(con); |
999 | if (con->view) { | 1007 | container_update_marks_textures(con); |
1000 | view_update_marks_textures(con->view); | ||
1001 | } | ||
1002 | } | 1008 | } |
1003 | } | 1009 | } |
1004 | 1010 | ||
@@ -1218,3 +1224,142 @@ bool container_is_transient_for(struct sway_container *child, | |||
1218 | child->view && ancestor->view && | 1224 | child->view && ancestor->view && |
1219 | view_is_transient_for(child->view, ancestor->view); | 1225 | view_is_transient_for(child->view, ancestor->view); |
1220 | } | 1226 | } |
1227 | |||
1228 | static bool find_by_mark_iterator(struct sway_container *con, void *data) { | ||
1229 | char *mark = data; | ||
1230 | return container_has_mark(con, mark); | ||
1231 | } | ||
1232 | |||
1233 | struct sway_container *container_find_mark(char *mark) { | ||
1234 | return root_find_container(find_by_mark_iterator, mark); | ||
1235 | } | ||
1236 | |||
1237 | bool container_find_and_unmark(char *mark) { | ||
1238 | struct sway_container *con = root_find_container( | ||
1239 | find_by_mark_iterator, mark); | ||
1240 | if (!con) { | ||
1241 | return false; | ||
1242 | } | ||
1243 | |||
1244 | for (int i = 0; i < con->marks->length; ++i) { | ||
1245 | char *con_mark = con->marks->items[i]; | ||
1246 | if (strcmp(con_mark, mark) == 0) { | ||
1247 | free(con_mark); | ||
1248 | list_del(con->marks, i); | ||
1249 | container_update_marks_textures(con); | ||
1250 | ipc_event_window(con, "mark"); | ||
1251 | return true; | ||
1252 | } | ||
1253 | } | ||
1254 | return false; | ||
1255 | } | ||
1256 | |||
1257 | void container_clear_marks(struct sway_container *con) { | ||
1258 | list_foreach(con->marks, free); | ||
1259 | con->marks->length = 0; | ||
1260 | ipc_event_window(con, "mark"); | ||
1261 | } | ||
1262 | |||
1263 | bool container_has_mark(struct sway_container *con, char *mark) { | ||
1264 | for (int i = 0; i < con->marks->length; ++i) { | ||
1265 | char *item = con->marks->items[i]; | ||
1266 | if (strcmp(item, mark) == 0) { | ||
1267 | return true; | ||
1268 | } | ||
1269 | } | ||
1270 | return false; | ||
1271 | } | ||
1272 | |||
1273 | void container_add_mark(struct sway_container *con, char *mark) { | ||
1274 | list_add(con->marks, strdup(mark)); | ||
1275 | ipc_event_window(con, "mark"); | ||
1276 | } | ||
1277 | |||
1278 | static void update_marks_texture(struct sway_container *con, | ||
1279 | struct wlr_texture **texture, struct border_colors *class) { | ||
1280 | struct sway_output *output = container_get_effective_output(con); | ||
1281 | if (!output) { | ||
1282 | return; | ||
1283 | } | ||
1284 | if (*texture) { | ||
1285 | wlr_texture_destroy(*texture); | ||
1286 | *texture = NULL; | ||
1287 | } | ||
1288 | if (!con->marks->length) { | ||
1289 | return; | ||
1290 | } | ||
1291 | |||
1292 | size_t len = 0; | ||
1293 | for (int i = 0; i < con->marks->length; ++i) { | ||
1294 | char *mark = con->marks->items[i]; | ||
1295 | if (mark[0] != '_') { | ||
1296 | len += strlen(mark) + 2; | ||
1297 | } | ||
1298 | } | ||
1299 | char *buffer = calloc(len + 1, 1); | ||
1300 | char *part = malloc(len + 1); | ||
1301 | |||
1302 | if (!sway_assert(buffer && part, "Unable to allocate memory")) { | ||
1303 | free(buffer); | ||
1304 | return; | ||
1305 | } | ||
1306 | |||
1307 | for (int i = 0; i < con->marks->length; ++i) { | ||
1308 | char *mark = con->marks->items[i]; | ||
1309 | if (mark[0] != '_') { | ||
1310 | sprintf(part, "[%s]", mark); | ||
1311 | strcat(buffer, part); | ||
1312 | } | ||
1313 | } | ||
1314 | free(part); | ||
1315 | |||
1316 | double scale = output->wlr_output->scale; | ||
1317 | int width = 0; | ||
1318 | int height = con->title_height * scale; | ||
1319 | |||
1320 | cairo_t *c = cairo_create(NULL); | ||
1321 | get_text_size(c, config->font, &width, NULL, NULL, scale, false, | ||
1322 | "%s", buffer); | ||
1323 | cairo_destroy(c); | ||
1324 | |||
1325 | cairo_surface_t *surface = cairo_image_surface_create( | ||
1326 | CAIRO_FORMAT_ARGB32, width, height); | ||
1327 | cairo_t *cairo = cairo_create(surface); | ||
1328 | cairo_set_source_rgba(cairo, class->background[0], class->background[1], | ||
1329 | class->background[2], class->background[3]); | ||
1330 | cairo_paint(cairo); | ||
1331 | PangoContext *pango = pango_cairo_create_context(cairo); | ||
1332 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); | ||
1333 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | ||
1334 | class->text[2], class->text[3]); | ||
1335 | cairo_move_to(cairo, 0, 0); | ||
1336 | |||
1337 | pango_printf(cairo, config->font, scale, false, "%s", buffer); | ||
1338 | |||
1339 | cairo_surface_flush(surface); | ||
1340 | unsigned char *data = cairo_image_surface_get_data(surface); | ||
1341 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); | ||
1342 | struct wlr_renderer *renderer = wlr_backend_get_renderer( | ||
1343 | output->wlr_output->backend); | ||
1344 | *texture = wlr_texture_from_pixels( | ||
1345 | renderer, WL_SHM_FORMAT_ARGB8888, stride, width, height, data); | ||
1346 | cairo_surface_destroy(surface); | ||
1347 | g_object_unref(pango); | ||
1348 | cairo_destroy(cairo); | ||
1349 | free(buffer); | ||
1350 | } | ||
1351 | |||
1352 | void container_update_marks_textures(struct sway_container *con) { | ||
1353 | if (!config->show_marks) { | ||
1354 | return; | ||
1355 | } | ||
1356 | update_marks_texture(con, &con->marks_focused, | ||
1357 | &config->border_colors.focused); | ||
1358 | update_marks_texture(con, &con->marks_focused_inactive, | ||
1359 | &config->border_colors.focused_inactive); | ||
1360 | update_marks_texture(con, &con->marks_unfocused, | ||
1361 | &config->border_colors.unfocused); | ||
1362 | update_marks_texture(con, &con->marks_urgent, | ||
1363 | &config->border_colors.urgent); | ||
1364 | container_damage_whole(con); | ||
1365 | } | ||
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; |