您將需要一些額外的C代碼,但不多。對於這個例子,我假設你使用GtkAction
作爲你的菜單項,但如果你不是解決方案應該是類似的。
首先在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);
}
接下來,連接到您的GtkTextBuffer
的notify::has-selection
信號:
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)));
這假設用戶無法手動清除剪貼板(大多數程序不會讓你這樣做。)
注意:這裏鍵入的代碼都是未經測試的。
謝謝,這工作(我不知道起初你可以通過「通知::屬性名稱」連接到一個屬性)。不過,我想我找到了更好的方式來處理剪貼板:連接到剪貼板的「所有者更改」信號。每次剪貼板更新時,該信號似乎都會發出。在我的系統中,這適用於所有我能想到的邊緣情況。 – 2010-01-25 06:42:11