CV_IMPL void cvDestroyWindow( const char* name )
{
    CV_FUNCNAME( "cvDestroyWindow" );

    __BEGIN__;

    CvWindow* window;

    if(!name)
        CV_ERROR( CV_StsNullPtr, "NULL name string" );

    window = icvFindWindowByName( name );
    if( !window )
        EXIT;

	// note that it is possible for the update thread to run this function
	// if there is a call to cvShowImage in a mouse callback
	// (this would produce a deadlock on window_mutex)
	CV_LOCK_MUTEX();

	icvDeleteWindow( window );

	CV_UNLOCK_MUTEX();

    __END__;
}
CV_IMPL void cvDestroyAllWindows( void )
{
    while( hg_windows ) 
	{
        CvWindow* window = hg_windows;
        icvDeleteWindow( window );
    }
}
static gboolean icvOnClose( GtkWidget* widget, GdkEvent* /*event*/, gpointer user_data )
{
    CvWindow* window = (CvWindow*)user_data;
    if( window->signature == CV_WINDOW_MAGIC_VAL &&
        window->frame == widget )
	{
        icvDeleteWindow(window);
	}
    return TRUE;
}
CV_IMPL void
cvDestroyAllWindows( void )
{
	CV_LOCK_MUTEX();

    while( hg_windows )
    {
        CvWindow* window = hg_windows;
        icvDeleteWindow( window );
    }
	CV_UNLOCK_MUTEX();
}
CV_IMPL void cvDestroyWindow( const char* name)
{
    CV_FUNCNAME( "cvDestroyWindow" );
    
    __BEGIN__;
    
    CvWindow* window;
    
    if(!name)
        CV_ERROR( CV_StsNullPtr, "NULL name string" );
    
    window = icvFindWindowByName( name );
    if( !window )
        EXIT;
    
    icvDeleteWindow( window );
    
    __END__;
}