重新映射即将传递给应用程序的修饰键事件

重新映射即将传递给应用程序的修饰键事件

我的 Ubuntu 计算机上的一个跨平台应用程序使用修饰键来执行某些功能。但是,在 Windows 和 Mac 上,无论使用 Alt 来执行这些功能,开发人员都决定在 Linux 上改用 Meta 键。

我不知道为什么会做出这个决定——我希望有一个正当的理由——但难以置信令人讨厌的是,在 Ubuntu 上 Meta 键用于窗口管理器快捷键,因此按键事件永远不会到达相关应用程序。例如,在 Windows 和 Mac 上,套索选择需要按住 Alt 并拖动鼠标,而在 Ubuntu 上,按住 Meta 并拖动鼠标只会在屏幕上移动应用程序窗口本身。

我绝对不要想要更改所有窗口管理器快捷键才能使用这个程序,而且据我所知,我无法更改应用程序本身的 Meta 键要求。我希望能够做的是在按键事件传递到应用程序之前劫持它 - 这样,我可以按 Alt 并让应用程序接收带有 Meta 键码的消息。

为了避免混淆,我想要做以下事情:

  • 让 Alt 键在键盘/系统级别上表现得像 Meta 键。这只会给我带来同样的问题,因为窗口管理器和应用程序现在都会响应 Alt 键。

  • 更改窗口管理器对 Meta 键的依赖性。我喜欢基于 Meta 的快捷键,并希望在所有情况下继续使用它们。

我想到的理想解决方案是这样的:

  • 我按下(或释放)Alt 键。
  • 按键事件按正常方式处理,但 X11 喜欢自行处理。如果任何现有快捷键使用 Alt 并优先于应用程序窗口,则它们将正常工作。
  • 确定关键信息应该针对当前关注的应用程序。
  • 如果这个应用程序是我指定的,并且按键信息的键码是Alt的,代码修改为Meta。
  • 该消息被发送到应用程序。

本质上,我只想能够在我习惯于在此应用程序中使用 Alt 键的地方使用它!不应有其他可观察到的影响:Alt 键应在所有其他实例/应用程序中正常运行。

我尝试过使用 AutoKey - 但是,它假设您的热键组合不会仅基于修饰键,因此它不允许我将任何东西绑定到 Alt。我知道事实上它会xev拾取 Alt 键事件。

有什么方法可以完成这种类型的键映射?

答案1

将事件修改为单个窗口非常困难。一种替代方法是运行单独的 X11 服务器,只在其中运行您的应用程序。然后,您可以使用 xmodmap 或类似程序更改该服务器的键盘映射,即仅为该应用程序更改键盘映射。Xnest 在窗口中运行单独的服务器。尝试使用类似

Xnest :1 -noreset &
DISPLAY=:1 xmodmap -e 'keysym a = b B b B'
DISPLAY=:1 xev -event keyboard  

将鼠标放在 xev 窗口中并输入“a”,它将显示为带有键符 b 的 KeyPress 事件。

相关内容