您将需要一些额外的 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)));
这假设用户无法手动清除剪贴板(大多数程序不允许您这样做。)
警告讲师:此处键入的代码均未经测试。