Буфер обмена (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);
Полный список стандартных иконок можно посмотреть здесь.
Текст программы:
#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
Школа программирования ProgTips 

