Работа с буфером обмена в GTK+

Буфер обмена (clipboard)- это часть памяти, в которой хранится то, что мы копируем. Рассмотрим как работать с буфером обмена в GTK+.В GTK+ уже есть встроенный виджет для работы с буфером обмена:

GtkClipboard *clipboard;

Для работы с этим виджетом существуют десятки функций, но мы разберем простейший случай: у нас есть виджет для однострочного ввода текста (GtkEntry) и нам нужно выполнить три простых функции:

  • Вырезать,
  • Копировать,
  • Вставить.

Напишем простую программу:

В этой программе мы используем текстовый виджет (text), три кнопки для работы с буфером обмена (bcopy, bcut, bpaste) и кнопку выхода (bquit). Все эти виджеты разместим в вертикальном контейнере vbox.

Основные действия для работы с буфером обмена следующие:

  1. Создать виджет для буфера обмена: GtkClipboard *clipboard;
  2. Связать виджет с системным буфером обмена: clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
  3. Связать нажатие кнопки с вызовом соотвествующей функции. Например, для копирования текстового виджета в буфер обмена используется функция 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

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

➤