XMonad的无键盘鼠标手势

时间:2013-08-18 22:16:51

标签: mouseevent gesture xmonad

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

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

1 个答案:

答案 0 :(得分: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所做的那样)绝对是正确的想法。