Пример #1
0
void ptk_file_list_show_thumbnails( PtkFileList* list, gboolean is_big,
                                    int max_file_size )
{
    GList* l;
    VFSFileInfo* file;
    int old_max_thumbnail;

    old_max_thumbnail = list->max_thumbnail;
    list->max_thumbnail = max_file_size;
    list->big_thumbnail = is_big;
    /* FIXME: This is buggy!!! Further testing might be needed.
    */
    if( 0 == max_file_size )
    {
        if( old_max_thumbnail > 0 ) /* cancel thumbnails */
        {
            vfs_thumbnail_loader_cancel_all_requests( list->dir, list->big_thumbnail );
            g_signal_handlers_disconnect_by_func( list->dir, on_thumbnail_loaded, list );

            for( l = list->files; l; l = l->next )
            {
                file = (VFSFileInfo*)l->data;
                if( vfs_file_info_is_image( file )
                    && vfs_file_info_is_thumbnail_loaded( file, is_big ) )
                {
                    /* update the model */
                    ptk_file_list_file_changed( list->dir, file, list );
                }
            }
        }
        return;
    }

    g_signal_connect( list->dir, "thumbnail-loaded",
                                    G_CALLBACK(on_thumbnail_loaded), list );

    for( l = list->files; l; l = l->next )
    {
        file = (VFSFileInfo*)l->data;
        if( vfs_file_info_is_image( file )
            && vfs_file_info_get_size( file ) < list->max_thumbnail )
        {
            if( vfs_file_info_is_thumbnail_loaded( file, is_big ) )
                ptk_file_list_file_changed( list->dir, file, list );
            else
            {
                vfs_thumbnail_loader_request( list->dir, file, is_big );
                /* g_debug( "REQUEST: %s", file->name ); */
            }
        }
    }
}
Пример #2
0
static void _ptk_file_list_file_created( VFSDir* dir, VFSFileInfo* file,
                                        PtkFileList* list )
{
    ptk_file_list_file_created( dir, file, list );

    /* check if reloading of thumbnail is needed. */
    if( vfs_file_info_is_image( file )
        && vfs_file_info_get_size( file ) < list->max_thumbnail )
    {
        if( ! vfs_file_info_is_thumbnail_loaded( file, list->big_thumbnail ) )
            vfs_thumbnail_loader_request( list->dir, file, list->big_thumbnail );
    }
}
Пример #3
0
static void _ptk_file_list_file_created( VFSDir* dir, VFSFileInfo* file,
                                        PtkFileList* list )
{
    ptk_file_list_file_created( dir, file, list );

    /* check if reloading of thumbnail is needed. */
    if ( list->max_thumbnail != 0 && (
#ifdef HAVE_FFMPEG
         vfs_file_info_is_video( file ) ||
#endif
         ( file->size /*vfs_file_info_get_size( file )*/ < list->max_thumbnail
                                    && vfs_file_info_is_image( file ) ) ) )
    {
        if( ! vfs_file_info_is_thumbnail_loaded( file, list->big_thumbnail ) )
            vfs_thumbnail_loader_request( list->dir, file, list->big_thumbnail );
    }
}
Пример #4
0
static void _ptk_file_list_file_changed( VFSDir* dir, VFSFileInfo* file,
                                        PtkFileList* list )
{
    if ( !file || !dir || dir->cancel )
        return;

    ptk_file_list_file_changed( dir, file, list );

    /* check if reloading of thumbnail is needed.
     * See also desktop-window.c:on_file_changed() */
    if ( list->max_thumbnail != 0 && (
#ifdef HAVE_FFMPEG
         ( vfs_file_info_is_video( file ) &&
           time( NULL ) - *vfs_file_info_get_mtime( file ) > 5 ) ||
#endif
         ( file->size /*vfs_file_info_get_size( file )*/ < list->max_thumbnail
                                    && vfs_file_info_is_image( file ) ) ) )
    {
        if( ! vfs_file_info_is_thumbnail_loaded( file, list->big_thumbnail ) )
            vfs_thumbnail_loader_request( list->dir, file,
                                          list->big_thumbnail );
    }
}
Пример #5
0
gpointer thumbnail_loader_thread( VFSAsyncTask* task, VFSThumbnailLoader* loader )
{
    ThumbnailRequest* req;
    int i;
    gboolean load_big, need_update;

    while( G_LIKELY( ! vfs_async_task_is_cancelled(task) ))
    {
        vfs_async_task_lock( task );
        req = (ThumbnailRequest*)g_queue_pop_head( loader->queue );
        vfs_async_task_unlock( task );
        if( G_UNLIKELY( ! req ) )
            break;
        /* g_debug("pop: %s", req->file->name); */

        /* Only we have the reference. That means, no body is using the file */
        if( req->file->n_ref == 1 )
        {
            thumbnail_request_free( req );
            continue;
        }

        need_update = FALSE;
        for ( i = 0; i < 2; ++i )
        {
            if ( 0 == req->n_requests[ i ] )
                continue;
            load_big = ( i == LOAD_BIG_THUMBNAIL );
            if ( ! vfs_file_info_is_thumbnail_loaded( req->file, load_big ) )
            {
                char* full_path;
                full_path = g_build_filename( loader->dir->path,
                                              vfs_file_info_get_name( req->file ),
                                              NULL );
                vfs_file_info_load_thumbnail( req->file, full_path, load_big );
                g_free( full_path );
                /*  Slow down for displaying. */
                g_usleep(G_USEC_PER_SEC/1000);

                /* g_debug( "thumbnail loaded: %s", req->file ); */
            }
            need_update = TRUE;
        }

        if( ! vfs_async_task_is_cancelled(task) && need_update )
        {
            vfs_async_task_lock( task );
            g_queue_push_tail( loader->update_queue, vfs_file_info_ref(req->file) );
            if( 0 == loader->idle_handler)
                loader->idle_handler = g_idle_add_full( G_PRIORITY_LOW, (GSourceFunc) on_thumbnail_idle, loader, NULL );
            vfs_async_task_unlock( task );
        }
        /* g_debug( "NEED_UPDATE: %d", need_update ); */
        thumbnail_request_free( req );
    }

    if( vfs_async_task_is_cancelled(task) )
    {
        /* g_debug( "THREAD CANCELLED!!!" ); */
        vfs_async_task_lock( task );
        if( loader->idle_handler)
        {
            g_source_remove( loader->idle_handler );
            loader->idle_handler = 0;
        }
        vfs_async_task_unlock( task );
    }
    else
    {
        if( 0 == loader->idle_handler)
        {
            /* g_debug( "ADD IDLE HANDLER BEFORE THREAD ENDING" ); */
            loader->idle_handler = g_idle_add_full( G_PRIORITY_LOW, (GSourceFunc) on_thumbnail_idle, loader, NULL );
        }
    }
    /* g_debug("THREAD ENDED!");  */
    return NULL;
}
Пример #6
0
void ptk_file_list_show_thumbnails( PtkFileList* list, gboolean is_big,
                                    int max_file_size )
{
    GList* l;
    VFSFileInfo* file;
    int old_max_thumbnail;

    if ( !list )
        return;
    
    old_max_thumbnail = list->max_thumbnail;
    list->max_thumbnail = max_file_size;
    list->big_thumbnail = is_big;
    /* FIXME: This is buggy!!! Further testing might be needed.
    */
    if( 0 == max_file_size )
    {
        if( old_max_thumbnail > 0 ) /* cancel thumbnails */
        {
            vfs_thumbnail_loader_cancel_all_requests( list->dir, list->big_thumbnail );
            g_signal_handlers_disconnect_by_func( list->dir, on_thumbnail_loaded, list );

            for( l = list->files; l; l = l->next )
            {
                file = (VFSFileInfo*)l->data;
                if ( ( vfs_file_info_is_image( file )
#ifdef HAVE_FFMPEG
                       || vfs_file_info_is_video( file )
#endif
                     ) && vfs_file_info_is_thumbnail_loaded( file, is_big ) )
                {
                    /* update the model */
                    ptk_file_list_file_changed( list->dir, file, list );

                }
            }

            /* Thumbnails are being disabled so ensure the large thumbnails are
             * freed - with up to 256x256 images this is a lot of memory */
            vfs_dir_unload_thumbnails(list->dir, is_big);
        }
        return;
    }
    g_signal_connect( list->dir, "thumbnail-loaded",
                                    G_CALLBACK(on_thumbnail_loaded), list );

    for( l = list->files; l; l = l->next )
    {
        file = (VFSFileInfo*)l->data;
        if ( list->max_thumbnail != 0 && (
#ifdef HAVE_FFMPEG
             vfs_file_info_is_video( file ) ||
#endif
             ( file->size /*vfs_file_info_get_size( file )*/ < list->max_thumbnail
                                        && vfs_file_info_is_image( file ) ) ) )
        {
            if( vfs_file_info_is_thumbnail_loaded( file, is_big ) )
                ptk_file_list_file_changed( list->dir, file, list );
            else
            {
                vfs_thumbnail_loader_request( list->dir, file, is_big );
                /* g_debug( "REQUEST: %s", file->name ); */
            }
        }
    }
}