diff options
Diffstat (limited to 'XMonad/Actions')
-rw-r--r-- | XMonad/Actions/UpdateFocus.hs | 61 |
1 files changed, 61 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 |