diff --git a/XMonad/Hooks/ServerMode.hs b/XMonad/Hooks/ServerMode.hs index ba460e17..c39edf23 100644 --- a/XMonad/Hooks/ServerMode.hs +++ b/XMonad/Hooks/ServerMode.hs @@ -12,78 +12,7 @@ -- client. Also consider "XMonad.Hooks.EwmhDesktops" together with -- @wmctrl@. -- --- This is the example of a client: --- --- > import Graphics.X11.Xlib --- > import Graphics.X11.Xlib.Extras --- > import System.Environment --- > import System.IO --- > import Data.Char --- > --- > main :: IO () --- > main = parse True "XMONAD_COMMAND" =<< getArgs --- > --- > parse :: Bool -> String -> [String] -> IO () --- > parse input addr args = case args of --- > ["--"] | input -> repl addr --- > | otherwise -> return () --- > ("--":xs) -> sendAll addr xs --- > ("-a":a:xs) -> parse input a xs --- > ("-h":_) -> showHelp --- > ("--help":_) -> showHelp --- > ("-?":_) -> showHelp --- > (a@('-':_):_) -> hPutStrLn stderr ("Unknown option " ++ a) --- > --- > (x:xs) -> sendCommand addr x >> parse False addr xs --- > [] | input -> repl addr --- > | otherwise -> return () --- > --- > --- > repl :: String -> IO () --- > repl addr = do e <- isEOF --- > case e of --- > True -> return () --- > False -> do l <- getLine --- > sendCommand addr l --- > repl addr --- > --- > sendAll :: String -> [String] -> IO () --- > sendAll addr ss = foldr (\a b -> sendCommand addr a >> b) (return ()) ss --- > --- > sendCommand :: String -> String -> IO () --- > sendCommand addr s = do --- > d <- openDisplay "" --- > rw <- rootWindow d $ defaultScreen d --- > a <- internAtom d addr False --- > m <- internAtom d s False --- > allocaXEvent $ \e -> do --- > setEventType e clientMessage --- > setClientMessageEvent e rw a 32 m currentTime --- > sendEvent d rw False structureNotifyMask e --- > sync d False --- > --- > showHelp :: IO () --- > showHelp = do pn <- getProgName --- > putStrLn ("Send commands to a running instance of xmonad. xmonad.hs must be configured with XMonad.Hooks.ServerMode to work.\n-a atomname can be used at any point in the command line arguments to change which atom it is sending on.\nIf sent with no arguments or only -a atom arguments, it will read commands from stdin.\nEx:\n" ++ pn ++ " cmd1 cmd2\n" ++ pn ++ " -a XMONAD_COMMAND cmd1 cmd2 cmd3 -a XMONAD_PRINT hello world\n" ++ pn ++ " -a XMONAD_PRINT # will read data from stdin.\nThe atom defaults to XMONAD_COMMAND.") --- --- --- compile with: @ghc --make xmonadctl.hs@ --- --- run with --- --- > xmonadctl command --- --- or with --- --- > $ xmonadctl --- > command1 --- > command2 --- > . --- > . --- > . --- > ^D --- --- Usage will change depending on which event hook(s) you use. More examples are shown below. +-- See @scripts/xmonadctl.hs@ for the client. -- ----------------------------------------------------------------------------- diff --git a/scripts/xmonadctl.hs b/scripts/xmonadctl.hs new file mode 100644 index 00000000..ca9bee64 --- /dev/null +++ b/scripts/xmonadctl.hs @@ -0,0 +1,57 @@ +-- Copyright: (c) Peter Olson 2013 and Andrea Rossato and David Roundy 2007 +-- License: BSD-style (see xmonad/LICENSE) +-- +-- Compile with @ghc --make xmonadctl.hs@ +-- For usage help, do @xmonadctl -h@ + +import Graphics.X11.Xlib +import Graphics.X11.Xlib.Extras +import System.Environment +import System.IO +import Data.Char + +main :: IO () +main = parse True "XMONAD_COMMAND" =<< getArgs + +parse :: Bool -> String -> [String] -> IO () +parse input addr args = case args of + ["--"] | input -> repl addr + | otherwise -> return () + ("--":xs) -> sendAll addr xs + ("-a":a:xs) -> parse input a xs + ("-h":_) -> showHelp + ("--help":_) -> showHelp + ("-?":_) -> showHelp + (a@('-':_):_) -> hPutStrLn stderr ("Unknown option " ++ a) + + (x:xs) -> sendCommand addr x >> parse False addr xs + [] | input -> repl addr + | otherwise -> return () + + +repl :: String -> IO () +repl addr = do e <- isEOF + case e of + True -> return () + False -> do l <- getLine + sendCommand addr l + repl addr + +sendAll :: String -> [String] -> IO () +sendAll addr ss = foldr (\a b -> sendCommand addr a >> b) (return ()) ss + +sendCommand :: String -> String -> IO () +sendCommand addr s = do + d <- openDisplay "" + rw <- rootWindow d $ defaultScreen d + a <- internAtom d addr False + m <- internAtom d s False + allocaXEvent $ \e -> do + setEventType e clientMessage + setClientMessageEvent e rw a 32 m currentTime + sendEvent d rw False structureNotifyMask e + sync d False + +showHelp :: IO () +showHelp = do pn <- getProgName + putStrLn ("Send commands to a running instance of xmonad. xmonad.hs must be configured with XMonad.Hooks.ServerMode to work.\n-a atomname can be used at any point in the command line arguments to change which atom it is sending on.\nIf sent with no arguments or only -a atom arguments, it will read commands from stdin.\nEx:\n" ++ pn ++ " cmd1 cmd2\n" ++ pn ++ " -a XMONAD_COMMAND cmd1 cmd2 cmd3 -a XMONAD_PRINT hello world\n" ++ pn ++ " -a XMONAD_PRINT # will read data from stdin.\nThe atom defaults to XMONAD_COMMAND.")