summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Commands.hs2
-rw-r--r--Plugins/Monitors/Common.hs4
-rw-r--r--Plugins/StdinReader.hs4
-rw-r--r--Xmobar.hs16
-rw-r--r--xmobar.cabal2
5 files changed, 16 insertions, 12 deletions
diff --git a/Commands.hs b/Commands.hs
index 9697fce..6bbe95b 100644
--- a/Commands.hs
+++ b/Commands.hs
@@ -67,7 +67,7 @@ instance Exec Command where
hClose e
case exit of
ExitSuccess -> do
- str <- catch (hGetLineSafe o) (\_ -> return "")
+ str <- catch (hGetLineSafe o) (\(SomeException _) -> return "")
closeHandles
cb str
_ -> do closeHandles
diff --git a/Plugins/Monitors/Common.hs b/Plugins/Monitors/Common.hs
index 1b5cb60..7ac10c2 100644
--- a/Plugins/Monitors/Common.hs
+++ b/Plugins/Monitors/Common.hs
@@ -55,7 +55,7 @@ import Data.List
import Numeric
import Text.ParserCombinators.Parsec
import System.Console.GetOpt
-import Control.Exception (handle)
+import Control.Exception (SomeException,handle)
import Plugins
-- $monitor
@@ -149,7 +149,7 @@ runM args conf action r cb = do go
where go = do
c <- conf
let ac = doArgs args action
- s <- handle (const $ return "error") $ runReaderT ac c
+ s <- handle (\x -> const (return "error") $ x `asTypeOf` (undefined::SomeException)) $ runReaderT ac c
cb s
tenthSeconds r
go
diff --git a/Plugins/StdinReader.hs b/Plugins/StdinReader.hs
index a12b722..0c075e6 100644
--- a/Plugins/StdinReader.hs
+++ b/Plugins/StdinReader.hs
@@ -18,7 +18,7 @@ import Prelude hiding (catch)
import System.Posix.Process
import System.Exit
import System.IO
-import Control.Exception (catch)
+import Control.Exception (SomeException(..),catch)
import Plugins
data StdinReader = StdinReader
@@ -26,7 +26,7 @@ data StdinReader = StdinReader
instance Exec StdinReader where
start StdinReader cb = do
- cb =<< catch (hGetLineSafe stdin) (\e -> do hPrint stderr e; return "")
+ cb =<< catch (hGetLineSafe stdin) (\(SomeException e) -> do hPrint stderr e; return "")
eof <- hIsEOF stdin
if eof
then exitImmediately ExitSuccess
diff --git a/Xmobar.hs b/Xmobar.hs
index 2380fd1..54daa06 100644
--- a/Xmobar.hs
+++ b/Xmobar.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
-----------------------------------------------------------------------------
-- |
-- Module : Xmobar
@@ -41,7 +42,7 @@ import Control.Exception hiding (handle)
import Data.Bits
import Data.Char
import Data.Maybe(fromMaybe)
-
+import Data.Typeable (Typeable)
import Config
import Parsers
@@ -69,12 +70,15 @@ data XConf =
runX :: XConf -> X () -> IO ()
runX xc f = runReaderT f xc
+data WakeUp = WakeUp deriving (Show,Typeable)
+instance Exception WakeUp
+
-- | The event loop
eventLoop :: XConf -> [(Maybe ThreadId, TVar String)] -> IO ()
eventLoop xc@(XConf d _ w fs c) v = block $ do
tv <- atomically $ newTVar []
t <- myThreadId
- ct <- forkIO (checker t tv "" `catch` \_ -> return ())
+ ct <- forkIO (checker t tv "" `catch` \(SomeException _) -> return ())
go tv ct
where
-- interrupt the drawing thread every time a var is updated
@@ -84,14 +88,14 @@ eventLoop xc@(XConf d _ w fs c) v = block $ do
guard (nv /= ov)
writeTVar tvar nv
return nv
- throwDynTo t ()
+ throwTo t WakeUp
checker t tvar nval
-- Continuously wait for a timer interrupt or an expose event
go tv ct = do
- catchDyn (unblock $ allocaXEvent $ \e ->
- handle tv ct =<< (nextEvent' d e >> getEvent e))
- (\() -> runX xc (updateWin tv) >> return ())
+ catch (unblock $ allocaXEvent $ \e ->
+ handle tv ct =<< (nextEvent' d e >> getEvent e))
+ (\WakeUp -> runX xc (updateWin tv) >> return ())
go tv ct
-- event hanlder
diff --git a/xmobar.cabal b/xmobar.cabal
index c48ae06..0d49eda 100644
--- a/xmobar.cabal
+++ b/xmobar.cabal
@@ -39,7 +39,7 @@ executable xmobar
ghc-options: -O0
if flag(small_base)
- build-depends: base >= 3, base < 4, containers, process, old-time, old-locale, bytestring, directory
+ build-depends: base == 4.*, containers, process, old-time, old-locale, bytestring, directory
else
build-depends: base < 3