Let the user decide which commands to use in X.H.ServerMode

This commit is contained in:
Daniel Schoepe
2009-08-25 10:16:30 +00:00
parent 9a207f0512
commit 28e0adcde7
2 changed files with 10 additions and 6 deletions

View File

@@ -24,6 +24,7 @@ import qualified Data.Map as M
import XMonad hiding ( (|||) ) import XMonad hiding ( (|||) )
import qualified XMonad.StackSet as W import qualified XMonad.StackSet as W
import XMonad.Actions.Commands
import XMonad.Actions.CycleWS import XMonad.Actions.CycleWS
import XMonad.Hooks.DynamicLog hiding (xmobar) import XMonad.Hooks.DynamicLog hiding (xmobar)
import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageDocks
@@ -98,7 +99,7 @@ arossatoConfig = do
, normalBorderColor = "white" , normalBorderColor = "white"
, focusedBorderColor = "black" , focusedBorderColor = "black"
, keys = newKeys , keys = newKeys
, handleEventHook = serverModeEventHook , handleEventHook = serverModeEventHook defaultCommands
, focusFollowsMouse = False , focusFollowsMouse = False
} }
where where

View File

@@ -75,23 +75,26 @@ import XMonad.Actions.Commands
-- @~\/.xmonad\/xmonad.hs@: -- @~\/.xmonad\/xmonad.hs@:
-- --
-- > import XMonad.Hooks.ServerMode -- > import XMonad.Hooks.ServerMode
-- > import XMonad.Actions.Commands
-- --
-- Then edit your @handleEventHook@ by adding the 'serverModeEventHook': -- Then edit your @handleEventHook@ by adding the 'serverModeEventHook':
-- --
-- > main = xmonad defaultConfig { handleEventHook = serverModeEventHook } -- > main = xmonad defaultConfig { handleEventHook = serverModeEventHook defaultCommands }
-- --
data ServerMode = ServerMode deriving ( Show, Read ) data ServerMode = ServerMode deriving ( Show, Read )
serverModeEventHook :: Event -> X All -- | Executes a command of the list when receiving its index via a special ClientMessageEvent
serverModeEventHook (ClientMessageEvent {ev_message_type = mt, ev_data = dt}) = do -- (indexing starts at 1)
serverModeEventHook :: X [(String,X ())] -> Event -> X All
serverModeEventHook cmdAction (ClientMessageEvent {ev_message_type = mt, ev_data = dt}) = do
d <- asks display d <- asks display
a <- io $ internAtom d "XMONAD_COMMAND" False a <- io $ internAtom d "XMONAD_COMMAND" False
when (mt == a && dt /= []) $ do when (mt == a && dt /= []) $ do
cl <- defaultCommands cl <- cmdAction
let listOfCommands = map (uncurry (++)) . zip (map show ([1..] :: [Int])) . map ((++) " - " . fst) let listOfCommands = map (uncurry (++)) . zip (map show ([1..] :: [Int])) . map ((++) " - " . fst)
case lookup (fromIntegral (head dt) :: Int) (zip [1..] cl) of case lookup (fromIntegral (head dt) :: Int) (zip [1..] cl) of
Just (c,_) -> runCommand' c Just (c,_) -> runCommand' c
Nothing -> mapM_ (io . hPutStrLn stderr) . listOfCommands $ cl Nothing -> mapM_ (io . hPutStrLn stderr) . listOfCommands $ cl
return (All True) return (All True)
serverModeEventHook _ = return (All True) serverModeEventHook _ _ = return (All True)