hbro-0.6.8: Hbro/Extra/Session.hs
module Hbro.Extra.Session where
-- {{{ Imports
import Hbro.Types
import Hbro.Util
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Graphics.UI.Gtk.General.General
import Graphics.UI.Gtk.WebKit.WebView
import System.Directory
import System.Environment
import System.Glib.Signals
import System.IO
import System.Posix.Process
import System.Process
-- }}}
setupSession :: Browser -> IO ()
setupSession browser = do
pid <- getProcessID
configHome <- getEnv "XDG_CONFIG_HOME"
previousSession <- getDirectoryContents (configHome ++ "/hbro/") >>= return . (filter sessionFilesFilter)
let sessionFile = configHome ++ "/hbro/session." ++ show pid
_ <- on webView loadFinished $ \_ -> do
uri <- webViewGetUri webView
case uri of
Just u -> writeFile sessionFile u
_ -> return ()
_ <- quitAdd 0 $ do
removeFile sessionFile
return False
return ()
where
webView = mWebView $ mGUI browser
sessionFilesFilter :: String -> Bool
sessionFilesFilter ('s':'e':'s':'s':'i':'o':'n':'.':_) = True
sessionFilesFilter _ = False
loadFromSession :: Browser -> IO ()
loadFromSession browser = do
configHome <- getEnv "XDG_CONFIG_HOME"
previousSession <- getDirectoryContents (configHome ++ "/hbro/") >>= return . (filter sessionFilesFilter)
sessionURIs <- mapM getSessionURI previousSession
(Just input, Just output, _, _) <- createProcess (proc "dmenu" ["-l", "10"]) {
std_in = CreatePipe,
std_out = CreatePipe }
_ <- T.hPutStr input (T.unlines sessionURIs)
uri <- catch (hGetLine output) (\_error -> return "ERROR" )
case uri of
"ERROR" -> return ()
"" -> return ()
u -> do
_ <- spawn (proc "hbro" ["-u", u])
return ()
getSessionURI :: String -> IO T.Text
getSessionURI fileName = do
configHome <- getEnv "XDG_CONFIG_HOME"
file <- T.readFile $ configHome ++ "/hbro/" ++ fileName
return $ (head . T.lines) file