static void
IDirectFBSurface_Layer_Destruct( IDirectFBSurface *thiz )
{
     IDirectFBSurface_Layer_data *data = (IDirectFBSurface_Layer_data*) thiz->priv;

     D_DEBUG_AT( Surface, "%s( %p )\n", __FUNCTION__, thiz );

     dfb_layer_region_unref( data->region );
     IDirectFBSurface_Destruct( thiz );
}
static void
IDirectFBSurface_Window_Destruct( IDirectFBSurface *thiz )
{
     IDirectFBSurface_Window_data *data =
          (IDirectFBSurface_Window_data*)thiz->priv;

     if (data->flip_thread != -1) {
          pthread_cancel( data->flip_thread );
          pthread_join( data->flip_thread, NULL );
     }

     if (data->base.surface) {
          if (!(data->base.caps & DSCAPS_SUBSURFACE)  &&
               data->base.caps & DSCAPS_PRIMARY)
          {
               dfb_window_deinit( data->window );
               dfb_window_destroy( data->window, true );
          }
     }

     IDirectFBSurface_Destruct( thiz );
}