mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
Stop pretending it has anything to do with time, it's zero, and it's not being read anywhere, we're passing the parameter only because setClientMessageEvent needs one. We should switch to setClientMessageEvent' and pass no data, but that would move the X11 dependency lower bound.
58 lines
2.2 KiB
Haskell
58 lines
2.2 KiB
Haskell
-- 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 0
|
|
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.")
|