diff options
Diffstat (limited to '')
-rw-r--r-- | XMonad/Actions/UpdateFocus.hs | 61 | ||||
-rw-r--r-- | xmonad-contrib.cabal | 1 |
2 files changed, 62 insertions, 0 deletions
diff --git a/XMonad/Actions/UpdateFocus.hs b/XMonad/Actions/UpdateFocus.hs new file mode 100644 index 0000000..fb51ea3 --- /dev/null +++ b/XMonad/Actions/UpdateFocus.hs @@ -0,0 +1,61 @@ +----------------------------------------------------------------------------- +-- | +-- Module : XMonadContrib.UpdateFocus +-- Copyright : (c) Daniel Schoepe +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : Daniel Schoepe <asgaroth_@gmx.de> +-- Stability : unstable +-- Portability : unportable +-- +-- Updates the focus on mouse move in unfocused windows. +-- +----------------------------------------------------------------------------- + +module XMonad.Actions.UpdateFocus ( + -- * Usage + -- $usage + focusOnMouseMove, + adjustEventInput +) where + +import XMonad +import qualified XMonad.StackSet as W +import Graphics.X11.Xlib.Extras +import Control.Monad (when) +import Data.Monoid + +-- $usage +-- To make the focus update on mouse movement within an unfocused window, add the +-- following to your @~\/.xmonad\/xmonad.hs@: +-- +-- > import XMonad.Actions.UpdateFocus +-- > xmonad $ defaultConfig { +-- > .. +-- > startupHook = adjustEventInput +-- > handleEventHook = focusOnMouseMove +-- > .. +-- > } +-- +-- This module is probably only useful when focusFollowsMouse is set to True(default). + +-- | Changes the focus if the mouse is moved within an unfocused window. +focusOnMouseMove :: Event -> X All +focusOnMouseMove (MotionEvent { ev_x = x, ev_y = y, ev_window = root }) = do + -- check only every 15 px to avoid excessive calls to translateCoordinates + when (x `mod` 15 == 0 || y `mod` 15 == 0) $ do + dpy <- asks display + Just foc <- withWindowSet $ return . W.peek + -- get the window under the pointer: + (_,_,_,w) <- io $ translateCoordinates dpy root root (fromIntegral x) (fromIntegral y) + when (foc /= w) $ focus w + return (All True) +focusOnMouseMove _ = return (All True) + +-- | Adjusts the event mask to pick up pointer movements. +adjustEventInput :: X () +adjustEventInput = withDisplay $ \dpy -> do + rootw <- asks theRoot + io $ selectInput dpy rootw $ substructureRedirectMask .|. substructureNotifyMask + .|. enterWindowMask .|. leaveWindowMask .|. structureNotifyMask + .|. buttonPressMask .|. pointerMotionMask
\ No newline at end of file diff --git a/xmonad-contrib.cabal b/xmonad-contrib.cabal index ce8a82e..e092dbf 100644 --- a/xmonad-contrib.cabal +++ b/xmonad-contrib.cabal @@ -98,6 +98,7 @@ library XMonad.Actions.TagWindows XMonad.Actions.TopicSpace XMonad.Actions.UpdatePointer + XMonad.Actions.UpdateFocus XMonad.Actions.Warp XMonad.Actions.WindowNavigation XMonad.Actions.WindowGo |