3

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 が何らかの形ですべてのキーボード入力または何かを消費している可能性はありますか?

4

1 に答える 1

2

デフォルトでは、矢印キーを使用して行列のボタンをナビゲートし、スペース キーでボタンをアクティブにします。

これは、TAB でトラバースされるウィジェットが TAB グループに含まれている必要があるためです。Row Column ウィジェットは TAB グループにありますが、プッシュ ボタンはありません。TAB キーは行列ウィジェットを選択し、最初のプッシュ ボタンを選択します。その後、矢印キーを使用して他のボタンに移動できます。

ボタンをアクティブにするためのデフォルトのキーはスペース キーです。別のキーを使用するには、デフォルトのイベント変換テーブルをオーバーライドする必要があります。

これは、タブを使用してトラバースし、ボタンをアクティブにするために戻るプログラムの例です。

#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>

int main(int argc, char* argv[]) {
  XtSetLanguageProc(NULL, NULL, NULL);
  XtAppContext app;

  Widget toplevel = XtVaOpenApplication(&app, "traverse", NULL, 0, &argc, argv, NULL,
                                        sessionShellWidgetClass, NULL);

  Widget main_w = XmCreateMainWindow (toplevel, "main_w", NULL, 0);
  Widget mainrc = XtVaCreateWidget("mainrc", xmRowColumnWidgetClass, main_w,
                   XmNpacking, XmPACK_COLUMN,
                   XmNnumColumns, 3,
                   XmNentryBorder, 1,
                   NULL);
  for (int i=0; i<9; i++) {
    Widget b = XtVaCreateWidget("button", xmPushButtonWidgetClass, mainrc,
                XmNnavigationType, XmTAB_GROUP, // Make button a Tab Group
                NULL);
    // Specify Return key to activate button
    XtOverrideTranslations (b, XtParseTranslationTable ("<Key>Return: ArmAndActivate()"));
    XtManageChild(b);
  } 

  XtManageChild(mainrc);
  XtManageChild(main_w);
  XtRealizeWidget(toplevel);
  XtAppMainLoop(app);

  return 0;
}
于 2014-02-16T17:50:52.050 に答える