xmonad - 使用鼠标按钮6和7切换工作区

7
我希望能够使用鼠标上的6和7按钮(滚轮两侧的摇杆按钮)向前或向后移动工作区。我猜这与additionalMouseBindings有关,如果它遵循与additionalKeys相同的模式,那么我就会成功了。但是,事实并非如此,我不完全理解如何定义新的绑定。尝试过程如下:
`additionalMouseBindings`
[ -- get the middle button to switch views
  ((0, button6), spawn "xdotool key super+Down")
, ((0, button7), spawn "xdotool key super+Up")
]

由于了解 Haskell 和 xmonad 的人很容易就能明白,所以它目前无法正常工作。

感谢任何建议。


如果我没记错的话,核心X11协议只有五个按钮。其他按钮可以使用X扩展(XINPUT,也许?我忘了)来检测,但我不知道xmonad是否也利用了这些扩展。 - chi
1个回答

5

“不工作”是指它无法编译。

在@chi的评论后,我检查了按钮:button6和7未定义,这是第一个问题。但根据这篇文章,如果只给出它们的数字,额外的按钮可以使用。

看起来您正在使用XMonad.Util.EZConfig模块中的additionalMouseBindings函数。它的类型是:

additionalMouseBindings :: XConfig a -> [((ButtonMask, Button), Window -> X ())] -> XConfig a

您把它用反引号括起来,这将其转换为运算符。您在此处没有显示第一个操作数,类型为XConfig a,因此可能会出现第一个错误。您应该有这样的形式:
 yourPreviousConfig `additionalMouseBindings` listOfBindings 

这个表达式等同于你的新XConfig。

你可以看到,鼠标按钮的绑定列表与键盘不是相同类型。列表的元素类型为((ButtonMask, Button), Window -> X ()):按钮关联到一个函数,该函数接受Window并返回X()(而键关联到类型为X()的表达式)。XMonad将使用点击的窗口作为参数调用您在此处指定的函数。在您的情况下,您不关心窗口。您可以通过创建lambda函数spawn "xdotool key super+Down"转换为接受Window(或任何内容)的函数:

((0, 6), \w -> spawn "xdotool key super+Down")

你可以使用const来获取一个常量函数,它总是返回spawn "xdotool key super+Down"

((0, 6), const $ spawn "xdotool key super+Down")

最后,使用xdotool切换工作区似乎有些过头了。也许您已经在键绑定中使用了此处的某些模块函数? 您也可以在鼠标绑定中使用它们。 nextWSprevWSX()类型的,所以您需要创建使用它们的恒定函数,就像上面那样。


这确实是一个编译错误,因为缺少了窗口参数。您的建议完美地解决了这个问题。我选择了以下代码:((0, 6), \w -> moveTo Prev (WSIs notSP)),并定义了适当的临时储存过滤器。非常感谢您的帮助。 - Tony Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接