48 lines
1.6 KiB
Haskell
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
|