質問

私はpygtkを使用していますが、Control+Cを処理して特別なコピーアクションを行うこともありますが、GTKに処理することもあります。たとえば、オブジェクトが使用可能な場合は、オブジェクトをクリップボードに配置するか、テキストエントリでコントロール+Cを通常の方法で使用します。

現在、私は「C」に関連付けられたアクショングループを持っていますが、それは偽りを返しても、常にキーストロークを食べます。 ActionGroupを削除すると、常にテキスト領域で機能します。 ActionGroupを追加すると、常に処理し、コピーがテキスト領域で機能しません。

メニューにコントロール+Cが表示され、キーストロークを処理する適切な方法は何ですか?

役に立ちましたか?

解決

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top