It's better not to lock in native code...

This commit is contained in:
Matthias Schiffer 2011-07-15 02:51:50 +02:00
parent 7da8a9114e
commit c6e57070ab
4 changed files with 16 additions and 15 deletions

View file

@ -5,6 +5,7 @@ module Phi.Phi ( Phi
, DefaultMessage(..) , DefaultMessage(..)
, fromMessage , fromMessage
, initPhi , initPhi
, dupPhi
, sendMessage , sendMessage
, receiveMessage , receiveMessage
) where ) where
@ -26,6 +27,9 @@ fromMessage (Message m) = cast m
initPhi :: IO Phi initPhi :: IO Phi
initPhi = liftM Phi newChan initPhi = liftM Phi newChan
dupPhi :: Phi -> IO Phi
dupPhi (Phi chan) = liftM Phi $ dupChan chan
sendMessage :: (Typeable a, Show a) => Phi -> a -> IO () sendMessage :: (Typeable a, Show a) => Phi -> a -> IO ()
sendMessage (Phi chan) = writeChan chan . Message sendMessage (Phi chan) = writeChan chan . Message

View file

@ -12,24 +12,24 @@ module Phi.Widget ( Display(..)
, handleMessageWidgets , handleMessageWidgets
) where ) where
import Control.Concurrent.MVar
import Control.Monad import Control.Monad
import Data.Traversable import Data.Traversable
import qualified Graphics.X11.Xlib import qualified Graphics.X11.Xlib
import Graphics.Rendering.Cairo import Graphics.Rendering.Cairo
import Phi.Phi import Phi.Phi
newtype Display = Display Graphics.X11.Xlib.Display newtype Display = Display (MVar Graphics.X11.Xlib.Display)
withDisplay :: Display -> (Graphics.X11.Xlib.Display -> IO a) -> IO a withDisplay :: Display -> (Graphics.X11.Xlib.Display -> IO a) -> IO a
withDisplay (Display disp) f = do withDisplay (Display dispvar) f = do
Graphics.X11.Xlib.lockDisplay disp disp <- takeMVar dispvar
a <- f disp a <- f disp
Graphics.X11.Xlib.unlockDisplay disp putMVar dispvar disp
return a return a
@ -65,7 +65,8 @@ deriving instance Show WidgetState
createWidgetState :: Phi -> Display -> Widget -> IO WidgetState createWidgetState :: Phi -> Display -> Widget -> IO WidgetState
createWidgetState phi disp (Widget w) = do createWidgetState phi disp (Widget w) = do
priv <- initWidget w phi disp phi' <- dupPhi phi
priv <- initWidget w phi' disp
return WidgetState { stateWidget = w return WidgetState { stateWidget = w
, stateX = 0 , stateX = 0
, stateY = 0 , stateY = 0

View file

@ -38,9 +38,6 @@ instance WidgetClass Taskbar where
type WidgetData Taskbar = TaskbarState type WidgetData Taskbar = TaskbarState
initWidget (Taskbar _) phi dispvar = do initWidget (Taskbar _) phi dispvar = do
--withMVar dispvar $ \disp ->
-- return ()
return TaskbarState return TaskbarState

View file

@ -64,10 +64,10 @@ runPhiX :: PhiConfig -> PhiState -> PhiX a -> IO (a, PhiState)
runPhiX config st (PhiX a) = runPhiReader config $ runStateT a st runPhiX config st (PhiX a) = runPhiReader config $ runStateT a st
withDisplayX :: Widget.Display -> (Display -> PhiX a) -> PhiX a withDisplayX :: Widget.Display -> (Display -> PhiX a) -> PhiX a
withDisplayX (Widget.Display disp) f = do withDisplayX (Widget.Display dispvar) f = do
liftIO $ lockDisplay disp disp <- liftIO $ takeMVar dispvar
a <- f disp a <- f disp
liftIO $ unlockDisplay disp liftIO $ putMVar dispvar disp
return a return a
defaultXConfig = XConfig { phiXScreenInfo = getScreenInfo defaultXConfig = XConfig { phiXScreenInfo = getScreenInfo
@ -76,7 +76,6 @@ defaultXConfig = XConfig { phiXScreenInfo = getScreenInfo
runPhi :: XConfig -> Panel.PanelConfig -> [Widget.Widget] -> IO () runPhi :: XConfig -> Panel.PanelConfig -> [Widget.Widget] -> IO ()
runPhi xconfig config widgets = do runPhi xconfig config widgets = do
initThreads
phi <- initPhi phi <- initPhi
disp <- openDisplay [] disp <- openDisplay []
@ -89,7 +88,7 @@ runPhi xconfig config widgets = do
screens <- liftIO $ phiXScreenInfo xconfig disp screens <- liftIO $ phiXScreenInfo xconfig disp
let dispvar = Widget.Display disp dispvar <- liftM Widget.Display $ liftIO $ newMVar disp
widgetStates <- liftIO $ mapM (Widget.createWidgetState phi dispvar) widgets widgetStates <- liftIO $ mapM (Widget.createWidgetState phi dispvar) widgets
withDisplayX dispvar $ \disp -> do withDisplayX dispvar $ \disp -> do