これが「適切な」方法であるかどうかはわかりませんが、これが私が行う方法です。アプリケーションウィンドウをユーザーデータパラメータとしてアクションコールバックに渡します。次に、ウィンドウでフォーカスされているウィジェットを見つけ、それが理にかなっている場合は、コピーコマンドをそのウィジェットに渡します(つまり、フォーカスされたウィジェットは、あなたが言うようにテキストエントリです)。それが意味をなさない場合は、ウィンドウの「デフォルト」テキストビューからコピーします。
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
ますが、ここで問題を複雑にしたくありませんでした。)