mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 03:20:21 -07:00
50 lines
1.4 KiB
Haskell
50 lines
1.4 KiB
Haskell
module XMonadContrib.Dzen (dzen, dzenScreen) where
|
|
|
|
import System.Posix.Process (forkProcess, getProcessStatus, createSession)
|
|
import System.IO
|
|
import System.Process
|
|
import System.Exit
|
|
import Control.Concurrent (threadDelay)
|
|
import Control.Monad.State
|
|
|
|
import qualified StackSet as W
|
|
import XMonad
|
|
|
|
-- wait is in us
|
|
runProcessWithInputAndWait :: FilePath -> [String] -> String -> Int -> IO ()
|
|
runProcessWithInputAndWait cmd args input timeout = do
|
|
pid <- forkProcess $ do
|
|
forkProcess $ do -- double fork it over to init
|
|
createSession
|
|
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
|
|
hPutStr pin input
|
|
hFlush pin
|
|
threadDelay timeout
|
|
hClose pin
|
|
-- output <- hGetContents pout
|
|
-- when (output==output) $ return ()
|
|
hClose pout
|
|
hClose perr
|
|
waitForProcess ph
|
|
return ()
|
|
exitWith ExitSuccess
|
|
return ()
|
|
getProcessStatus True False pid
|
|
return ()
|
|
|
|
|
|
curScreen :: X ScreenId
|
|
curScreen = (W.screen . W.current) `liftM` gets windowset
|
|
|
|
toXineramaArg :: ScreenId -> String
|
|
toXineramaArg n = show ( ((fromIntegral n)+1)::Int )
|
|
|
|
-- Requires dzen >= 0.2.4.
|
|
|
|
dzen :: String -> X ()
|
|
dzen str = curScreen >>= \sc -> dzenScreen sc str
|
|
|
|
dzenScreen :: ScreenId -> String -> X()
|
|
dzenScreen sc str = io $ (runProcessWithInputAndWait "dzen2" ["-xs", screen] str 5000000)
|
|
where screen = toXineramaArg sc
|