raspberry-pi - 无法为 Motif 应用程序获取键盘输入或遍历

标签 raspberry-pi raspbian motif

我有一个在 Raspberry Pi 上运行的 Motif 应用程序。出于调试目的,我在我的 PC 上使用 X Windows 服务器,并通过 Putty 使用 SSH 隧道 X。可能还值得注意的是,当我最初运行该应用程序时,输入会转到 SSH shell/Putty 窗口。单击应用程序窗口或其按钮之一会停止输入到 Putty 窗口。

小部件层次结构是:

顶层shell->滚动窗口->Form->RowColumn

然后行列小部件包含任意数量的按钮小部件。

我已经在顶级 shell 上使用 KeyPressMask 注册了一个事件处理程序,当它不起作用时,在 RowColumn 和所有按钮上。它永远不会被调用。创建的第一个按钮获得焦点(如其边框直观所示),但只有当我用鼠标单击另一个按钮时才会改变(成功检测到单击事件)。

我尝试在顶层 shell 上摆弄 XmNkeyboardFocusPolicy。我已尝试为行列小部件和第一个按钮调用 XtSetKeyboardFocus()。我尝试在创建按钮时将 XmNtraversalOn 指定为 True。什么都不管用。我非常沮丧。

我已经让按钮点击回调报告它所调用的小部件(应该是按钮)的 XtIsSensitive() 的值,并且它报告值 1(我假设 == True)。

我很乐意使用内置的 Motif 遍历例程,只要我还可以在按下返回键时模拟/检测按钮激活。我也很高兴通过显式检测按下的键来编写自己的遍历例程。我真的不在乎。我只想通过按键盘上的按钮轻松导航!

提前感谢任何可以帮助解决我的问题的人。

经过更多实验后,我发现如果我通过将应用程序放入我的 .xinitrc 中直接运行我的应用程序,那么遍历工作正常,按下空格键会使按钮闪烁,就像按下一样,但实际上不会导致按钮执行任何操作.

但是,如果我通过删除我的 xinitrc 文件并在控制台提示符下键入“startx”来运行标准窗口管理器,然后打开一个终端并从命令行运行我的应用程序,那么我会得到与运行它时相同的行为通过网络连接到我 PC 上的窗口管理器。

我突然想到这可能是基于 TTY 的。当通过 .xinitrc 运行时,应用程序在启动时没有 TTY(我相信),但是当直接从命令提示符启动时,它当然有 TTY。 TTY 会不会以某种方式消耗了所有键盘输入或其他东西?

最佳答案

默认情况下,您使用箭头键在行列中导航按钮并使用空格键激活按钮。

这是因为用TAB遍历的widget必须在TAB组中。 Row Column 小部件位于 TAB 组中,但按钮不在。 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;
}

关于raspberry-pi - 无法为 Motif 应用程序获取键盘输入或遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21810682/

相关文章:

java - GUI 加载后,如何在 Raspberry Pi 上启动时运行程序?

linux - 我在 rc.local 中不断收到错误

java - 为什么 Open 和 Oracle JDK 在 Raspberry pi 上的性能差异如此之大?

c - 如何使用 Motif 编译 '97 C 代码?

c++ - 将 VkMainWindow 保持在底部

Java Swing - Motif L&F 中自定义组合框渲染器中的文本消失

c - 在 Windows 或 Linux 上为 Raspberry Pi 构建 C 可执行文件

python - 如何在 Raspberry Pi 上安装 PhantomJS 以与 Python Selenium 一起使用?

Python 串行读取不工作

nginx - 在 Raspbian 的端口 80 上使用 Nginx 以及在端口 8080 上运行的 Flask 后端设置 Vue 应用程序运行