------------------------------------------------------------------------------ -- | -- Module : ServerMode -- Copyright : (c) Mads N Noe 2009 -- (c) Andrea Rossato and David Roundy 2007 -- Maintainer : mntnoe (@) gmail.com -- License : BSD-style (see xmonad\/LICENSE) -- -- Modification of XMonad.Hooks.ServerMode with custom actions. -- ------------------------------------------------------------------------------ module ServerMode ( ServerMode (..) , eventHook ) where -- Haskell modules import Control.Monad (when) import Data.List import Data.Maybe import System.IO import qualified Data.Map as M -- XMonad modules import XMonad import XMonad.Actions.Commands hiding (runCommand') import XMonad.Hooks.EventHook import XMonad.Actions.CycleWS import qualified XMonad.StackSet as W -- My modules import Util -- | Custom commands. commands :: X [(String, X ())] commands = do return $ [ ("prev-empty-ws" , doWithWS W.greedyView Prev EmptyWS) , ("prev-nonempty-ws" , doWithWS W.greedyView Prev NonEmptyWS) , ("next-nonempty-ws" , doWithWS W.greedyView Next NonEmptyWS) , ("next-empty-ws" , doWithWS W.greedyView Next EmptyWS) ] data ServerMode = ServerMode deriving ( Show, Read ) instance EventHook ServerMode where handleEvent _ (ClientMessageEvent {ev_message_type = mt, ev_data = dt}) = do d <- asks display a <- io $ internAtom d "XMONAD_COMMAND" False when (mt == a && dt /= []) $ do cl <- commands let listOfCommands = map (uncurry (++)) . zip (map show ([1..] :: [Int])) . map ((++) " - " . fst) case lookup (fromIntegral (head dt) :: Int) (zip [1..] cl) of Just (c,_) -> runCommand' c Nothing -> mapM_ (io . hPutStrLn stderr) . listOfCommands $ cl handleEvent _ _ = return () -- | Given the name of a command from 'defaultCommands', return the -- corresponding action (or the null action if the command is not -- found). runCommand' :: String -> X () runCommand' c = do m <- fmap commandMap commands fromMaybe (return ()) (M.lookup c m)