⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptk-file-task.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
    {        data->old_dest_file = dest_file;        ufile_path = g_filename_display_name( dest_file );        gtk_label_set_text( data->to, ufile_path );        g_free( ufile_path );    }    /* update progress */    if ( data->old_percent != percent )    {        data->old_percent = percent;        gtk_progress_bar_set_fraction( data->progress,                                       ( ( gdouble ) percent ) / 100 );        g_snprintf( percent_str, 16, "%d %%", percent );        gtk_progress_bar_set_text( data->progress, percent_str );    }    gdk_threads_leave();}gboolean on_vfs_file_task_state_cb( VFSFileTask* task,                                    VFSFileTaskState state,                                    gpointer state_data,                                    gpointer user_data ){    PtkFileTask* data = ( PtkFileTask* ) user_data;    GtkWidget* dlg;    int response;    gboolean ret = TRUE;    char** new_dest;    gdk_threads_enter();    switch ( state )    {    case VFS_FILE_TASK_FINISH:        if ( data->timeout )        {            g_source_remove( data->timeout );            data->timeout = 0;        }        if ( data->progress_dlg )        {            gtk_widget_destroy( data->progress_dlg );            data->progress_dlg = NULL;        }        if ( data->complete_notify )            data->complete_notify( task, data->user_data );        vfs_file_task_free( data->task );        data->task = NULL;        break;    case VFS_FILE_TASK_QUERY_OVERWRITE:        new_dest = ( char** ) state_data;        ret = query_overwrite( data, new_dest );        break;    case VFS_FILE_TASK_QUERY_ABORT:        dlg = gtk_message_dialog_new( GTK_WINDOW( data->progress_dlg ),                                      GTK_DIALOG_MODAL,                                      GTK_MESSAGE_QUESTION,                                      GTK_BUTTONS_YES_NO,                                      _( "Cancel the operation?" ) );        response = gtk_dialog_run( GTK_DIALOG( dlg ) );        gtk_widget_destroy( dlg );        ret = ( response != GTK_RESPONSE_YES );        break;    case VFS_FILE_TASK_ERROR:        if( data->timeout )        {            g_source_remove( data->timeout );            data->timeout = 0;        }        ptk_show_error( data->progress_dlg ? GTK_WINDOW(data->progress_dlg) : data->parent_window,                        state_data ? (char*)state_data : g_strerror( task->error ) );        ret = FALSE;   /* abort */        break;    /* FIXME:        VFS_FILE_TASK_RUNNING, VFS_FILE_TASK_ABORTED not handled */    default:        break;    }    gdk_threads_leave();    return ret;    /* return TRUE to continue */}enum{    RESPONSE_OVERWRITE = 1 << 0,    RESPONSE_OVERWRITEALL = 1 << 1,    RESPONSE_RENAME = 1 << 2,    RESPONSE_SKIP = 1 << 3,    RESPONSE_SKIPALL = 1 << 4};static void on_file_name_entry_changed( GtkEntry* entry, GtkDialog* dlg ){    const char * old_name;    gboolean can_rename;    const char* new_name = gtk_entry_get_text( entry );    old_name = ( const char* ) g_object_get_data( G_OBJECT( entry ), "old_name" );    can_rename = new_name && ( 0 != strcmp( new_name, old_name ) );    gtk_dialog_set_response_sensitive ( dlg, RESPONSE_RENAME, can_rename );    gtk_dialog_set_response_sensitive ( dlg, RESPONSE_OVERWRITE, !can_rename );    gtk_dialog_set_response_sensitive ( dlg, RESPONSE_OVERWRITEALL, !can_rename );}gboolean query_overwrite( PtkFileTask* task, char** new_dest ){    const char * message;    const char* question;    GtkWidget* dlg;    GtkWidget* parent_win;    GtkEntry* entry;    int response;    gboolean has_overwrite_btn = TRUE;    char* udest_file;    char* file_name;    char* ufile_name;    char* dir_name;    gboolean different_files, is_src_dir, is_dest_dir;    struct stat src_stat, dest_stat;    gboolean restart_timer = FALSE;    different_files = ( 0 != strcmp( task->task->current_file,                                     task->task->current_dest ) );    lstat( task->task->current_file, &src_stat );    lstat( task->task->current_dest, &dest_stat );    is_src_dir = !!S_ISDIR( dest_stat.st_mode );    is_dest_dir = !!S_ISDIR( src_stat.st_mode );    if ( task->timeout )    {        g_source_remove( task->timeout );        task->timeout = 0;        restart_timer = TRUE;    }    if ( different_files && is_dest_dir == is_src_dir )    {        if ( is_dest_dir )        {            /* Ask the user whether to overwrite dir content or not */            question = _( "Do you want to overwrite the folder and its content?" );        }        else        {            /* Ask the user whether to overwrite the file or not */            question = _( "Do you want to overwrite this file?" );        }    }    else    { /* Rename is required */        question = _( "Please choose a new file name." );        has_overwrite_btn = FALSE;    }    if ( different_files )    {        /* Ths first %s is a file name, and the second one represents followed message.        ex: "/home/pcman/some_file" has existed.\n\nDo you want to overwrite existing file?" */        message = _( "\"%s\" has existed.\n\n%s" );    }    else    {        /* Ths first %s is a file name, and the second one represents followed message. */        message = _( "\"%s\"\n\nDestination and source are the same file.\n\n%s" );    }    udest_file = g_filename_display_name( task->task->current_dest );    parent_win = task->progress_dlg ? task->progress_dlg : GTK_WIDGET(task->parent_window);    dlg = gtk_message_dialog_new( GTK_WINDOW( parent_win ),                                  GTK_DIALOG_MODAL,                                  GTK_MESSAGE_QUESTION,                                  GTK_BUTTONS_NONE,                                  message,                                  udest_file,                                  question );    g_free( udest_file );    if ( has_overwrite_btn )    {        gtk_dialog_add_buttons ( GTK_DIALOG( dlg ),                                 _( "Overwrite" ), RESPONSE_OVERWRITE,                                 _( "Overwrite All" ), RESPONSE_OVERWRITEALL,                                 NULL );    }    gtk_dialog_add_buttons ( GTK_DIALOG( dlg ),                             _( "Rename" ), RESPONSE_RENAME,                             _( "Skip" ), RESPONSE_SKIP,                             _( "Skip All" ), RESPONSE_SKIPALL,                             GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,                             NULL );    file_name = g_path_get_basename( task->task->current_dest );    ufile_name = g_filename_display_name( file_name );    g_free( file_name );    entry = ( GtkEntry* ) gtk_entry_new();    g_object_set_data_full( G_OBJECT( entry ), "old_name",                            ufile_name, g_free );    g_signal_connect( G_OBJECT( entry ), "changed",                      G_CALLBACK( on_file_name_entry_changed ), dlg );    gtk_entry_set_text( entry, ufile_name );    gtk_box_pack_start( GTK_BOX( GTK_DIALOG( dlg ) ->vbox ), GTK_WIDGET( entry ),                        FALSE, TRUE, 4 );    gtk_widget_show_all( dlg );    response = gtk_dialog_run( GTK_DIALOG( dlg ) );    switch ( response )    {    case RESPONSE_OVERWRITEALL:        vfs_file_task_set_overwrite_mode( task->task, VFS_FILE_TASK_OVERWRITE_ALL );        break;    case RESPONSE_OVERWRITE:        vfs_file_task_set_overwrite_mode( task->task, VFS_FILE_TASK_OVERWRITE );        break;    case RESPONSE_SKIPALL:        vfs_file_task_set_overwrite_mode( task->task, VFS_FILE_TASK_SKIP_ALL );        break;    case RESPONSE_SKIP:        vfs_file_task_set_overwrite_mode( task->task, VFS_FILE_TASK_SKIP );        break;    case RESPONSE_RENAME:        vfs_file_task_set_overwrite_mode( task->task, VFS_FILE_TASK_RENAME );        file_name = g_filename_from_utf8( gtk_entry_get_text( entry ),                                          - 1, NULL, NULL, NULL );        if ( file_name )        {            dir_name = g_path_get_dirname( task->task->current_dest );            *new_dest = g_build_filename( dir_name, file_name, NULL );            g_free( file_name );            g_free( dir_name );        }        break;    case GTK_RESPONSE_CANCEL:        vfs_file_task_abort( task->task );        break;    }    gtk_widget_destroy( dlg );    if( restart_timer )    {        task->timeout = g_timeout_add( 500,                                    ( GSourceFunc ) open_up_progress_dlg,                                    ( gpointer ) task );    }    return response != GTK_RESPONSE_CANCEL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -