📄 ptk-file-misc.c
字号:
sel_files = g_list_copy( sel_files ); g_list_foreach( sel_files, vfs_file_info_ref, NULL ); dlg = file_properties_dlg_new( parent_win, dir_path ? dir_path : cwd, sel_files ); g_signal_connect_swapped( dlg, "destroy", G_CALLBACK( vfs_file_info_list_free ), sel_files ); gtk_widget_show( dlg ); g_free( dir_path );}static gboolean open_files_with_app( const char* cwd, GList* files, const char* app_desktop, PtkFileBrowser* file_browser ){ gchar * name; GError* err = NULL; GList* l; VFSAppDesktop* app; GdkScreen* screen; /* Check whether this is an app desktop file or just a command line */ /* Not a desktop entry name */ if ( g_str_has_suffix ( app_desktop, ".desktop" ) ) { app = vfs_app_desktop_new( app_desktop ); } else { /* * If we are lucky enough, there might be a desktop entry * for this program */ name = g_strconcat ( app_desktop, ".desktop", NULL ); if ( g_file_test( name, G_FILE_TEST_EXISTS ) ) { app = vfs_app_desktop_new( name ); } else { /* dirty hack! */ app = vfs_app_desktop_new( NULL ); app->exec = g_strdup( app_desktop ); } g_free( name ); } if( file_browser ) screen = gtk_widget_get_screen( file_browser ); else screen = gdk_screen_get_default(); if ( ! vfs_app_desktop_open_files( screen, cwd, app, files, &err ) ) { GtkWidget * toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL; ptk_show_error( GTK_WINDOW( toplevel ), err->message ); g_error_free( err ); } vfs_app_desktop_unref( app ); return TRUE;}static void open_files_with_each_app( gpointer key, gpointer value, gpointer user_data ){ const char * app_desktop = ( const char* ) key; const char* cwd; GList* files = ( GList* ) value; PtkFileBrowser* file_browser = ( PtkFileBrowser* ) user_data; /* FIXME: cwd should be passed into this function */ cwd = file_browser ? ptk_file_browser_get_cwd(file_browser) : NULL; open_files_with_app( cwd, files, app_desktop, file_browser );}static void free_file_list_hash( gpointer key, gpointer value, gpointer user_data ){ const char * app_desktop; GList* files; app_desktop = ( const char* ) key; files = ( GList* ) value; g_list_foreach( files, ( GFunc ) g_free, NULL ); g_list_free( files );}void ptk_open_files_with_app( const char* cwd, GList* sel_files, char* app_desktop, PtkFileBrowser* file_browser ){ GList * l; gchar* full_path; const char* desktop_file; VFSFileInfo* file; VFSMimeType* mime_type; gboolean is_first_dir = TRUE; GList* files_to_open = NULL; GHashTable* file_list_hash = NULL; GError* err; char* new_dir = NULL; char* choosen_app = NULL; GtkWidget* toplevel; for ( l = sel_files; l; l = l->next ) { file = ( VFSFileInfo* ) l->data; if ( G_UNLIKELY( ! file ) ) continue; full_path = g_build_filename( cwd, vfs_file_info_get_name( file ), NULL ); if ( G_LIKELY( full_path ) ) { if ( ! app_desktop ) { if ( g_file_test( full_path, G_FILE_TEST_IS_DIR ) ) { if ( ! new_dir ) new_dir = full_path; else { if ( G_LIKELY( file_browser ) ) { ptk_file_browser_emit_open( file_browser, full_path, PTK_OPEN_NEW_TAB ); } g_free( full_path ); } continue; } /* If this file is an executable file, run it. */ if ( vfs_file_info_is_executable( file, full_path ) ) { char * argv[ 2 ] = { full_path, NULL }; GdkScreen* screen = file_browser ? gtk_widget_get_screen( file_browser ) : gdk_screen_get_default(); err = NULL; if ( ! vfs_exec_on_screen ( screen, cwd, argv, NULL, vfs_file_info_get_disp_name( file ), VFS_EXEC_DEFAULT_FLAGS, &err ) ) { toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL; ptk_show_error( ( GtkWindow* ) toplevel, err->message ); g_error_free( err ); } else { if ( G_LIKELY( file_browser ) ) { ptk_file_browser_emit_open( file_browser, full_path, PTK_OPEN_FILE ); } } g_free( full_path ); continue; } mime_type = vfs_file_info_get_mime_type( file ); /* The file itself is a desktop entry file. */ /* if( g_str_has_suffix( vfs_file_info_get_name( file ), ".desktop" ) ) */ if ( file->flags & VFS_FILE_INFO_DESKTOP_ENTRY ) app_desktop = full_path; else app_desktop = vfs_mime_type_get_default_action( mime_type ); if ( !app_desktop && xdg_mime_is_text_file( full_path, mime_type->type ) ) { /* FIXME: special handling for plain text file */ /* app = get_default_app_for_mime_type( XDG_MIME_TYPE_PLAIN_TEXT ); */ } if ( !app_desktop ) { toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL; /* Let the user choose an application */ choosen_app = ptk_choose_app_for_mime_type( ( GtkWindow* ) toplevel, mime_type ); app_desktop = choosen_app; } if ( ! app_desktop ) { g_free( full_path ); continue; } files_to_open = NULL; if ( ! file_list_hash ) file_list_hash = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL ); else files_to_open = g_hash_table_lookup( file_list_hash, app_desktop ); if ( app_desktop != full_path ) files_to_open = g_list_append( files_to_open, full_path ); g_hash_table_replace( file_list_hash, app_desktop, files_to_open ); app_desktop = NULL; vfs_mime_type_unref( mime_type ); } else { files_to_open = g_list_append( files_to_open, full_path ); } } } if ( file_list_hash ) { g_hash_table_foreach( file_list_hash, open_files_with_each_app, file_browser ); g_hash_table_foreach( file_list_hash, free_file_list_hash, NULL ); g_hash_table_destroy( file_list_hash ); } else if ( files_to_open && app_desktop ) { open_files_with_app( cwd, files_to_open, app_desktop, file_browser ); g_list_foreach( files_to_open, ( GFunc ) g_free, NULL ); g_list_free( files_to_open ); } if ( new_dir ) { /* ptk_file_browser_chdir( file_browser, new_dir, TRUE ); */ if ( G_LIKELY( file_browser ) ) { ptk_file_browser_emit_open( file_browser, full_path, PTK_OPEN_DIR ); } g_free( new_dir ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -