Вам понадобится дополнительный C-код, но не очень. В этом примере я предполагаю, что вы используете GtkAction
s для своих пунктов меню, но если это не так, решение должно быть похожим.
Сначала выполните обратные вызовы для операций вырезания, копирования и вставки в Glade. Когда вы подключаете сигналы, передайте некоторую структуру данных, содержащую как минимум указатели, на действия вырезания, копирования и вставки, а также на представление текста в качестве пользовательских данных.
void
on_cut(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "cut-clipboard", NULL);
gtk_action_set_sensitive(data->paste_action, TRUE);
}
void
on_copy(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "copy-clipboard", NULL);
gtk_action_set_sensitive(data->paste_action, TRUE);
}
void
on_paste(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "paste-clipboard", NULL);
}
Далее подключитесь к сигналу notify::has-selection
вашего GtkTextBuffer
:
void
on_has_selection_notify(GtkTextBuffer *buffer, GParamSpec *pspec, SomeStruct *data)
{
gboolean has_selection = gtk_text_buffer_get_has_selection(buffer);
gtk_action_set_sensitive(data->cut_action, has_selection);
gtk_action_set_sensitive(data->copy_action, has_selection);
}
Чтобы определить начальное состояние действия вставки (в случае, если при запуске приложения в буфере обмена есть текст), при создании интерфейса выполните следующий код:
gtk_action_set_sensitive(data->paste_action,
gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));
Предполагается, что у пользователя нет возможности очистить буфер обмена вручную (большинство программ не позволяют вам сделать это.)
Предостерегающий лектор: код, введенный здесь, не проверен.