【问题标题】:Keyboard-free mouse gestures for XMonadXMonad 的无键盘鼠标手势
【发布时间】:2013-08-18 22:16:51
【问题描述】:

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

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

【问题讨论】:

  • 你在这个@BruceBerry 上取得了进一步的进展吗?

标签: mouseevent gesture xmonad


【解决方案1】:

要让 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 所做的那样)绝对是正确的想法。

【讨论】:

  • 更新:事实证明,某些应用程序(例如 Eclipse 和 Xfce 系统托盘小程序)不响应通过 xdotool 发送的鼠标单击。不过,在右键单击时按 alt 或 shift 是可行的。
  • 你在这个@Matt_M 上取得了进一步的进展吗?
  • 不。恐怕这是我所拥有的最好的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多