diff options
author | Ryan Dwyer <[email protected]> | 2018-05-25 21:07:59 +1000 |
---|---|---|
committer | Ryan Dwyer <[email protected]> | 2018-05-25 21:07:59 +1000 |
commit | db38b9bbf3cce4083c538209a7ce5ef1a1cf5f3f (patch) | |
tree | 3ee9f0c2bf76907b2854bf6ba2be8ab124b74fb9 /sway/tree/container.c | |
parent | 3c77f066a532efd3df0f2072d02fa4353b4a4511 (diff) |
Clean up container title functions
* Add and use lenient_strcat and lenient_strncat functions
* Rename `concatenate_child_titles` function as that's no longer what it
does
* Rename `container_notify_child_title_changed` because we only need to
notify that the tree structure has changed, not titles
* Don't notify parents when a child changes its title
* Update ancestor titles when changing a container's layout
* Eg. create nested tabs and change the inner container to stacking
* No need to store tree presentation in both container->name and
formatted_title
Diffstat (limited to 'sway/tree/container.c')
-rw-r--r-- | sway/tree/container.c | 90 |
1 files changed, 38 insertions, 52 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c index 9cf18f61..f29a9adc 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -21,6 +21,7 @@ #include "sway/tree/view.h" #include "sway/tree/workspace.h" #include "log.h" +#include "stringop.h" static list_t *bfs_queue; @@ -774,42 +775,36 @@ void container_calculate_title_height(struct sway_container *container) { } /** - * Calculate and return the length of the concatenated child titles. - * An example concatenated title is: V[Terminal, Firefox] - * If buffer is not NULL, also populate the buffer with the concatenated title. + * Calculate and return the length of the tree representation. + * An example tree representation is: V[Terminal, Firefox] + * If buffer is not NULL, also populate the buffer with the representation. */ -static size_t concatenate_child_titles(struct sway_container *parent, - char *buffer) { - size_t len = 2; // V[ - if (buffer) { - switch (parent->layout) { - case L_VERT: - strcpy(buffer, "V["); - break; - case L_HORIZ: - strcpy(buffer, "H["); - break; - case L_TABBED: - strcpy(buffer, "T["); - break; - case L_STACKED: - strcpy(buffer, "S["); - break; - case L_FLOATING: - strcpy(buffer, "F["); - break; - case L_NONE: - strcpy(buffer, "D["); - break; - } +static size_t get_tree_representation(struct sway_container *parent, char *buffer) { + size_t len = 2; + switch (parent->layout) { + case L_VERT: + lenient_strcat(buffer, "V["); + break; + case L_HORIZ: + lenient_strcat(buffer, "H["); + break; + case L_TABBED: + lenient_strcat(buffer, "T["); + break; + case L_STACKED: + lenient_strcat(buffer, "S["); + break; + case L_FLOATING: + lenient_strcat(buffer, "F["); + break; + case L_NONE: + lenient_strcat(buffer, "D["); + break; } - for (int i = 0; i < parent->children->length; ++i) { if (i != 0) { - len += 1; - if (buffer) { - strcat(buffer, " "); - } + ++len; + lenient_strcat(buffer, " "); } struct sway_container *child = parent->children->items[i]; const char *identifier = NULL; @@ -819,48 +814,39 @@ static size_t concatenate_child_titles(struct sway_container *parent, identifier = view_get_app_id(child->sway_view); } } else { - identifier = child->name; + identifier = child->formatted_title; } if (identifier) { len += strlen(identifier); - if (buffer) { - strcat(buffer, identifier); - } + lenient_strcat(buffer, identifier); } else { len += 6; - if (buffer) { - strcat(buffer, "(null)"); - } + lenient_strcat(buffer, "(null)"); } } - - len += 1; - if (buffer) { - strcat(buffer, "]"); - } + ++len; + lenient_strcat(buffer, "]"); return len; } -void container_notify_child_title_changed(struct sway_container *container) { +void container_notify_subtree_changed(struct sway_container *container) { if (!container || container->type != C_CONTAINER) { return; } - if (container->formatted_title) { - free(container->formatted_title); - } + free(container->formatted_title); + container->formatted_title = NULL; - size_t len = concatenate_child_titles(container, NULL); + size_t len = get_tree_representation(container, NULL); char *buffer = calloc(len + 1, sizeof(char)); if (!sway_assert(buffer, "Unable to allocate title string")) { return; } - concatenate_child_titles(container, buffer); + get_tree_representation(container, buffer); - container->name = buffer; container->formatted_title = buffer; container_calculate_title_height(container); container_update_title_textures(container); - container_notify_child_title_changed(container->parent); + container_notify_subtree_changed(container->parent); } size_t container_titlebar_height() { |