diff --git a/sway/border.c b/sway/border.c index 5ae32d2476..362077bd1f 100644 --- a/sway/border.c +++ b/sway/border.c @@ -221,6 +221,25 @@ static void render_title_bar(swayc_t *view, cairo_t *cr, struct wlc_geometry *b, } } +/** + * Generate window title for tabbed/stacked layouts + */ +static char *generate_view_title(swayc_t *view) { + char *title; + size_t len; + if (view->app_id) { + return strdup(view->app_id); + } else if (view->class && view->instance) { + len = strlen(view->class) + strlen(view->instance) + 3; + title = calloc(len + 1, 1); + snprintf(title, len, "%s - %s", view->instance, view->class); + return title; + } else if (view->class) { + return strdup(view->class); + } + return strdup("(null)"); +} + /** * Generate nested container title for tabbed/stacked layouts */ @@ -252,9 +271,9 @@ static char *generate_container_title(swayc_t *container) { for (i = 0; i < container->children->length; ++i) { prev_name = name; swayc_t* child = container->children->items[i]; - const char *title = NULL; + char *title = NULL; if (child->type == C_VIEW) { - title = child->app_id ? child->app_id : (child->class ? child->class : "(null)"); + title = generate_view_title(child); } else { //child->type == C_CONTAINER title = generate_container_title(child); } @@ -267,6 +286,9 @@ static char *generate_container_title(swayc_t *container) { name = malloc(len * sizeof(char)); if (!name) { free(prev_name); + if (child->type == C_VIEW) { + free(title); + } sway_log(L_ERROR, "Unable to allocate container title"); return NULL; } @@ -275,6 +297,9 @@ static char *generate_container_title(swayc_t *container) { } else { snprintf(name, len, "%s%s", prev_name, title); } + if (child->type == C_VIEW) { + free(title); + } free(prev_name); }