xmonad-masser/src/XMonad/RestartFile.hs

48 lines
1.6 KiB
Haskell

module RestartFile (restartFile, resumeArgsFromFile, getArgs, withArgs) where
import XMonad.Core
import XMonad.Operations
import qualified XMonad.StackSet as W
import Graphics.X11.Xlib.Event
import Control.Monad.Reader (asks)
import Control.Monad.State (gets)
import Data.Maybe
import Data.List (intercalate)
import qualified Data.Map.Strict as M
import System.Environment (getArgs, withArgs)
import Control.Monad
import Control.Exception
import System.Posix.Process (executeFile)
stateFile = "xmonadargs.txt"
restartFile :: String -> Bool -> X ()
restartFile prog resume = do
io $ appendFile "/home/masse/xmonad.log" $ "trying to restart"
broadcastMessage ReleaseResources
io . flush =<< asks display
let wsData = show . W.mapLayout show . windowset
maybeShow (t, Right (PersistentExtension ext)) = Just (t, show ext)
maybeShow (t, Left str) = Just (t, str)
maybeShow _ = Nothing
extState = return . show . mapMaybe maybeShow . M.toList . extensibleState
args <- if resume then return ["--resume"] else return []
when resume $ do
argsstr <- gets (\s -> intercalate "\n" ("--resume":wsData s:extState s))
catchIO $ writeFile stateFile argsstr
return ()
catchIO (executeFile prog True args Nothing)
catchAny :: IO a -> (SomeException -> IO a) -> IO a
catchAny = Control.Exception.catch
resumeArgsFromFile :: IO [String]
resumeArgsFromFile = do
let readLines = liftM lines . readFile $ stateFile
args <- getArgs
if ["--resume"] == args then
catchAny readLines $ \e -> do
appendFile "/home/masse/xmonad.log" $ "got error" ++ show e
return args
else return args