2013-08-18 54 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

不是。恐怕,這是我擁有的最好的。 –