2011-11-09 7 views
1

私のバーコードスキャナは、数字のラインを吹くキーボードのように機能します。私はそれが常に動作するように、私はテキストエントリを使用しないで、私のウィンドウのキープレスイベントに接続します。残念ながら、これは他のテキストエントリにフォーカスがあるときにも生成されます。 AFAIKは、ウィンドウが最初にイベントを受け取るので、ショートカットをチェックしてから、それらを渡します。ウィジェットがウィジェットを処理しない場合、何かがウィンドウに戻って伝播しますか?私はどのようにgtk_window_key_press_event(の要約を貼り付けます他のウィジェットが望んでいないキーボードイベントに対してのみ、どのように動作しますか?

答えて

2

)が動作します。

gboolean 
gtk_window_propagate_key_event (GtkWindow  *window, 
           GdkEventKey  *event) 
{ 
    gboolean handled = FALSE; 

    focus = window->focus_widget; 

    while (!handled) 
    { 
     GtkWidget *parent; 

     handled = gtk_widget_event (focus, event); 
     focus = gtk_widget_get_parent (focus); 
    } 

    return handled; 
} 

static gint 
gtk_window_key_press_event (GtkWidget *widget, 
       GdkEventKey *event) 
{ 
    GtkWindow *window = GTK_WINDOW (widget); 
    gboolean handled = FALSE; 

    /* handle mnemonics and accelerators */ 
    if (!handled) 
    handled = gtk_window_activate_key (window, event); 

    /* handle focus widget key events */ 
    if (!handled) 
    handled = gtk_window_propagate_key_event (window, event); 

    /* Chain up, invokes binding set */ 
    if (!handled) 
    handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_press_event (widget, event); 

    return handled; 
} 

これは基本的に意味:キーはニーモニックのために適切であるかどう

  1. は、参照してください(下線を持っているつまり、ラベル)またはアクセラレータ(GtkAccelGroupから)。

  2. フォーカスされたウィジェットから開始し、コンテナ階層を上って、キー押しを処理するウィジェットがあるかどうかを確認してください。

  3. キー押しをGtkWindowの親クラスに渡します。それを扱う最も近い親はGtkWidgetであり、それはgtk_binding_entry_add()からのバインディングを扱うことによってそうする。

あなたは単にあなたにそのウィンドウがフォーカスされたときに起こる すべてキー押下を与えるのGtkWindowのキープレスイベント信号に()g_signal_connectをやって、言ったように。

g_signal_connect_after()を代わりに実行してください。これにより、上記のシーケンスにもう一つのフォールバックが効果的に追加されます。つまり、「デフォルトのシグナルハンドラを実行した後でシグナルハンドラを実行する」ということです。 すべて未処理のキー押し(たとえば、あなたのアプリが処理しないファンクションキーを押した場合など)を捕まえることになるので、ハンドラに到達する唯一のものがバーコードスキャナから来ていると仮定しないでください。

+0

は、同様に他のすべてのハンドラからTRUEを返すことを忘れないでください、このフィルタリングに役立つだろうと言っ送信するようにバーコードスキャナを設定してみてください。 – user877329

0

は、バーコードの番号のALTの数字(または類似)のではなく数字が、これは

+0

デフォルトのスキャナはALTに設定されておらず、エンドユーザはスキャナの設定方法を知っていません。バーコードと他の入力とを区別するためのタイミングとチェックサムに頼っています。 – Tobias

関連する問題