2

私はpygtkを使用しており、control + cを処理して特別なコピーアクションを実行したい場合もあれば、gtkに処理させたい場合もあります。たとえば、オブジェクトが使用可能な場合はクリップボードに配置したいのですが、テキストエントリで通常の方法でcontrol+cを使用できるようにします。

現在、「c」に関連付けられたActionGroupがありますが、Falseを返しても、常にキーストロークを消費します。ActionGroupを削除すると、常にテキスト領域で機能します。ActionGroupを追加すると、常にそれが処理され、テキスト領域でコピーが機能しません。

control + cをメニューに表示し、キーストロークを処理する場合もあれば、テキストウィジェットに分類する場合もありますが、適切な方法は何ですか?

4

1 に答える 1

1

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

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ますが、ここで問題を複雑にしたくありませんでした。)

于 2010-08-14T11:29:51.033 に答える