如何将 Esc 映射到 Motif 小部件中的操作

How to map Esc to an action in a Motif widget

这个最小的示例创建了一个带有按钮小部件的 Motif window。

#include <Xm/PushB.h>

int main(int argc, char **argv) {
  XtAppContext app;
  Widget       toplevel, b;
  char         *translations="<Key>Escape: ArmAndActivate()\n\
                              <Key>a:      ArmAndActivate()";

  toplevel = XtVaOpenApplication(&app, "tl", NULL, 0, &argc, argv, NULL,
                                 sessionShellWidgetClass, NULL);
  
  b = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, toplevel, NULL);
  XtOverrideTranslations(b, XtParseTranslationTable(translations));

  XtRealizeWidget(toplevel);
  XtAppMainLoop(app);
  return(0);
}

Esca 都映射到同一个动作, ArmAndActivate,但小部件仅响应 a 按键,不响应 Esc如何让它响应 Esc? 请注意 根据 xev.

Escape 确实是正确的键符

Escape is the osfCancel Motif virtual binding;从这个意义上说,它是 已经“占领”了。所以使用

<Key>osfCancel: ArmAndActivate()

可以通过~/.motifbind文件修改虚拟绑定,参见 Motif 编程模型man VirtualBindings.