LINUX.ORG.RU

Как нынче реализуются cut, copy, past для файлов в файловых менеджерах?


0

2

Собственно общий принцип понятен: когда нажимается cut или copy, то в clipboard помещается путевое имя файла (файлов), когда нажимается past, то из clipboard это имя читается, далее собственно выполняется операция с файлом.

Однако, не понятно, какие используются типы атомов. Залез на freedesktop.org. Всегда хотелось плеваться, глядя на этот сайт. Фиг там что найдешь. Чуда не случилось и сейчас. По данному вопросу там молчок.

Попользовался всякими X-ми утилитами. Вроде как для копирования файлов используется атом x-special/gnome-copyed-files. В буфер судя по всему помещается uri файла (тут тоже вопрос: как туда пишется utf8, например). Но по меньшей мере, есть над чем поработать для первого времени.

Но вот вопрос: как отличается copy от cut? Кроме x-special/gnome-copyed-files других атомов не обнаружил.

Вот из pcmanfm-mod-1.2.4

void ptk_clipboard_cut_or_copy_files( const char* working_dir, GList* files, gboolean copy ) { GtkClipboard * clip = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD ); GtkTargetList* target_list = gtk_target_list_new( NULL, 0 ); GList* target; gint i, n_targets; GtkTargetEntry* targets; GtkTargetPair* pair; GList *l; VFSFileInfo* file; char* file_path; GList* file_list = NULL;

gtk_target_list_add_text_targets( target_list, 0 ); n_targets = g_list_length( target_list->list ) + 2;

targets = g_new0( GtkTargetEntry, n_targets ); target = target_list->list; for ( i = 0; target; ++i, target = g_list_next( target ) ) { pair = ( GtkTargetPair* ) target->data; targets[ i ].target = gdk_atom_name ( pair->target ); } targets[ i ].target = «x-special/gnome-copied-files»; targets[ i + 1 ].target = «text/uri-list»;

gtk_target_list_unref ( target_list );

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 ); file_list = g_list_prepend( file_list, file_path ); }

gtk_clipboard_set_with_data ( clip, targets, n_targets, clipboard_get_data, clipboard_clean_data, NULL );

g_free( targets );

clipboard_file_list = file_list; clipboard_action = copy ? GDK_ACTION_COPY : GDK_ACTION_MOVE; }

ilovewindows ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.