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

📄 ptk-file-browser.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
                                          GTK_SHADOW_IN );}void ptk_file_browser_finalize( GObject *obj ){    PtkFileBrowser * file_browser = PTK_FILE_BROWSER( obj );    if ( file_browser->dir )    {        g_signal_handlers_disconnect_matched( file_browser->dir,                                              G_SIGNAL_MATCH_DATA,                                              0, 0, NULL, NULL,                                              file_browser );        vfs_dir_remove_state_callback( file_browser->dir,                                       ptk_file_browser_chdir_state_cb,                                       file_browser );        vfs_dir_unref( file_browser->dir );    }    /* Remove all idle handlers which are not called yet. */    do    {}    while ( g_source_remove_by_user_data( file_browser ) );    if ( file_browser->file_list )    {        g_signal_handlers_disconnect_matched( file_browser->file_list,                                              G_SIGNAL_MATCH_DATA,                                              0, 0, NULL, NULL,                                              file_browser );        g_object_unref( G_OBJECT( file_browser->file_list ) );    }    G_OBJECT_CLASS( parent_class ) ->finalize( obj );}void ptk_file_browser_get_property ( GObject *obj,                                     guint prop_id,                                     GValue *value,                                     GParamSpec *pspec ){}void ptk_file_browser_set_property ( GObject *obj,                                     guint prop_id,                                     const GValue *value,                                     GParamSpec *pspec ){}/* File Browser API */GtkWidget* ptk_file_browser_new( GtkWidget* mainWindow,                                 PtkFileBrowserViewMode view_mode ){    PtkFileBrowser * file_browser;    file_browser = ( PtkFileBrowser* ) g_object_new( PTK_TYPE_FILE_BROWSER, NULL );    file_browser->folder_view = create_folder_view( file_browser, view_mode );    file_browser->view_mode = view_mode;    gtk_container_add ( GTK_CONTAINER ( file_browser->folder_view_scroll ),                        file_browser->folder_view );    gtk_widget_show_all( file_browser->folder_view_scroll );    return ( GtkWidget* ) file_browser;}static gboolean side_pane_chdir( PtkFileBrowser* file_browser,                                 const char* folder_path ){    if ( file_browser->side_pane_mode == FB_SIDE_PANE_BOOKMARKS )    {        ptk_location_view_chdir( file_browser->side_view, folder_path );        return TRUE;    }    else if ( file_browser->side_pane_mode == FB_SIDE_PANE_DIR_TREE )    {        return ptk_dir_tree_view_chdir( file_browser->side_view, folder_path );    }    return FALSE;}gboolean ptk_file_browser_chdir( PtkFileBrowser* file_browser,                                 const char* folder_path,                                 gboolean add_history ){    gboolean cancel = FALSE;    GtkWidget* folder_view = file_browser->folder_view;    GtkTreeView* dir_tree = file_browser->side_view;    GtkEntry* addressBar;    GtkStatusbar* statusBar;    char* path_end;    int test_access;    char *cwd;    char* path;    gboolean is_current;    /*    * FIXME:    * Do nothing when there is unfinished task running in the    * working thread.    * This should be fixed with a better way in the future.    */    if ( file_browser->busy || !folder_path )        return FALSE;    if ( folder_path )    {        path = strdup( folder_path );        /* remove redundent '/' */        if ( strcmp( path, "/" ) )        {            path_end = path + strlen( path ) - 1;            for ( ; path_end > path; --path_end )            {                if ( *path_end != '/' )                    break;                else                    *path_end = '\0';            }        }    }    else        path = NULL;    if ( ! path || ! g_file_test( path, ( G_FILE_TEST_IS_DIR ) ) )    {        ptk_show_error( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) ),                        _( "Directory does'nt exist!" ) );        g_free( path );        return FALSE;    }    /* FIXME: check access */#if defined(HAVE_EUIDACCESS)    test_access = euidaccess( path, R_OK | X_OK );#elif defined(HAVE_EACCESS)    test_access = eaccess( path, R_OK | X_OK );#else   /* No check */    test_access = 0;#endif    if ( test_access == -1 )    {        ptk_show_error( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) ),                        g_strerror( errno ) );        return FALSE;    }    g_signal_emit( file_browser, signals[ BEFORE_CHDIR_SIGNAL ], 0, path, &cancel );    if ( add_history )    {        if ( ! file_browser->curHistory || strcmp( file_browser->curHistory->data, path ) )        {            /* Has forward history */            if ( file_browser->curHistory && file_browser->curHistory->next )            {                g_list_foreach ( file_browser->curHistory->next, ( GFunc ) g_free, NULL );                g_list_free( file_browser->curHistory->next );                file_browser->curHistory->next = NULL;            }            /* Add path to history if there is no forward history */            file_browser->history = g_list_append( file_browser->history, path );            file_browser->curHistory = g_list_last( file_browser->history );        }    }    if ( file_browser->view_mode == FBVM_ICON_VIEW )        ptk_icon_view_set_model( PTK_ICON_VIEW( folder_view ), NULL );    else if ( file_browser->view_mode == FBVM_LIST_VIEW )        gtk_tree_view_set_model( GTK_TREE_VIEW( folder_view ), NULL );    if ( file_browser->dir )    {        g_signal_handlers_disconnect_matched( file_browser->dir,                                              G_SIGNAL_MATCH_DATA,                                              0, 0, NULL, NULL,                                              file_browser );        vfs_dir_remove_state_callback( file_browser->dir,                                       ptk_file_browser_chdir_state_cb,                                       file_browser );        vfs_dir_unref( file_browser->dir );    }    file_browser->dir = vfs_get_dir( path );    vfs_dir_add_state_callback( file_browser->dir,                                ptk_file_browser_chdir_state_cb,                                file_browser );    file_browser->busy = TRUE;    return TRUE;}static gbooleanptk_file_browser_delayed_content_change( PtkFileBrowser* file_browser ){    GTimeVal t;    g_get_current_time( &t );    file_browser->prev_update_time = t.tv_sec;    g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 );    file_browser->update_timeout = 0;    return FALSE;}#if 0void on_folder_content_update ( FolderContent* content,                                PtkFileBrowser* file_browser ){    /*  FIXME: Newly added or deleted files should not be delayed.        This must be fixed before 0.2.0 release.  */    GTimeVal t;    g_get_current_time( &t );    /*      Previous update is < 5 seconds before.      Queue the update, and don't update the view too often    */    if ( ( t.tv_sec - file_browser->prev_update_time ) < 5 )    {        /*          If the update timeout has been set, wait until the timeout happens, and          don't do anything here.        */        if ( 0 == file_browser->update_timeout )        { /* No timeout callback. Add one */            /* Delay the update */            file_browser->update_timeout = g_timeout_add( 5000,                                                          ( GSourceFunc ) ptk_file_browser_delayed_content_change, file_browser );        }    }    else if ( 0 == file_browser->update_timeout )    { /* No timeout callback. Add one */        file_browser->prev_update_time = t.tv_sec;        g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 );    }}#endifstatic gboolean ptk_file_browser_content_changed( PtkFileBrowser* file_browser ){    gdk_threads_enter();    g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 );    gdk_threads_leave();    return FALSE;}static void on_folder_content_changed( VFSDir* dir, VFSFileInfo* file,                                       PtkFileBrowser* file_browser ){    g_idle_add( ( GSourceFunc ) ptk_file_browser_content_changed,                file_browser );}static void on_sort_col_changed( GtkTreeSortable* sortable,                                 PtkFileBrowser* file_browser ){    int col;    gtk_tree_sortable_get_sort_column_id( sortable,                                          &col, &file_browser->sort_type );    switch ( col )    {    case COL_FILE_NAME:        col = FB_SORT_BY_NAME;        break;    case COL_FILE_SIZE:        col = FB_SORT_BY_SIZE;        break;    case COL_FILE_MTIME:        col = FB_SORT_BY_MTIME;        break;    case COL_FILE_DESC:        col = FB_SORT_BY_TYPE;        break;    case COL_FILE_PERM:        col = FB_SORT_BY_PERM;        break;    case COL_FILE_OWNER:        col = FB_SORT_BY_OWNER;        break;    }    file_browser->sort_order = col;}static void ptk_file_browser_update_model( PtkFileBrowser* file_browser ){    PtkFileList * list;    GtkTreeModel *old_list;    list = ptk_file_list_new( file_browser->dir,                              file_browser->show_hidden_files );    old_list = file_browser->file_list;    file_browser->file_list = GTK_TREE_MODEL( list );    if ( old_list )        g_object_unref( G_OBJECT( old_list ) );    gtk_tree_sortable_set_sort_column_id(        GTK_TREE_SORTABLE( list ),        file_list_order_from_sort_order( file_browser->sort_order ),        file_browser->sort_type );    ptk_file_list_show_thumbnails( list,                                   ( file_browser->view_mode == FBVM_ICON_VIEW ),                                   file_browser->max_thumbnail );    g_signal_connect( list, "sort-column-changed",                      G_CALLBACK( on_sort_col_changed ), file_browser );    if ( file_browser->view_mode == FBVM_ICON_VIEW )        ptk_icon_view_set_model( PTK_ICON_VIEW( file_browser->folder_view ),                                 GTK_TREE_MODEL( list ) );    else if ( file_browser->view_mode == FBVM_LIST_VIEW )        gtk_tree_view_set_model( GTK_TREE_VIEW( file_browser->folder_view ),                                 GTK_TREE_MODEL( list ) );}void ptk_file_browser_chdir_state_cb( VFSDir* dir,                                      int state,                                      gpointer user_data ){    PtkFileList * list, *old_list;    PtkFileBrowser* file_browser = ( PtkFileBrowser* ) user_data;    if ( state == 1 )    {        g_signal_connect( dir, "file-created",                          G_CALLBACK( on_folder_content_changed ), file_browser );        g_signal_connect( dir, "file-deleted",                          G_CALLBACK( on_folder_content_changed ), file_browser );        g_signal_connect( dir, "file-changed",                          G_CALLBACK( on_folder_content_changed ), file_browser );        ptk_file_browser_update_model( file_browser );        file_browser->busy = FALSE;        g_signal_emit( file_browser, signals[ AFTER_CHDIR_SIGNAL ], 0 );        g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 );        g_signal_emit( file_browser, signals[ SEL_CHANGE_SIGNAL ], 0 );        if ( file_browser->side_pane )        {            side_pane_chdir( file_browser,                             ptk_file_browser_get_cwd( file_browser ) );        }    }    else if ( state == 2 )    {        g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 );        if ( file_browser->file_list )        {            ptk_file_list_show_thumbnails( PTK_FILE_LIST( file_browser->file_list ),                                           file_browser->view_mode == FBVM_ICON_VIEW,                                           file_browser->max_thumbnail );        }    }}const char* ptk_file_browser_get_cwd( PtkFileBrowser* file_browser ){    if ( ! file_browser->curHistory )        return NULL;    return ( const char* ) file_browser->curHistory->data;}

⌨️ 快捷键说明

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