我的 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 事件。