2013-08-18 50 views
2

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

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

+0

您对此@BruceBerry有任何进一步的改进吗? – vincent

回答

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一样)绝对是正确的想法。

+0

更新:事实证明,某些应用程序(例如Eclipse和Xfce系统托盘小程序)不响应通过xdotool发送的鼠标点击。不过,按下alt或shift键的同时右键单击作品。 –

+0

您对此@Matt_M有任何进一步的改进吗? – vincent

+0

不是。恐怕,这是我拥有的最好的。 –