📄 ptk-file-browser.c
字号:
#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 + -