📄 callbacks.c
字号:
{ gtk_file_filter_add_pattern (filter, Suffix->data); Suffix = g_list_next ( Suffix ); } gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (File_Selector), filter); Suffix = g_list_first ( ArchiveSuffix ); while ( Suffix != NULL ) { if ( Suffix->data != "" ) //To avoid double filtering when opening the archive { filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, Suffix->data ); gtk_file_filter_add_pattern (filter, Suffix->data ); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (File_Selector), filter); } Suffix = g_list_next ( Suffix ); } if ( mode == "new" ) { hbox = gtk_hbox_new (FALSE, 12); gtk_box_pack_start (GTK_BOX (hbox),gtk_label_new (_("Archive type:")),FALSE, FALSE, 0); combo_box = gtk_combo_box_new_text (); FilterToolTip = gtk_tooltips_new(); gtk_tooltips_set_tip (FilterToolTip,combo_box, _("Choose the archive type to create") , NULL); Name = g_list_first ( ArchiveType ); while ( Name != NULL ) { if (Name->data != ".tgz" && Name->data != ".rpm" ) gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), Name->data ); Name = g_list_next ( Name ); } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0); gtk_box_pack_start (GTK_BOX (hbox), combo_box, TRUE, TRUE, 0); check_button = gtk_check_button_new_with_label (_("Add the archive extension to the filename")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_button),TRUE); gtk_box_pack_start (GTK_BOX (hbox), check_button, TRUE, TRUE, 0); gtk_widget_show_all (hbox); gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (File_Selector), hbox); } gtk_window_set_modal (GTK_WINDOW (File_Selector),TRUE); response = gtk_dialog_run (GTK_DIALOG (File_Selector)); CurrentFolder = gtk_file_chooser_get_current_folder ( GTK_FILE_CHOOSER (File_Selector) ); if (response == GTK_RESPONSE_ACCEPT) { path = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER (File_Selector) ); if ( mode == "new") { ComboArchiveType = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo_box)); if (strcmp ( ComboArchiveType,".arj") == 0) CurrentArchiveType = 10; else if (strcmp ( ComboArchiveType,".bz2") == 0) CurrentArchiveType = 0; else if (strcmp ( ComboArchiveType,".gz") == 0) CurrentArchiveType = 1; else if (strcmp ( ComboArchiveType,".rar") == 0) CurrentArchiveType = 2; else if (strcmp ( ComboArchiveType,".tar") == 0) CurrentArchiveType = 3; else if (strcmp ( ComboArchiveType,".tar.bz2") == 0) CurrentArchiveType = 4; else if (strcmp ( ComboArchiveType,".tar.gz") == 0) CurrentArchiveType = 5; else if (strcmp ( ComboArchiveType,".jar") == 0) CurrentArchiveType = 6; else if (strcmp ( ComboArchiveType,".zip") == 0) CurrentArchiveType = 7; else if (strcmp ( ComboArchiveType,".rpm") == 0) CurrentArchiveType = 8; else if (strcmp ( ComboArchiveType,".7z") == 0) CurrentArchiveType = 9; if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_button) ) ) { if ( ! g_str_has_suffix ( path , ComboArchiveType ) ) { gtk_widget_destroy (File_Selector); return g_strconcat ( path, ComboArchiveType , NULL); } } } gtk_widget_destroy (File_Selector); return ( path ); } else if ( (response == GTK_RESPONSE_CANCEL) || (response == GTK_RESPONSE_DELETE_EVENT) ) { gtk_widget_destroy (File_Selector); return NULL; }}gboolean isTar ( FILE *ptr ){ unsigned char magic[7]; fseek ( ptr, 0 , SEEK_SET ); if ( fseek ( ptr , 257 , SEEK_CUR) < 0 ) return FALSE; if ( fread ( magic, 1, 7, ptr ) == 0 ) return FALSE; if ( memcmp ( magic,"\x75\x73\x74\x61\x72\x00\x30",7 ) == 0 || memcmp (magic,"\x75\x73\x74\x61\x72\x20\x20",7 ) == 0) return TRUE; else return FALSE;}int DetectArchiveType ( gchar *path ){ FILE *dummy_ptr = NULL; int xx = -1; unsigned char magic[6]; dummy_ptr = fopen ( path , "r" ); if (dummy_ptr == NULL) { gchar *msg = g_strdup_printf (_("Can't open archive %s:\n%s") , path , strerror (errno) ); response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow) , GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, msg); g_free (msg); return xx; } if ( fread ( magic, 1, 6, dummy_ptr ) == 0 ) { fclose ( dummy_ptr); response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,strerror(errno)); return xx; } if ( memcmp ( magic,"\x50\x4b\x03\x04",4 ) == 0 || memcmp ( magic,"\x50\x4b\x05\x06",4 ) == 0 ) { PasswordProtectedArchive = DetectPasswordProtectedArchive ( 7 , dummy_ptr , magic ); xx = 7; // zip } else if ( memcmp ( magic,"\x60\xea",2 ) == 0 ) { PasswordProtectedArchive = DetectPasswordProtectedArchive ( 10 , dummy_ptr , magic ); xx = 10; // arj } else if ( memcmp ( magic,"\x52\x61\x72\x21",4 ) == 0 ) xx = 2; // rar else if ( memcmp ( magic,"\x42\x5a\x68",3 ) == 0 ) xx = 0; // bzip2 else if ( memcmp ( magic,"\x1f\x8b\x08",3 ) == 0) xx = 1; // gz else if ( memcmp ( magic,"\xed\xab\xee\xdb",4 ) == 0) xx = 8; // rpm else if ( memcmp ( magic,"\x37\x7a\xbc\xaf\x27\x1c",6 ) == 0 ) xx = 9; // 7zip else if ( isTar ( dummy_ptr ) ) xx = 3; else { gtk_window_set_title ( GTK_WINDOW (MainWindow) , "Xarchiver " VERSION ); response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, _("The format of this archive is not recognized !") ); } fclose ( dummy_ptr ); return xx;}gboolean DetectPasswordProtectedArchive ( int type , FILE *stream , unsigned char magic[6] ){ //ZIP unsigned int fseek_offset; unsigned short int password_flag; unsigned int compressed_size; unsigned int uncompressed_size; unsigned short int file_length; unsigned short int extra_length; //ARJ unsigned char sig[2]; unsigned short int basic_header_flag; unsigned short int basic_header_size; unsigned short int extended_header_size; unsigned int basic_header_CRC; unsigned int extended_header_CRC; unsigned char arj_flag; if ( type == 7 ) { while ( memcmp ( magic,"\x50\x4b\x03\x04",4 ) == 0 || memcmp ( magic,"\x50\x4b\x05\x06",4 ) == 0 ) { fread ( &password_flag, 1, 2, stream ); if (( password_flag & ( 1<<0) ) > 0) return TRUE; fseek (stream,10,SEEK_CUR); fread (&compressed_size,1,4,stream); fread (&uncompressed_size,1,4,stream); fread (&file_length,1,2,stream); fread (&extra_length,1,2,stream); fseek_offset = compressed_size + file_length + extra_length; fseek (stream , fseek_offset , SEEK_CUR); fread (magic , 1 , 4 , stream); fseek ( stream , 2 , SEEK_CUR); } } else if ( type == 10) { fseek (stream , magic[2]+magic[3] , SEEK_CUR); fseek (stream , 2 , SEEK_CUR); fread (&extended_header_size,1,2,stream); if (extended_header_size != 0) fread (&extended_header_CRC,1,4,stream); fread (&sig,1,2,stream); while ( memcmp (sig,"\x60\xea",2) == 0) { fread ( &basic_header_size , 1 , 2 , stream ); if ( basic_header_size == 0 ) break; fseek ( stream , 4 , SEEK_CUR); fread (&arj_flag,1,1,stream); if ((arj_flag & ( 1<<0) ) > 0) return TRUE; fseek ( stream , 7 , SEEK_CUR); fread (&compressed_size,1,4,stream); fseek ( stream , basic_header_size - 16 , SEEK_CUR); fread (&basic_header_CRC,1,4,stream); fread (&extended_header_size,1,2,stream); if (extended_header_size != 0) fread (&extended_header_CRC,1,4,stream); fseek ( stream , compressed_size , SEEK_CUR); fread (&sig,1,2,stream); } } return FALSE;}gulong SpawnAsyncProcess (const gchar *command , gboolean ExitStatusFlag , gboolean input){ GError *error = NULL; gchar **argv; int argcp; g_shell_parse_argv ( command , &argcp , &argv , NULL); if ( ! g_spawn_async_with_pipes ( NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &child_pid, input ? &input_fd : NULL, &output_fd, &error_fd, &error) ) { response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, error->message); g_error_free (error); g_strfreev ( argv ); return FALSE; } g_strfreev ( argv ); return (gulong) child_pid;}GIOChannel *SetIOChannel (gint fd, GIOCondition cond, GIOFunc func, gpointer data){ GIOChannel *ioc; ioc = g_io_channel_unix_new ( fd ); g_io_add_watch (ioc, cond, func, data); g_io_channel_set_encoding (ioc, "ISO8859-1" , NULL); g_io_channel_set_flags ( ioc , G_IO_FLAG_NONBLOCK , NULL ); return ioc;}GIOChannel *SetIOChannelEncondingNULL (gint fd, GIOCondition cond, GIOFunc func, gpointer data){ GIOChannel *ioc; ioc = g_io_channel_unix_new ( fd ); g_io_add_watch (ioc, cond, func, data); g_io_channel_set_encoding (ioc, NULL , NULL); return ioc;}/* These three functions are from File-Roller code */char *eat_spaces (char *line){ if (line == NULL) return NULL; while ((*line == ' ') && (*line != 0)) line++; return line;}char *get_last_field (char *line,int last_field){ char *field; int i; if (line == NULL) return NULL; last_field--; field = eat_spaces (line); for (i = 0; i < last_field; i++) { if (field == NULL) return NULL; field = strchr (field, ' '); field = eat_spaces (field); } //The following line is mine, I replace the \n with the null terminated if (field != NULL) field [ strlen(field) -1 ] = '\000'; return field;}char **split_line (char *line,int n_fields){ char **fields; char *scan, *field_end; int i; fields = g_new0 (char *, n_fields + 1); fields[n_fields] = NULL; scan = eat_spaces (line); for (i = 0; i < n_fields; i++) { if (scan == NULL) { fields[i] = NULL; continue; } field_end = strchr (scan, ' '); //The following line is mine, I added the case when the last field ends with a newline if (field_end == NULL) field_end = strchr (scan, '\n'); if (field_end != NULL) { fields[i] = g_strndup (scan, field_end - scan); scan = eat_spaces (field_end); } } return fields;}/* End code from File-Roller */void RemoveColumnsListStore(){ SetButtonState (1,1,0,0,0); gtk_window_set_title ( GTK_WINDOW (MainWindow) , "Xarchiver " VERSION ); GList *columns = gtk_tree_view_get_columns ( GTK_TREE_VIEW (treeview1) ); while (columns != NULL) { gtk_tree_view_remove_column (GTK_TREE_VIEW (treeview1) , columns->data); columns = columns->next; } g_list_free (columns);}void EmptyTextBuffer (){ if (textbuf != NULL) { gtk_text_buffer_get_start_iter (textbuf,&start); gtk_text_buffer_get_end_iter (textbuf,&end); gtk_text_buffer_delete (textbuf,&start,&end); gtk_text_buffer_get_start_iter(textbuf, &enditer); }}void CreateListStore ( int nc, gchar *columns_names[] , GType columns_types[]){ liststore = gtk_list_store_newv ( nc , (GType *)columns_types); gtk_tree_view_set_model ( GTK_TREE_VIEW (treeview1), GTK_TREE_MODEL (liststore) ); gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW (treeview1) , TRUE ); GtkTreeSelection *sel = gtk_tree_view_get_selection( GTK_TREE_VIEW (treeview1) ); gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); g_signal_connect ((gpointer) sel, "changed", G_CALLBACK (Activate_buttons), NULL); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview1)); g_object_ref(model); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview1), NULL); for (x = 0; x <= nc-1; x++) { renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ( columns_names[x],renderer,"text",x,NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_sort_column_id (column, x); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview1), column); }}void ShowShellOutput (){ if (OutputWindow != NULL) { gtk_window_present ( GTK_WINDOW (OutputWindow) ); return; } OutputWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (OutputWindow, "OutputWindow"); gtk_window_set_title (GTK_WINDOW (OutputWindow), _("Shell output") ); gtk_window_set_position (GTK_WINDOW (OutputWindow), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(OutputWindow), 450, 300); gtk_window_set_destroy_with_parent (GTK_WINDOW (OutputWindow), TRUE); g_signal_connect (G_OBJECT (OutputWindow), "delete-event", G_CALLBACK (gtk_widget_hide), &OutputWindow); vbox = gtk_vbox_new ( FALSE, 2 ); scrollwin = gtk_scrolled_window_new ( NULL,NULL ); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW( scrollwin ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -