diff options
Diffstat (limited to 'lib/Phi/Widgets/Systray.hs')
-rw-r--r-- | lib/Phi/Widgets/Systray.hs | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/Phi/Widgets/Systray.hs b/lib/Phi/Widgets/Systray.hs index 6812018..662c6a7 100644 --- a/lib/Phi/Widgets/Systray.hs +++ b/lib/Phi/Widgets/Systray.hs @@ -47,7 +47,7 @@ data SystrayMessage = AddIcon !Window !Window | RemoveIcon !Window | RenderIcon deriving (Show, Typeable) -instance Widget Systray SystrayState where +instance Widget Systray SystrayState () where initWidget (Systray) phi dispvar = do phi' <- dupPhi phi forkIO $ systrayRunner phi' dispvar @@ -61,15 +61,20 @@ instance Widget Systray SystrayState where weight _ = 0 - render Systray (SystrayState phi systrayScreen reset lastResetRef icons) x y w h screen = case True of - _ | screen == systrayScreen -> do - lastReset <- liftIO $ readIORef lastResetRef - liftIO $ writeIORef lastResetRef reset + render Systray (SystrayState phi systrayScreen reset lastResetRef icons) x y w h screen = do + when (screen == systrayScreen) $ do + lastReset <- readIORef lastResetRef + writeIORef lastResetRef reset forM_ (zip [0..] icons) $ \(i, SystrayIconState midParent window) -> do let x' = x + i*(h+2) sendMessage phi $ RenderIcon midParent window x' y h h (lastReset /= reset) - - | otherwise -> return () + + surface <- createImageSurface FormatARGB32 w h + renderWith surface $ do + setOperator OperatorClear + paint + return [(True, SurfaceSlice 0 surface)] + handleMessage _ priv@(SystrayState phi screen reset lastReset icons) m = case (fromMessage m) of Just (AddIcon midParent window) -> SystrayState phi screen reset lastReset ((SystrayIconState midParent window):icons) |