Буфер обмена (clipboard)- это часть памяти, в которой хранится то, что мы копируем. Рассмотрим как работать с буфером обмена в GTK+.В GTK+ уже есть встроенный виджет для работы с буфером обмена:
GtkClipboard *clipboard;
Для работы с этим виджетом существуют десятки функций, но мы разберем простейший случай: у нас есть виджет для однострочного ввода текста (GtkEntry) и нам нужно выполнить три простых функции:
- Вырезать,
- Копировать,
- Вставить.
Напишем простую программу:
В этой программе мы используем текстовый виджет (text), три кнопки для работы с буфером обмена (bcopy, bcut, bpaste) и кнопку выхода (bquit). Все эти виджеты разместим в вертикальном контейнере vbox.
Основные действия для работы с буфером обмена следующие:
- Создать виджет для буфера обмена: GtkClipboard *clipboard;
- Связать виджет с системным буфером обмена: clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
- Связать нажатие кнопки с вызовом соотвествующей функции. Например, для копирования текстового виджета в буфер обмена используется функция gtk_editable_copy_clipboard(text);
В этой программе для украшения на кнопках добавлены стандартные иконки GTK+
bcopy = gtk_button_new_from_stock (GTK_STOCK_COPY);
Полный список стандартных иконок можно посмотреть здесь.
Текст программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <gtk/gtk.h> GtkWidget *win, *vbox, *bcopy, *bcut, *bpaste, *bquit; GtkEntry *text; GtkClipboard *clipboard; void ClipCopy() { gtk_editable_copy_clipboard(text); } void ClipCut() { gtk_editable_cut_clipboard(text); } void ClipPaste() { gtk_editable_paste_clipboard(text); } int main (int argc, char *argv[]) { gtk_init (&argc, &argv); /* Создаем основное окно */ win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width (GTK_CONTAINER (win), 8); gtk_window_set_title (GTK_WINDOW (win), "Clipboard"); gtk_window_set_default_size (GTK_WINDOW (win), 300, 300); gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); gtk_widget_realize (win); g_signal_connect (win, "destroy", gtk_main_quit, NULL); /* Создаем вертикальный контейнер */ vbox = gtk_vbox_new (TRUE, 6); gtk_container_add (GTK_CONTAINER (win), vbox); // Поле ввода text = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (text), 50); gtk_entry_set_text (GTK_ENTRY (text), "Hello!"); gtk_box_pack_start (GTK_BOX (vbox), text, TRUE, TRUE, 0); // Кнопка "Копировать" bcopy = gtk_button_new_from_stock (GTK_STOCK_COPY); g_signal_connect (bcopy, "clicked", G_CALLBACK (ClipCopy), NULL); gtk_box_pack_start (GTK_BOX (vbox), bcopy, TRUE, TRUE, 0); // Кнопка "Вырезать" bcut = gtk_button_new_from_stock (GTK_STOCK_CUT); g_signal_connect (bcut, "clicked", G_CALLBACK (ClipCut), (gpointer) win); gtk_box_pack_start (GTK_BOX (vbox), bcut, TRUE, TRUE, 0); // Кнопка "Вставить" bpaste = gtk_button_new_from_stock (GTK_STOCK_PASTE); g_signal_connect (bpaste, "clicked", G_CALLBACK (ClipPaste), (gpointer) win); gtk_box_pack_start (GTK_BOX (vbox), bpaste, TRUE, TRUE, 0); // Кнопка "Выход" bquit = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (bquit, "clicked", gtk_main_quit, NULL); gtk_box_pack_start (GTK_BOX (vbox), bquit, TRUE, TRUE, 0); clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); // Отображаем все виджеты и запускаем основной цикл gtk_widget_show_all(win); gtk_main(); return 0; } |
С другими виджетами общая схема работы остается такой же. Например, для виджета GtkText нужно использовать следующие функции:
- gtk_text_buffer_copy_clipboard
- gtk_text_buffer_cut_clipboard
- gtk_text_buffer_paste_clipboard