我正在考虑从 dwm 切换回 XMonad,但我上次使用 XMonad 时遇到的问题之一是我的 micmute 键(我的键盘有一个)自从 XMonad 以来就无法使用图形.X11.ExtraTypes.XF86不包括 的 KeySym XF86XK_AudioMicMute
。
这是否意味着我无法将此键绑定到 XMonad 中的操作?请注意,键符号存在于/usr/include/X11/XF86keysym.h
(因此,我能够毫无问题地将其绑定在 dwm 中)。
答案1
事实上,Graphics.X11.ExtraTypes.XF86 似乎没有提供XF86XK_AudioMicMute
KeySym。这要么是一个疏忽(也许 MicMute 键 keysym 是在编写 Haskell 模块之后添加的),要么是一个有意的决定(可能是因为 Mic Mute 键非常不常见)。
不管怎样,幸运的是,有一种方法可以在没有 KeySym 的情况下在 Haskell 中绑定键:您使用实际的事件标识符(KeySym 只/usr/include/X11/XF86keysym.h
提供了一个宏);事实上,Graphics.X11.ExtraTypes.XF86 中的 KeySyms 也只是事件标识符的宏。
使用xev
(Xorg
组件工具)将允许您检查与特定按键关联的按键事件(或 KeySym 名称)。一旦您知道 KeySym 名称,如果事件标识符本身由于某种原因不可见,您可以检查/usr/include/X11/XF86keysym.h
以确定确切的事件标识符。在我的系统上,该标头中存在以下行:
#define XF86XK_AudioMicMute 0x1008FFB2 /* Mute the Mic from the system */
这意味着,在我的系统上(请注意,这些键符号是特定于供应商的),XF86XK_AudioMicMute
具有事件标识符0x1008FFB2
。现在,就像魔术一样,您可以将事件标识符放入您的中,xmonad.hs
它可能看起来像这样:
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
[ ... <snip>
, ((0, xF86XK_AudioMute), spawn $ "pactl -- set-sink-mute 1 toggle")
, ((0, XF86XK_AudioMicMute), spawn $ "pactl -- set-source-mute 2 toggle")
, ... <snip>
]
瞧!您现在自豪地拥有自己的功能性 MicMute 钥匙!
此外,该策略可用于任何没有公共KeySym但仍具有可识别事件标识符的密钥。
对于类似的答案(我最初发现此功能的一个答案),请参阅这个 Superuser.SE 答案。