summaryrefslogtreecommitdiffstats
path: root/lib/Phi/Widget.hs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 20:21:30 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 20:21:30 +0200
commit861fa81d8503b64023777ec815845361bbcc2885 (patch)
treec194a5bbd4c839eb4ccf5b933d5abebcb3368385 /lib/Phi/Widget.hs
parent7c0f602343e84823d370c8742716ce6b7a8b9850 (diff)
downloadphi-861fa81d8503b64023777ec815845361bbcc2885.tar
phi-861fa81d8503b64023777ec815845361bbcc2885.zip
Added clock widget
Diffstat (limited to 'lib/Phi/Widget.hs')
-rw-r--r--lib/Phi/Widget.hs33
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/Phi/Widget.hs b/lib/Phi/Widget.hs
index f6703a7..d28c21d 100644
--- a/lib/Phi/Widget.hs
+++ b/lib/Phi/Widget.hs
@@ -1,26 +1,35 @@
{-# LANGUAGE ExistentialQuantification, TypeFamilies, StandaloneDeriving, FlexibleContexts #-}
-module Phi.Widget ( Widget(..)
+module Phi.Widget ( Display
+ , Widget(..)
, WidgetClass(..)
, WidgetState(..)
, separator
, createWidgetState
, layoutWidgets
, renderWidgets
+ , handleMessageWidgets
) where
+import Control.Concurrent
import Control.Monad
+
import Data.Traversable
+import qualified Graphics.X11.Xlib
+
import Graphics.Rendering.Cairo
import Phi.Phi
+type Display = MVar Graphics.X11.Xlib.Display
+
+
class Show a => WidgetClass a where
type WidgetData a :: *
- initialState :: a -> WidgetData a
+ initWidget :: a -> Phi -> Display -> IO (WidgetData a)
minSize :: a -> Int
@@ -47,14 +56,16 @@ data WidgetState = forall a. (WidgetClass a, Show (WidgetData a)) => WidgetState
}
deriving instance Show WidgetState
-createWidgetState :: Widget -> WidgetState
-createWidgetState (Widget w) = WidgetState { stateWidget = w
- , stateX = 0
- , stateY = 0
- , stateWidth = 0
- , stateHeight = 0
- , statePrivateData = initialState w
- }
+createWidgetState :: Phi -> Display -> Widget -> IO WidgetState
+createWidgetState phi disp (Widget w) = do
+ priv <- initWidget w phi disp
+ return WidgetState { stateWidget = w
+ , stateX = 0
+ , stateY = 0
+ , stateWidth = 0
+ , stateHeight = 0
+ , statePrivateData = priv
+ }
layoutWidgets :: [WidgetState] -> Int -> Int -> Int -> Int -> [WidgetState]
layoutWidgets widgets x y width height = snd $ mapAccumL layoutWidgetAndX x widgets
@@ -98,7 +109,7 @@ data Separator = Separator Int Float deriving Show
instance WidgetClass Separator where
type WidgetData Separator = ()
- initialState _ = ()
+ initWidget _ _ _ = return ()
minSize (Separator s _) = s
weight (Separator _ w) = w