Raspberry Pi で Motif アプリを実行しています。デバッグの目的で、PC で X Windows サーバーを使用し、Putty を介して X を SSH トンネリングしています。アプリを最初に実行すると、入力が SSH シェル/Putty ウィンドウに送られることにも注意してください。アプリ ウィンドウまたはそのボタンの 1 つをクリックすると、Putty ウィンドウへの入力が停止します。
ウィジェットの階層は次のとおりです。
トップ レベル シェル -> スクロール ウィンドウ -> フォーム -> 行列
行列ウィジェットには、任意の数のボタン ウィジェットが含まれます。
最上位シェルで KeyPressMask を使用してイベント ハンドラーを登録しました。それが機能しなかった場合は、RowColumn とすべてのボタンで登録しました。呼び出されることはありません。作成された最初のボタンはフォーカスを取得します (境界線で視覚的に示されています) が、マウスで別のボタンをクリックしたときにのみ変化します (クリックイベントが正常に検出されます)。
最上位シェルで XmNkeyboardFocusPolicy をいじってみました。行列ウィジェットと最初のボタンに対して XtSetKeyboardFocus() を呼び出してみました。ボタンの作成時に XmNtraversalOn を True に指定してみました。何も機能しません。私は完全にイライラしています。
ボタン クリック コールバックが呼び出されたウィジェット (ボタンである必要があります) の XtIsSensitive() の値を報告するようにし、値 1 を報告します (== True だと思います)。
Return キーが押されたときにボタンのアクティブ化をシミュレート/検出できる限り、組み込みの Motif トラバーサル ルーチンを喜んで使用します。また、押されたキーを明示的に検出することで、独自のトラバーサル ルーチンを作成できることも嬉しく思います。私は本当に気にしません。キーボードのボタンを押すだけで簡単にナビゲートできるようにしたいだけです!
私の問題を解決するのを手伝ってくれる人に前もって感謝します。
さらに実験を重ねた結果、アプリを .xinitrc に入れて直接実行すると、トラバーサルが正常に機能し、スペースを押すとボタンが押されたように点滅しますが、実際にはボタンが何もしないことがわかりました。
ただし、xinitrc ファイルを削除し、コンソール プロンプトで「startx」と入力して標準のウィンドウ マネージャーを実行し、ターミナルを開いてコマンド ラインからアプリを実行すると、ネットワーク経由で実行したときと同じ動作が得られます。私のPCのウィンドウマネージャーに。
これは TTY ベースである可能性があります。.xinitrc 経由で実行する場合、アプリの起動時に TTY はありませんが (私は信じています)、コマンド プロンプトから直接起動すると、もちろん TTY があります。TTY が何らかの形ですべてのキーボード入力または何かを消費している可能性はありますか?