packages feed

apelsin-1.2.1: src/Constants.hs

{-# LANGUAGE CPP #-}
module Constants where
import Data.String
import System.Environment.XDG.BaseDir
import System.FilePath
import System.Directory
import System.IO
import System.Process
import Control.Concurrent
import Control.Exception
import Control.Monad

#ifdef CABAL_PATH
import Paths_apelsin hiding (getDataDir)
#endif

configName, programName, fullProgramName :: IsString s => s
configName = "apelsin"
programName = "Apelsin"
fullProgramName = "Apelsin Tremulous Browser"

inCacheDir, inConfDir :: FilePath -> IO FilePath

inCacheDir x = do
	dir <- getUserCacheDir configName
	createDirectoryIfMissing True dir
	return (dir </> x)

inConfDir x = do
	dir <- getUserConfigDir configName
	createDirectoryIfMissing True dir
	return (dir </> x)


getDataDir :: IO FilePath
#ifdef CABAL_PATH
getDataDir = dropTrailingPathSeparator `fmap` getDataFileName ""
#else
getDataDir = getCurrentDirectory
#endif


trace :: String -> IO ()
defaultBrowser :: String -> IO CreateProcess

#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
trace _			= return ()
defaultBrowser x	= do
	ddir <- getDataDir
	return (proc "wscript" [ddir </> "open.js", x])

#else
trace x			= hPutStrLn stderr x >> hFlush stderr

#if defined(__APPLE__) || defined(__MACH__)
defaultBrowser	x	= return $ proc "open" [x]
#else
defaultBrowser	x	= return $ proc "xdg-open" [x]
#endif

#endif

openInBrowser :: String -> IO ()
openInBrowser x = handle (\(_ :: IOError) -> return ()) $ do
	p <- defaultBrowser x
	(_,_,_,hdl) <- createProcess p {close_fds = True}
	-- The following hack is needed to avoid ghost processes because of:
	-- http://hackage.haskell.org/trac/ghc/ticket/2123
	forkIO $ void $ waitForProcess hdl
	return ()

spacing, spacingHalf, spacingBig, spacingHuge :: Integral i => i
spacingHalf	= 2
spacing		= 4
spacingBig	= 8
spacingHuge	= 12