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

📄 ptk-file-browser.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "ptk-file-browser.h"#include <gtk/gtk.h>#include <glib.h>#include <glib/gi18n.h>#include <gdk/gdkkeysyms.h>#include <string.h>#include <stdio.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <time.h>#include <errno.h>#include <unistd.h>/* MIME type processing library from FreeDesktop.org */#include "xdgmime.h"#include "app-chooser-dialog.h"#include "ptk-file-icon-renderer.h"#include "ptk-utils.h"#include "ptk-input-dialog.h"#include "ptk-file-task.h"#include "ptk-location-view.h"#include "ptk-dir-tree-view.h"#include "settings.h"#include "vfs-dir.h"#include "vfs-file-info.h"#include "vfs-file-monitor.h"#include "vfs-app-desktop.h"#include "ptk-file-list.h"#include "ptk-text-renderer.h"#include "ptk-file-archiver.h"#include "ptk-clipboard.h"#include "ptk-file-menu.h"/* If set to FALSE, all selection changes in folder_view are prevented. */static gboolean can_folder_view_sel_change = TRUE;static void ptk_file_browser_class_init( PtkFileBrowserClass* klass );static void ptk_file_browser_init( PtkFileBrowser* file_browser );static void ptk_file_browser_finalize( GObject *obj );static void ptk_file_browser_get_property ( GObject *obj,                                            guint prop_id,                                            GValue *value,                                            GParamSpec *pspec );static void ptk_file_browser_set_property ( GObject *obj,                                            guint prop_id,                                            const GValue *value,                                            GParamSpec *pspec );/* Utility functions */static GtkWidget* create_folder_view( PtkFileBrowser* file_browser,                                      PtkFileBrowserViewMode view_mode );static void init_list_view( GtkTreeView* list_view );static GtkTreeView* ptk_file_browser_create_dir_tree( PtkFileBrowser* file_browser );static GtkTreeView* ptk_file_browser_create_location_view( PtkFileBrowser* file_browser );static GList* folder_view_get_selected_items( PtkFileBrowser* file_browser,                                              GtkTreeModel** model );static void ptk_file_browser_chdir_state_cb( VFSDir* dir,                                             int state,                                             gpointer user_data );void ptk_file_browser_open_selected_files_with_app( PtkFileBrowser* file_browser,                                                    char* app_desktop );static voidptk_file_browser_cut_or_copy( PtkFileBrowser* file_browser,                              gboolean copy );/* Get GtkTreePath of the item at coordinate x, y */static GtkTreePath*folder_view_get_tree_path_at_pos( PtkFileBrowser* file_browser, int x, int y );/* sort functions of folder view */static gint sort_files_by_name ( GtkTreeModel *model,                                 GtkTreeIter *a,                                 GtkTreeIter *b,                                 gpointer user_data );static gint sort_files_by_size ( GtkTreeModel *model,                                 GtkTreeIter *a,                                 GtkTreeIter *b,                                 gpointer user_data );static gint sort_files_by_time ( GtkTreeModel *model,                                 GtkTreeIter *a,                                 GtkTreeIter *b,                                 gpointer user_data );static gboolean filter_files ( GtkTreeModel *model,                               GtkTreeIter *it,                               gpointer user_data );/* sort functions of dir tree */static gint sort_dir_tree_by_name ( GtkTreeModel *model,                                    GtkTreeIter *a,                                    GtkTreeIter *b,                                    gpointer user_data );/* signal handlers */static voidon_folder_view_item_activated ( PtkIconView *iconview,                                GtkTreePath *path,                                PtkFileBrowser* file_browser );static voidon_folder_view_row_activated ( GtkTreeView *tree_view,                               GtkTreePath *path,                               GtkTreeViewColumn* col,                               PtkFileBrowser* file_browser );static voidon_folder_view_item_sel_change ( PtkIconView *iconview,                                 PtkFileBrowser* file_browser );static gbooleanon_folder_view_key_press_event ( GtkWidget *widget,                                 GdkEventKey *event,                                 PtkFileBrowser* file_browser );static gbooleanon_folder_view_button_press_event ( GtkWidget *widget,                                    GdkEventButton *event,                                    PtkFileBrowser* file_browser );static gbooleanon_folder_view_button_release_event ( GtkWidget *widget,                                      GdkEventButton *event,                                      PtkFileBrowser* file_browser );static gbooleanon_folder_view_popup_menu ( GtkWidget *widget,                            PtkFileBrowser* file_browser );static voidon_folder_view_scroll_scrolled ( GtkAdjustment *adjust,                                 PtkFileBrowser* file_browser );static voidon_dir_tree_sel_changed ( GtkTreeSelection *treesel,                          PtkFileBrowser* file_browser );static voidon_location_view_row_activated ( GtkTreeView *tree_view,                                 GtkTreePath *path,                                 GtkTreeViewColumn *column,                                 PtkFileBrowser* file_browser );static gbooleanon_location_view_button_press_event ( GtkTreeView* view,                                      GdkEventButton* evt,                                      PtkFileBrowser* file_browser );/* Drag & Drop */static voidon_folder_view_drag_data_received ( GtkWidget *widget,                                    GdkDragContext *drag_context,                                    gint x,                                    gint y,                                    GtkSelectionData *sel_data,                                    guint info,                                    guint time,                                    gpointer user_data );static voidon_folder_view_drag_data_get ( GtkWidget *widget,                               GdkDragContext *drag_context,                               GtkSelectionData *sel_data,                               guint info,                               guint time,                               PtkFileBrowser *file_browser );static voidon_folder_view_drag_begin ( GtkWidget *widget,                            GdkDragContext *drag_context,                            gpointer user_data );static gbooleanon_folder_view_drag_motion ( GtkWidget *widget,                             GdkDragContext *drag_context,                             gint x,                             gint y,                             guint time,                             PtkFileBrowser* file_browser );static gbooleanon_folder_view_drag_leave ( GtkWidget *widget,                            GdkDragContext *drag_context,                            guint time,                            PtkFileBrowser* file_browser );static gbooleanon_folder_view_drag_drop ( GtkWidget *widget,                           GdkDragContext *drag_context,                           gint x,                           gint y,                           guint time,                           PtkFileBrowser* file_browser );static voidon_folder_view_drag_end ( GtkWidget *widget,                          GdkDragContext *drag_context,                          gpointer user_data );/* Default signal handlers */static void ptk_file_browser_before_chdir( PtkFileBrowser* file_browser,                                           const char* path,                                           gboolean* cancel );static void ptk_file_browser_after_chdir( PtkFileBrowser* file_browser );static void ptk_file_browser_content_change( PtkFileBrowser* file_browser );static void ptk_file_browser_sel_change( PtkFileBrowser* file_browser );static void ptk_file_browser_open_item( PtkFileBrowser* file_browser, const char* path, int action );static void ptk_file_browser_pane_mode_change( PtkFileBrowser* file_browser );static intfile_list_order_from_sort_order( FileBrowserSortOrder order );static GtkPanedClass *parent_class = NULL;enum {    BEFORE_CHDIR_SIGNAL,    AFTER_CHDIR_SIGNAL,    OPEN_ITEM_SIGNAL,    CONTENT_CHANGE_SIGNAL,    SEL_CHANGE_SIGNAL,    PANE_MODE_CHANGE_SIGNAL,    N_SIGNALS};static guint signals[ N_SIGNALS ] = { 0 };static guint folder_view_auto_scroll_timer = 0;static GtkDirectionType folder_view_auto_scroll_direction = 0;/*  Drag & Drop/Clipboard targets  */static GtkTargetEntry drag_targets[] = {                                           {"text/uri-list", 0 , 0 }                                       };GType ptk_file_browser_get_type(){    static GType type = G_TYPE_INVALID;    if ( G_UNLIKELY ( type == G_TYPE_INVALID ) )    {        static const GTypeInfo info =            {                sizeof ( PtkFileBrowserClass ),                NULL,                NULL,                ( GClassInitFunc ) ptk_file_browser_class_init,                NULL,                NULL,                sizeof ( PtkFileBrowser ),                0,                ( GInstanceInitFunc ) ptk_file_browser_init,                NULL,            };        type = g_type_register_static ( GTK_TYPE_HPANED, "PtkFileBrowser", &info, 0 );    }    return type;}void ptk_file_browser_class_init( PtkFileBrowserClass* klass ){    GObjectClass * object_class;    GtkWidgetClass *widget_class;    object_class = ( GObjectClass * ) klass;    parent_class = g_type_class_peek_parent ( klass );    object_class->set_property = ptk_file_browser_set_property;    object_class->get_property = ptk_file_browser_get_property;    object_class->finalize = ptk_file_browser_finalize;    widget_class = GTK_WIDGET_CLASS ( klass );    /* Signals */    klass->before_chdir = ptk_file_browser_before_chdir;    klass->after_chdir = ptk_file_browser_after_chdir;    klass->open_item = ptk_file_browser_open_item;    klass->content_change = ptk_file_browser_content_change;    klass->sel_change = ptk_file_browser_sel_change;    klass->pane_mode_change = ptk_file_browser_pane_mode_change;    /* before-chdir is emitted when PtkFileBrowser is about to change    * its working directory. The 1st param is the path of the dir (in UTF-8),    * and the 2nd param is a gboolean*, which can be filled by the    * signal handler with TRUE to cancel the operation.    */    signals[ BEFORE_CHDIR_SIGNAL ] =        g_signal_new ( "before-chdir",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, before_chdir ),                       NULL, NULL,                       gtk_marshal_VOID__POINTER_POINTER,                       G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER );    signals[ AFTER_CHDIR_SIGNAL ] =        g_signal_new ( "after-chdir",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, after_chdir ),                       NULL, NULL,                       g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 );    /*    * This signal is sent when a directory is about to be opened    * arg1 is the path to be opened, and arg2 is the type of action,    * ex: open in tab, open in terminal...etc.    */    signals[ OPEN_ITEM_SIGNAL ] =        g_signal_new ( "open-item",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, open_item ),                       NULL, NULL,                       gtk_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT );    signals[ CONTENT_CHANGE_SIGNAL ] =        g_signal_new ( "content-change",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, content_change ),                       NULL, NULL,                       g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 );    signals[ SEL_CHANGE_SIGNAL ] =        g_signal_new ( "sel-change",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, sel_change ),                       NULL, NULL,                       g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 );    signals[ PANE_MODE_CHANGE_SIGNAL ] =        g_signal_new ( "pane-mode-change",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( PtkFileBrowserClass, pane_mode_change ),                       NULL, NULL,                       g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 );}void ptk_file_browser_init( PtkFileBrowser* file_browser ){    file_browser->folder_view_scroll = gtk_scrolled_window_new ( NULL, NULL );    gtk_paned_pack2 ( GTK_PANED ( file_browser ),                      file_browser->folder_view_scroll, TRUE, TRUE );    gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( file_browser->folder_view_scroll ),                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );    gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW ( file_browser->folder_view_scroll ),

⌨️ 快捷键说明

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