当前位置: 首页>>技术问答>>正文


Ubuntu在哪里存储其键盘快捷键配置?

, , ,

问题描述

“Ubuntu”中是否存在一个存储键/组合/快捷键的完整列表?

What are Unity’s keyboard and mouse shortcuts?列出了Dash,Launcher等的一些”Unity”快捷方式,How to list Compiz keybindings in use?显示了一种列出compiz绑定的方法,但我正在寻找更多(不仅仅是一些仅限于Unity或Compiz的键绑定),尽管它是一个开始。

是否存在正在使用的键绑定/键组合/键盘快捷键的全局列表,它存储在Ubuntu中的某个位置,还是有一种编译和列出它们的方法?一个适用于Ubuntu及其中运行的东西(Unity,Compiz,程序快捷方式等)。

当然,Ubuntu必须将这个存储在某个地方,以便按键盘上的按键组合指向它所连接的内容?如果在Ubuntu中没有这样的地方,那么发布以作为答案,以便搜索的未来用户将知道。

最佳解决方案

您的窗口管理器会在应用程序执行之前获取任何关键事件,因此如果它想要使用这些事件,它会这样做,您的应用程序将永远不会收到它们。如果窗口管理器不想对键事件本身做出反应,它会将它们传递给应用程序。

您可以通过以下方式自行验证:

  1. 启动终端。

  2. 启动X事件查看器xev | grep KeyPress

  3. Alt,注意xev显示它在其终端窗口中获​​得了键事件。

  4. Ctrl,再次注意xev得到了该事件。记下终端窗口现在的样子。

  5. Left arrow转到另一个工作区。 (我假设您将其作为窗口管理器快捷键。)

  6. Right arrow返回运行xev的位置。请注意,它从未收到通过左右箭头键切换工作区的任何键事件 – 输出与步骤4中的输出相同。

因此,您会看到窗口管理器在实践中获取所有关键事件,如果它不想捕获它们,它会将它们传递给应用程序。然后,应用程序可以为自己的小部件执行相同的操作(例如,如何在Web浏览器中整天按Enter,但在将光标放在地址栏或可以输入文本的字段之前,它将不会执行任何操作)。

应用程序可以设置自己的快捷方式,并且应用程序彼此独立配置。

在KDE 3.x中,如果我没记错的话,您可以在KDE控制中心设置默认快捷方式(例如Ctrl-s用于保存),它将适用于使用Qt工具包编写的所有应用程序,但我不知道它是否仍然存在可能因为他们切换到KDE 4。

次佳解决方案

直到Ubuntu 12.04

根据您使用的女巫桌面(gnome /unity,kde,xfce,lxde等),快捷方式的放置方式不同。

对于gnome,它们属于~/.gconf/desktop/gnome/keybindings(自定义快捷方式)

并在~/.gconf/apps/metacity下。

自Ubuntu 12.10起

~/.config/dconf/user(在dconf-editor中:org.gnome.settings-daemon.plugins.media-keys.custom-keybindings(自定义快捷方式)

~/.config/compiz-1/compizconfig

第三种解决方案

不,没有一个地方可以存储所有快捷方式。应用程序可以选择将配置存储在他们选择的任何位置。

也就是说,您主要关注两个级别:应用程序级别(如Firefox中的Ctrl-C复制)和窗口管理器级别(如Win + D以显示桌面)。 Compiz uses gconf to store its configuration

对于应用程序,您可以通过工具包粗略划分它们。也就是说,GTK应用程序也使用gconf。

Surely, Ubuntu must store this somewhere for the key combination pressed on the keyboard to be directed to what it’s connected with?

不完全的。专注的应用程序在X键盘事件中获得第一次启动,但如果没有,它会冒泡到其他应用程序,即窗口管理器。因此,你可以拥有一个捕获Alt + F4而不关闭窗口的游戏(该死的,Jamestown!)。我认为你认为它会进入一些中央事件路由器,然后匹配某个数据库,然后路由到它的目的地。这更像是传递一瓶饮料:通过,如果你想要通过一个swig,并通过其余的,或采取整个事情,并贪婪。

Linux /FOSS环境(您可能已经注意到)非常民主,让所有应用程序在单个中央键盘配置存储库上达成一致是一个愚蠢的错误。首先,你有很久以前写过的非维护应用程序并且不会知道它。

更新:根据the Xlib docs on the subject

Starting with the source window, the X server searches up the window hierarchy until it locates the first window specified by a client as having an interest in these events. If one of the intervening windows has its do-not-propagate-mask set to prohibit generation of the event type, the events of those types will be suppressed.

也,

To receive KeyPress , KeyRelease , ButtonPress , and ButtonRelease events, set KeyPressMask, KeyReleaseMask, ButtonPressMask, and ButtonReleaseMask bits in the event-mask attribute of the window.

you can set an attribute to disable propagation

问题是,你不告诉X要监听哪些密钥,所以你永远不能告诉先前应用程序监听哪些密钥(更不用说他们做了什么),或者实际上他们是否打算将它传播出去听着它。因此,中心注册表在X级别是不可能的,因此您必须在工具包级别执行此操作,这实际上是不可能的。 :d

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6394.html,未经允许,请勿转载。