void ptk_clipboard_copy_as_text( const char* working_dir, GList* files ) //MOD added { // aka copy path GtkClipboard* clip = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD ); GtkClipboard* clip_primary = gtk_clipboard_get( GDK_SELECTION_PRIMARY ); GList *l; VFSFileInfo* file; char* file_path; char* file_text; char* str; char* quoted; file_text = g_strdup( "" ); for ( l = files; l; l = l->next ) { file = ( VFSFileInfo* ) l->data; file_path = g_build_filename( working_dir, vfs_file_info_get_name( file ), NULL ); quoted = bash_quote( file_path ); str = file_text; file_text = g_strdup_printf( "%s %s", str, quoted ); g_free( str ); g_free( quoted ); g_free( file_path ); } gtk_clipboard_set_text ( clip, file_text , -1 ); gtk_clipboard_set_text ( clip_primary, file_text , -1 ); g_free( file_text ); }
void on_dlg_response ( GtkDialog *dialog, gint response_id, gpointer user_data ) { FilePropertiesDialogData * data; PtkFileTask* task; gboolean mod_change; uid_t uid = -1; gid_t gid = -1; const char* owner_name; const char* group_name; int i; GList* l; GList* file_list; char* file_path; GtkWidget* ask_recursive; VFSFileInfo* file; GtkAllocation allocation; gtk_widget_get_allocation ( GTK_WIDGET( dialog ), &allocation ); int width = allocation.width; int height = allocation.height; if ( width && height ) { char* str = g_strdup_printf( "%d", width ); xset_set( "app_dlg", "s", str ); g_free( str ); str = g_strdup_printf( "%d", height ); xset_set( "app_dlg", "z", str ); g_free( str ); } data = ( FilePropertiesDialogData* ) g_object_get_data( G_OBJECT( dialog ), "DialogData" ); if ( data ) { if ( data->update_label_timer ) g_source_remove( data->update_label_timer ); data->cancel = TRUE; if ( data->calc_size_thread ) g_thread_join( data->calc_size_thread ); if ( response_id == GTK_RESPONSE_OK ) { // change file dates char* cmd = NULL; char* quoted_time; char* quoted_path; const char* new_mtime = gtk_entry_get_text( data->mtime ); if ( !( new_mtime && new_mtime[0] ) || !g_strcmp0( data->orig_mtime, new_mtime ) ) new_mtime = NULL; const char* new_atime = gtk_entry_get_text( data->atime ); if ( !( new_atime && new_atime[0] ) || !g_strcmp0( data->orig_atime, new_atime ) ) new_atime = NULL; if ( ( new_mtime || new_atime ) && data->file_list ) { GString* gstr = g_string_new( NULL ); for ( l = data->file_list; l; l = l->next ) { file_path = g_build_filename( data->dir_path, ((VFSFileInfo*)l->data)->name, NULL ); quoted_path = bash_quote( file_path ); g_string_append_printf( gstr, " %s", quoted_path ); g_free( file_path ); g_free( quoted_path ); } if ( new_mtime ) { quoted_time = bash_quote( new_mtime ); cmd = g_strdup_printf( "touch --no-dereference --no-create -m -d %s%s", quoted_time, gstr->str ); } if ( new_atime ) { quoted_time = bash_quote( new_atime ); quoted_path = cmd; // temp str cmd = g_strdup_printf( "%s%stouch --no-dereference --no-create -a -d %s%s", cmd ? cmd : "", cmd ? "\n" : "", quoted_time, gstr->str ); g_free( quoted_path ); } g_free( quoted_time ); g_string_free( gstr, TRUE ); if ( cmd ) { task = ptk_file_exec_new( _("Change File Date"), "/", GTK_WIDGET( dialog ), NULL ); task->task->exec_command = cmd; task->task->exec_sync = TRUE; task->task->exec_export = FALSE; task->task->exec_show_output = TRUE; task->task->exec_show_error = TRUE; ptk_file_task_run( task ); } } /* Set default action for mimetype */ GtkWidget* open_with; if( ( open_with = (GtkWidget*)g_object_get_data( G_OBJECT(dialog), "open_with" ) ) ) { GtkTreeModel* model = gtk_combo_box_get_model( GTK_COMBO_BOX(open_with) ); GtkTreeIter it; if( model && gtk_combo_box_get_active_iter( GTK_COMBO_BOX(open_with), &it ) ) { char* action; gtk_tree_model_get( model, &it, 2, &action, -1 ); if( action ) { file = ( VFSFileInfo* ) data->file_list->data; VFSMimeType* mime = vfs_file_info_get_mime_type( file ); vfs_mime_type_set_default_action( mime, action ); vfs_mime_type_unref( mime ); g_free( action ); } } } /* Check if we need chown */ owner_name = gtk_entry_get_text( data->owner ); if ( owner_name && *owner_name && (!data->owner_name || strcmp( owner_name, data->owner_name ) ) ) { uid = uid_from_name( owner_name ); if ( uid == -1 ) { ptk_show_error( GTK_WINDOW( dialog ), _("Error"), _( "Invalid User" ) ); return ; } } group_name = gtk_entry_get_text( data->group ); if ( group_name && *group_name && (!data->group_name || strcmp( group_name, data->group_name ) ) ) { gid = gid_from_name( group_name ); if ( gid == -1 ) { ptk_show_error( GTK_WINDOW( dialog ), _("Error"), _( "Invalid Group" ) ); return ; } } for ( i = 0; i < N_CHMOD_ACTIONS; ++i ) { if ( gtk_toggle_button_get_inconsistent( data->chmod_btns[ i ] ) ) { data->chmod_states[ i ] = 2; /* Don't touch this bit */ } else if ( data->chmod_states[ i ] != gtk_toggle_button_get_active( data->chmod_btns[ i ] ) ) { mod_change = TRUE; data->chmod_states[ i ] = gtk_toggle_button_get_active( data->chmod_btns[ i ] ); } else /* Don't change this bit */ { data->chmod_states[ i ] = 2; } } if ( uid != -1 || gid != -1 || mod_change ) { file_list = NULL; for ( l = data->file_list; l; l = l->next ) { file = ( VFSFileInfo* ) l->data; file_path = g_build_filename( data->dir_path, vfs_file_info_get_name( file ), NULL ); file_list = g_list_prepend( file_list, file_path ); } task = ptk_file_task_new( VFS_FILE_TASK_CHMOD_CHOWN, file_list, NULL, GTK_WINDOW(gtk_widget_get_parent( GTK_WIDGET( dialog ) )), NULL ); //MOD ptk_file_task_set_recursive( task, gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( data->recurse ) ) ); /* for ( l = data->file_list; l; l = l->next ) { file = ( VFSFileInfo* ) l->data; if ( vfs_file_info_is_dir( file ) ) { ask_recursive = gtk_message_dialog_new( GTK_WINDOW( data->dlg ), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _( "Do you want to recursively apply these changes to all files and sub-folders?" ) ); ptk_file_task_set_recursive( task, ( GTK_RESPONSE_YES == gtk_dialog_run( GTK_DIALOG( ask_recursive ) ) ) ); gtk_widget_destroy( ask_recursive ); break; } } */ if ( mod_change ) { /* If the permissions of file has been changed by the user */ ptk_file_task_set_chmod( task, data->chmod_states ); } /* For chown */ ptk_file_task_set_chown( task, uid, gid ); ptk_file_task_run( task ); /* * This file list will be freed by file operation, so we don't * need to do this. Just set the pointer to NULL. */ data->file_list = NULL; } } g_free( data->owner_name ); g_free( data->group_name ); g_free( data->orig_mtime ); g_free( data->orig_atime ); /* *NOTE: File operation chmod/chown will free the list when it's done, *and we only need to free it when there is no file operation applyed. */ g_slice_free( FilePropertiesDialogData, data ); } gtk_widget_destroy( GTK_WIDGET( dialog ) ); }