2

我在我的 xmonad.hs 中设置鼠标手势,我想避免使用 modMask 修饰符来获得无键盘手势。问题是,在某些情况下(例如空手势,只需单击一下),我想让鼠标事件通过光标下的应用程序,但我还没有在 XMonad 中找到这样做的方法。没有它,如果我添加((0, button3), mouseGesture gestures),我将完全失去button3.

我在想,如果事件不能轻易转发,也许可以创建和分派一个新事件。我想过使用spawn "xdotool click 3",但它似乎不起作用。有没有人尝试过类似的东西?否则,我需要一个至少有 4 个按钮的鼠标,因为大多数应用程序都使用三个按钮……

4

1 回答 1

0

要让 xdotool 转发您的鼠标点击,您需要确保它使用--window参数定位到正确的窗口。例如,如果您的窗口 id 是 79693135,那么xdotool click --window 79693135 3就完全按照您的意愿行事。

以下基本xmonad.hs说明如何执行此操作以使无键盘鼠标手势正常工作:

import XMonad
import qualified XMonad.Actions.CycleWS as Workspace
import XMonad.Actions.MouseGestures ( mouseGesture, Direction2D(..) )
import qualified XMonad.Util.EZConfig as EZ
import XMonad.Util.Run ( safeSpawn )

import qualified Data.Map as Map

mouseGestureButton :: Button
mouseGestureButton = button3 -- right click

sendMouseClickToWindow :: Window -> X ()
sendMouseClickToWindow win = 
    safeSpawn 
        "xdotool" ["click", "--window", show win, show mouseGestureButton]

myMouseGestures :: [([Direction2D], Window -> X ())]
myMouseGestures =
    [ ([R], const Workspace.nextWS) -- move to the next workspace
    , ([L], const Workspace.prevWS) -- move to the previous workspace
    , ([], sendMouseClickToWindow)
    ]

addMouseGestures :: XConfig a -> XConfig a
addMouseGestures = 
    flip EZ.additionalMouseBindings 
      [((0, mouseGestureButton), mouseGesture $ Map.fromList myMouseGestures)]

main = xmonad $ addMouseGestures def

注意:为此使用按钮 1 不是一个好主意,因为这会干扰选择文本和通常与按钮 1 一起使用的其他鼠标拖动功能。所以使用按钮 3(就像 OP 所做的那样)绝对是正确的想法。

于 2016-04-07T04:06:50.770 回答