diff options
-rw-r--r-- | Dzen.hs | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -0,0 +1,49 @@ +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 glasser's xinerama patch to dzen + +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 |