From 43505e3efb39c35f6a34393d1ed3a190f8cc1d85 Mon Sep 17 00:00:00 2001 From: Spencer Janssen Date: Mon, 21 May 2007 21:46:53 +0200 Subject: Experimental support for a beefier restart. darcs-hash:20070521194653-a5988-b6725cc0d73fc6b726dc41284eef9303a7e59a1e --- Config.hs | 2 +- Main.hs | 10 ++++++++-- XMonad.hs | 22 +++++++++++++++------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Config.hs b/Config.hs index 0b738a6..b199cb2 100644 --- a/Config.hs +++ b/Config.hs @@ -169,7 +169,7 @@ keys = M.fromList $ , ((modMask .|. shiftMask, xK_c ), kill) , ((modMask .|. shiftMask, xK_q ), io $ exitWith ExitSuccess) - , ((modMask .|. shiftMask .|. controlMask, xK_q ), restart) + , ((modMask .|. shiftMask .|. controlMask, xK_q ), restart Nothing False) -- Cycle the current tiling order , ((modMask, xK_Return), swap) diff --git a/Main.hs b/Main.hs index a38df80..ea6d96b 100644 --- a/Main.hs +++ b/Main.hs @@ -17,6 +17,8 @@ import Data.Bits import qualified Data.Map as M import Control.Monad.Reader +import System.Environment (getArgs) + import Graphics.X11.Xlib hiding (refreshKeyboardMapping) import Graphics.X11.Xlib.Extras import Graphics.X11.Xinerama (getScreenInfo) @@ -41,8 +43,12 @@ main = do xinesc <- getScreenInfo dpy nbc <- initcolor normalBorderColor fbc <- initcolor focusedBorderColor + args <- getArgs - let safeLayouts = case defaultLayouts of [] -> (full, []); (x:xs) -> (x, xs) + let winset | ("--resume" : s : _) <- args + , [(x, "")] <- reads s = x + | otherwise = new (fromIntegral workspaces) (fromIntegral $ length xinesc) + safeLayouts = case defaultLayouts of [] -> (full, []); (x:xs) -> (x, xs) cf = XConf { display = dpy , theRoot = rootw @@ -53,7 +59,7 @@ main = do , focusedBorder = fbc } st = XState - { windowset = new (fromIntegral workspaces) (fromIntegral $ length xinesc) + { windowset = winset , layouts = M.fromList [(w, safeLayouts) | w <- [0 .. W workspaces - 1]] , xineScreens = xinesc , dimensions = (fromIntegral (displayWidth dpy dflt), diff --git a/XMonad.hs b/XMonad.hs index d18e9f1..dccdd12 100644 --- a/XMonad.hs +++ b/XMonad.hs @@ -140,13 +140,21 @@ spawn x = io $ do getProcessStatus True False pid return () --- | Restart xmonad by exec()'ing self. This doesn't save state and xmonad has --- to be in PATH for this to work. -restart :: X () -restart = io $ do - prog <- getProgName - args <- getArgs - catch (executeFile prog True args Nothing) (const $ return ()) +-- | Restart xmonad via exec(). +-- +-- If the first parameter is 'Just name', restart will attempt to execute the +-- program corresponding to 'name'. Otherwise, xmonad will attempt to execute +-- the name of the current program. +-- +-- When the second parameter is 'True', xmonad will attempt to resume with the +-- current window state. +restart :: Maybe String -> Bool -> X () +restart mprog resume = do + prog <- maybe (io $ getProgName) return mprog + args <- io $ getArgs + args' <- if resume then gets (("--resume":) . return . show . windowset) else return [] + io $ catch (executeFile prog True (args ++ args') Nothing) + (const $ return ()) -- ignore executable not found exception -- | Run a side effecting action with the current workspace. Like 'when' but whenJust :: Maybe a -> (a -> X ()) -> X () -- cgit v1.2.3