diff options
Diffstat (limited to 'XMonad')
| -rw-r--r-- | XMonad/Stockholm/Shutdown.hs | 39 | 
1 files changed, 36 insertions, 3 deletions
| diff --git a/XMonad/Stockholm/Shutdown.hs b/XMonad/Stockholm/Shutdown.hs index 373214e..8c0a657 100644 --- a/XMonad/Stockholm/Shutdown.hs +++ b/XMonad/Stockholm/Shutdown.hs @@ -6,17 +6,50 @@ module XMonad.Stockholm.Shutdown      )    where +import Control.Applicative ((<|>), empty)  import Control.Concurrent (threadDelay) -import Control.Monad (forever, when) +import Control.Monad (forever, guard, when)  import Data.Monoid (All(All)) +import System.Directory (XdgDirectory(XdgData), createDirectoryIfMissing, doesFileExist, getAppUserDataDirectory, getXdgDirectory)  import System.Exit (exitSuccess) +import System.Environment (lookupEnv)  import System.FilePath ((</>))  import System.IO.Error (isDoesNotExistError, tryIOError)  import System.IO (hPutStrLn, stderr)  import System.Posix.Process (getProcessID)  import System.Posix.Signals (nullSignal, signalProcess)  import System.Posix.Types (ProcessID) -import XMonad +import XMonad hiding (getXMonadDataDir) + + +-- XXX this is for compatibility with both xmonad<0.17 and xmonad>=0.17 +getXMonadDataDir :: IO String +getXMonadDataDir = xmEnvDir <|> xmDir <|> xdgDir +  where +    -- | Check for xmonad's environment variables first +    xmEnvDir :: IO String +    xmEnvDir = +        maybe empty pure =<< lookupEnv "XMONAD_DATA_DIR" + +    -- | Check whether the config file or a build script is in the +    -- @~\/.xmonad@ directory +    xmDir :: IO String +    xmDir = do +        d <- getAppUserDataDirectory "xmonad" +        conf  <- doesFileExist $ d </> "xmonad.hs" +        build <- doesFileExist $ d </> "build" +        pid <- doesFileExist $ d </> "xmonad.pid" + +        -- Place *everything* in ~/.xmonad if yes +        guard $ conf || build || pid +        pure d + +    -- | Use XDG directories as a fallback +    xdgDir :: IO String +    xdgDir = do +        d <- getXdgDirectory XdgData "xmonad" +        d <$ createDirectoryIfMissing True d +  newShutdownEventHandler :: IO (Event -> X All)  newShutdownEventHandler = do @@ -65,7 +98,7 @@ waitProcess pid = forever (signalProcess nullSignal pid >> threadDelay 10000)  -- PID file stuff  -- -getProcessIDFileName :: (Functor m, MonadIO m) => m FilePath +getProcessIDFileName :: IO FilePath  getProcessIDFileName = (</> "xmonad.pid") <$> getXMonadDataDir  writeProcessIDToFile :: IO () | 
