@ -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 - > nam e;
identifier = child - > formatted_titl e;
}
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_titl e_changed( struct sway_container * container ) {
void container_notify_ subtre e_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_titl e_changed( container - > parent ) ;
container_notify_ subtre e_changed( container - > parent ) ;
}
size_t container_titlebar_height ( ) {