我不知道这是否是“正确”的方式,但这就是我的做法。我将应用程序窗口作为用户数据参数传递给操作回调。然后我找出窗口中的焦点是哪个小部件,如果这样做有意义,我将复制命令传递给该小部件(即,焦点小部件是您所说的文本条目)。如果这没有意义,那么我从窗口的“默认”文本视图中复制。
void
action_copy(GtkAction *action, gpointer user_data)
{
GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW(user_data));
/* What actually happens depends on the type of widget that is focused */
if(WEBKIT_IS_WEB_VIEW(widget))
webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(widget));
else if((GTK_IS_LABEL(widget) && gtk_label_get_selectable(GTK_LABEL(widget)))
|| GTK_IS_ENTRY(widget) || GTK_IS_TEXT_VIEW(widget))
g_signal_emit_by_name(widget, "copy-clipboard", NULL);
else
g_signal_emit_by_name(/* ...default text view... */, "copy-clipboard", NULL);
}
(获取默认文本视图实际上是通过调用get_default_view()
我的应用程序类上的一个方法来完成的,该类是GtkWindow
; 但我不想在这里使事情复杂化。)