module Hbro.Util where
import Control.Concurrent
import Control.Exception
import Control.Monad hiding(mapM_)
import Control.Monad.Base
import Control.Monad.Trans.Control
import Data.Functor
import Data.List
import Graphics.Rendering.Pango.Enums
import Graphics.UI.Gtk.General.General
import Prelude hiding(log, mapM_)
import System.FilePath
import qualified System.Info as Sys
import System.Posix.Process
import System.Posix.Types
import System.Process
io :: MonadBase IO m => IO a -> m a
io = liftBase
fork :: (MonadBaseControl IO m) => m () -> m (MVar ())
fork f = do
mvar <- io newEmptyMVar
liftBaseWith $ \runInIO -> void . forkIO $ finally (void $ runInIO f) (putMVar mvar ())
return mvar
(>/>) :: (MonadBase IO m) => IO FilePath -> FilePath -> m FilePath
(>/>) a b = io $ (</> b) <$> a
spawn :: MonadBase IO m => String -> [String] -> m ()
spawn command options = io . void $ createProcess (proc command options) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe, close_fds = True }
getAllProcessIDs :: MonadBase IO m => m [ProcessID]
getAllProcessIDs = do
(_, pids, _) <- io $ readProcessWithExitCode "pidof" ["hbro"] []
(_, pids', _) <- io $ readProcessWithExitCode "pidof" ["hbro-" ++ Sys.os ++ "-" ++ Sys.arch] []
myPid <- io $ getProcessID
return $ delete myPid . map (read :: String -> ProcessID) . nub . words $ pids ++ " " ++ pids'
allItalic, allBold :: PangoAttribute
allItalic = AttrStyle {paStart = 0, paEnd = 1, paStyle = StyleItalic}
allBold = AttrWeight {paStart = 0, paEnd = 1, paWeight = WeightBold}
postGUISync' :: (MonadBaseControl IO m) => m a -> m a
postGUISync' f = control $ \runInIO -> postGUISync (runInIO f)