@ -420,7 +420,9 @@ enum window_location {
static const cairo_user_data_key_t shm_surface_data_key ;
static const cairo_user_data_key_t shm_surface_data_key ;
#if 0
/* #define DEBUG */
# ifdef DEBUG
static void
static void
debug_print ( void * proxy , int line , const char * func , const char * fmt , . . . )
debug_print ( void * proxy , int line , const char * func , const char * fmt , . . . )
@ -892,6 +894,30 @@ to_shm_surface(struct toysurface *base)
return container_of ( base , struct shm_surface , base ) ;
return container_of ( base , struct shm_surface , base ) ;
}
}
static void
shm_surface_buffer_state_debug ( struct shm_surface * surface , const char * msg )
{
# ifdef DEBUG
struct shm_surface_leaf * leaf ;
char bufs [ MAX_LEAVES + 1 ] ;
int i ;
for ( i = 0 ; i < MAX_LEAVES ; i + + ) {
leaf = & surface - > leaf [ i ] ;
if ( leaf - > busy )
bufs [ i ] = ' b ' ;
else if ( leaf - > cairo_surface )
bufs [ i ] = ' a ' ;
else
bufs [ i ] = ' ' ;
}
bufs [ MAX_LEAVES ] = ' \0 ' ;
DBG_OBJ ( surface - > surface , " %s, leaves [%s] \n " , msg , bufs ) ;
# endif
}
static void
static void
shm_surface_buffer_release ( void * data , struct wl_buffer * buffer )
shm_surface_buffer_release ( void * data , struct wl_buffer * buffer )
{
{
@ -899,14 +925,13 @@ shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
struct shm_surface_leaf * leaf ;
struct shm_surface_leaf * leaf ;
int i ;
int i ;
int free_found ;
int free_found ;
int available = MAX_LEAVES ;
char bufs [ MAX_LEAVES + 1 ] ;
shm_surface_buffer_state_debug ( surface , " buffer_release before " ) ;
for ( i = 0 ; i < MAX_LEAVES ; i + + ) {
for ( i = 0 ; i < MAX_LEAVES ; i + + ) {
leaf = & surface - > leaf [ i ] ;
leaf = & surface - > leaf [ i ] ;
if ( leaf - > data & & leaf - > data - > buffer = = buffer ) {
if ( leaf - > data & & leaf - > data - > buffer = = buffer ) {
leaf - > busy = 0 ;
leaf - > busy = 0 ;
available = i ;
break ;
break ;
}
}
}
}
@ -917,27 +942,16 @@ shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
for ( i = 0 ; i < MAX_LEAVES ; i + + ) {
for ( i = 0 ; i < MAX_LEAVES ; i + + ) {
leaf = & surface - > leaf [ i ] ;
leaf = & surface - > leaf [ i ] ;
if ( leaf - > busy )
bufs [ i ] = ' b ' ;
else if ( leaf - > cairo_surface )
bufs [ i ] = ' a ' ;
else
bufs [ i ] = ' ' ;
if ( ! leaf - > cairo_surface | | leaf - > busy )
if ( ! leaf - > cairo_surface | | leaf - > busy )
continue ;
continue ;
if ( ! free_found )
if ( ! free_found )
free_found = 1 ;
free_found = 1 ;
else {
else
shm_surface_leaf_release ( leaf ) ;
shm_surface_leaf_release ( leaf ) ;
bufs [ i ] = ' * ' ;
}
}
}
bufs [ MAX_LEAVES ] = ' \0 ' ;
shm_surface_buffer_state_debug ( surface , " buffer_release after " ) ;
DBG_OBJ ( surface - > surface , " leaf %d released, leaves [%s] \n " ,
available , bufs ) ;
}
}
static const struct wl_buffer_listener shm_surface_buffer_listener = {
static const struct wl_buffer_listener shm_surface_buffer_listener = {