在 Ubuntu(或者大多数其他 Linux 发行版)中,我可以使用快捷方式 ctrl+t 打开一个新选项卡(在 firefox 或类似版本中),或者我可以使用 alt+tab 使 unity 切换突出显示窗口,或者我可以使用 alt+ctrl+F<1-6> 进入另一个 tty。 Linux 的哪一部分处理并解析这些快捷方式?如果多个程序/进程共享相同的快捷方式怎么办,优先级如何解决?
(对于后者,我假设这仅与不同“级别”上的程序相关,例如 firefox 和会话脚本可能会竞争,但 firefox 和 chrome 永远不会竞争,因为它们不应该同时响应)
答案1
Linux 的哪一部分处理并解析这些快捷方式?
大多数情况下,单个应用程序或窗口管理器(WM)/桌面环境(DE)。有一些由内核捕获和处理,例如使用 Cntl-Alt-F[N] 进行 VT 切换。
实际事件传播:
- 从内核
- 到 Xorg 服务器
- 致 WM/DE
- 前往申请
如果其中任何一点被抓住并处理,它可能不会继续到下一个级别。
如果您在 GUI 终端内运行(非 GUI)应用程序,则 GUI 终端将优先于它。
如果多个程序/进程共享相同的快捷方式怎么办,优先级如何解决?
WM/DE 将优先于申请。
答案2
将您的桌面视为运行各种程序总是,即使它们没有窗口、终端或显示为守护进程。大多数都运行窗口管理器,也许还有各种工具栏、桌面等等。
现在让我们看看按下某个键时会发生什么。按键和按键释放是分开处理的,尽管库可以为程序员将它们组合起来。键盘驱动程序处理一些事情,例如将Shift键视为修饰键而不是离散键。驱动程序本身可以捕获一些组合键供自己使用,也可以将其扔给程序。
哪个程序能得到它?作为标准,使用 Windows 的程序只有在获得输入焦点时才会收到击键通知。程序还可以“获取”某些键供自己使用。Alt+Tab被 Unity 获取,拒绝任何其他程序看到它。Ctrl+T被 Firefox 的菜单系统捕获,但仅当带有想要了解它的菜单的 Firefox 窗口具有输入焦点时。
那么谁决定谁得到什么?除了输入焦点之外,正如我已经提到的,它通常是先到先得的。Alt+Tab被 Unity(以及许多其他窗口管理器)获取,因此用户程序很少能抢走它。最终用户受正在使用的程序的支配;如果一个程序(例如vim
)允许您为不同的事情配置某些组合键,那么只要该程序获得击键,您就可以开始操作了。