From 6928bb1beca2ade83116d9607782377b7bdb43d6 Mon Sep 17 00:00:00 2001 From: gwern0 Date: Mon, 4 Feb 2008 18:34:02 +0100 Subject: XMonad.Actions.WindowGo: add a runOrRaise module for Joseph Garvin with the help of Spencer Janssen darcs-hash:20080204173402-f7719-20807fc962351a57b939dcf90daa7fbe20de37d7.gz --- XMonad/Actions/WindowGo.hs | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 XMonad/Actions/WindowGo.hs (limited to 'XMonad/Actions/WindowGo.hs') diff --git a/XMonad/Actions/WindowGo.hs b/XMonad/Actions/WindowGo.hs new file mode 100644 index 0000000..255196e --- /dev/null +++ b/XMonad/Actions/WindowGo.hs @@ -0,0 +1,75 @@ +{- -------------------------------------------------------------------------- +| +Module : XMonad.Actions.WindowGo +License : Public domain + +Maintainer : +Stability : unstable +Portability : unportable + +Defines a few simple operations for raising windows based on XMonad's Query +Monad, such as runOrRaise. + +----------------------------------------------------------------------------- -} + +module XMonad.Actions.WindowGo ( + -- * Usage + -- $usage + raise, + runOrRaise, + raiseMaybe, + module XMonad.ManageHook + ) where + +import XMonad (Query(), X(), withWindowSet, spawn, runQuery, focus) +import Control.Monad (filterM) +import qualified XMonad.StackSet as W (allWindows) +import XMonad.ManageHook + +-- $usage +-- +-- Import the module into your @~\/.xmonad\/xmonad.hs@: +-- +-- > import XMonad.Actions.WindowGo +-- +-- and define appropriate key bindings: +-- +-- > , ((modMask x .|. shiftMask, xK_g ), raise (className =? "Firefox-bin")) +-- > , ((modMask x .|. shiftMask, xK_b ), runOrRaise "mozilla-firefox" (className =? "Firefox-bin")) +-- +-- For detailed instructions on editing your key bindings, see +-- "XMonad.Doc.Extending#Editing_key_bindings". + +-- | 'action' is an executable to be run via 'spawn' if the Window cannot be found. +-- Presumably this executable is the same one that you were looking for. +runOrRaise :: String -> Query Bool -> X () +runOrRaise action = raiseMaybe $ spawn action + +-- | See 'raiseMaybe'. If the Window can't be found, quietly give up and do nothing. +raise :: Query Bool -> X () +raise = raiseMaybe $ return () + +{- | raiseMaybe: this queries all Windows based on a boolean provided by the + user. Currently, there are three such useful booleans defined in + XMonad.ManageHook: title, resource, className. Each one tests based pretty + much as you would think. ManageHook also defines several operators, the most + useful of which is (=?). So a useful test might be finding a Window whose + class is Firefox. Firefox declares the class "Firefox-bin", so you'd want to + pass in a boolean like '(className =? "Firefox-bin")'. + If the boolean returns True on one or more windows, then XMonad will quickly + make visible the first result. If no Window meets the criteria, then the + first argument comes into play. + + The first argument is an arbitrary IO function which will be executed if the + tests fail. This is what enables runOrRaise to use raiseMaybe: it simply runs + the desired program if it isn't found. But you don't have to do that. Maybe + you want to do nothing if the search fails (the definition of 'raise'), or + maybe you want to write to a log file, or call some prompt function, or + something crazy like that. This hook gives you that flexibility. +-} +raiseMaybe :: X () -> Query Bool -> X () +raiseMaybe f thatUserQuery = withWindowSet $ \s -> do + maybeResult <- filterM (runQuery thatUserQuery) (W.allWindows s) + case maybeResult of + [] -> f + (x:_) -> focus x -- cgit v1.2.3