📄 ptk-file-misc.c
字号:
/** C Implementation: ptk-file-misc** Description: Miscellaneous GUI-realated functions for files*** Author: Hong Jen Yee (PCMan) <pcman.tw (AT) gmail.com>, (C) 2006** Copyright: See COPYING file that comes with this distribution**/#include "ptk-file-misc.h"#include <glib.h>#include "glib-mem.h"#include <string.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <unistd.h>#include <glib/gi18n.h>#include "ptk-utils.h"#include "ptk-file-task.h"#include "vfs-file-task.h"#include "file-properties.h"#include "ptk-input-dialog.h"#include "ptk-file-browser.h"#include "vfs-app-desktop.h"#include "vfs-execute.h"void ptk_delete_files( GtkWindow* parent_win, const char* cwd, GList* sel_files ){ GtkWidget * dlg; gchar* file_path; gint ret; GList* sel; VFSFileInfo* file; PtkFileTask* task = NULL; GList* file_list; if ( ! sel_files ) return ; dlg = gtk_message_dialog_new( parent_win, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _( "Really delete selected files?" ) ); ret = gtk_dialog_run( GTK_DIALOG( dlg ) ); gtk_widget_destroy( dlg ); if ( ret != GTK_RESPONSE_YES ) return ; file_list = NULL; for ( sel = sel_files; sel; sel = g_list_next( sel ) ) { file = ( VFSFileInfo* ) sel->data; file_path = g_build_filename( cwd, vfs_file_info_get_name( file ), NULL ); file_list = g_list_prepend( file_list, file_path ); } /* file_list = g_list_reverse( file_list ); */ task = ptk_file_task_new( VFS_FILE_TASK_DELETE, file_list, NULL, GTK_WINDOW( parent_win ) ); ptk_file_task_run( task );}static void select_file_name_part( GtkEntry* entry ){ GtkEditable * editable = GTK_EDITABLE( entry ); const char* file_name = gtk_entry_get_text( entry ); const char* dot; int pos; if ( !file_name[ 0 ] || file_name[ 0 ] == '.' ) return ; /* FIXME: Simply finding '.' usually gets wrong filename suffix. */ dot = g_utf8_strrchr( file_name, -1, '.' ); if ( dot ) { pos = g_utf8_pointer_to_offset( file_name, dot ); gtk_editable_select_region( editable, 0, pos ); }}void ptk_rename_file( GtkWindow* parent_win, const char* cwd, VFSFileInfo* file ){ GtkWidget * input_dlg; GtkLabel* prompt; GList* files; char* ufile_name; char* file_name; char* from_path; char* to_path; if ( !cwd || !file ) return ; input_dlg = ptk_input_dialog_new( _( "Rename File" ), _( "Please input new file name:" ), vfs_file_info_get_disp_name( file ), parent_win ); gtk_window_set_default_size( GTK_WINDOW( input_dlg ), 360, -1 ); /* Without this line, selected region in entry cannot be set */ gtk_widget_show( input_dlg ); if ( ! vfs_file_info_is_dir( file ) ) select_file_name_part( GTK_ENTRY( ptk_input_dialog_get_entry( GTK_WIDGET( input_dlg ) ) ) ); while ( gtk_dialog_run( GTK_DIALOG( input_dlg ) ) == GTK_RESPONSE_OK ) { prompt = GTK_LABEL( ptk_input_dialog_get_label( input_dlg ) ); ufile_name = ptk_input_dialog_get_text( input_dlg ); file_name = g_filename_from_utf8( ufile_name, -1, NULL, NULL, NULL ); g_free( ufile_name ); if ( file_name ) { from_path = g_build_filename( cwd, vfs_file_info_get_name( file ), NULL ); to_path = g_build_filename( cwd, file_name, NULL ); if ( g_file_test( to_path, G_FILE_TEST_EXISTS ) ) { gtk_label_set_text( prompt, _( "The file name you specified has existed.\n" "Please input a new one:" ) ); } else { if ( 0 == rename( from_path, to_path ) ) break; else { gtk_label_set_text( prompt, strerror( errno ) ); } } g_free( from_path ); g_free( to_path ); } else { gtk_label_set_text( prompt, _( "The file name you specified has existed.\n" "Please input a new one:" ) ); } } gtk_widget_destroy( input_dlg );}void ptk_create_new_file( GtkWindow* parent_win, const char* cwd, gboolean create_folder ){ gchar * full_path; gchar* ufile_name; gchar* file_name; GtkLabel* prompt; int result; GtkWidget* dlg; if ( create_folder ) { dlg = ptk_input_dialog_new( _( "New Folder" ), _( "Input a name for the new folder:" ), _( "New Folder" ), parent_win ); } else { dlg = ptk_input_dialog_new( _( "New File" ), _( "Input a name for the new file:" ), _( "New File" ), parent_win ); } while ( gtk_dialog_run( GTK_DIALOG( dlg ) ) == GTK_RESPONSE_OK ) { ufile_name = ptk_input_dialog_get_text( dlg ); if ( g_get_filename_charsets( NULL ) ) file_name = ufile_name; else { file_name = g_filename_from_utf8( ufile_name, -1, NULL, NULL, NULL ); g_free( ufile_name ); } full_path = g_build_filename( cwd, file_name, NULL ); g_free( file_name ); if ( g_file_test( full_path, G_FILE_TEST_EXISTS ) ) { prompt = GTK_LABEL( ptk_input_dialog_get_label( dlg ) ); gtk_label_set_text( prompt, _( "The file name you specified has existed.\n" "Please input a new one:" ) ); g_free( full_path ); continue; } if ( create_folder ) { result = mkdir( full_path, S_IRWXU | S_IRUSR | S_IRGRP ); } else { result = open( full_path, O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH ); if ( result != -1 ) close( result ); } g_free( full_path ); break; } gtk_widget_destroy( dlg ); if ( result == -1 ) ptk_show_error( parent_win, _( "The new file cannot be created!" ) );}void ptk_show_file_properties( GtkWindow* parent_win, const char* cwd, GList* sel_files ){ GtkWidget * dlg; VFSFileInfo* file; char* dir_path = NULL; /* Make a copy of the list */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -