{- Copyright 2016 Markus Ongyerth This file is part of Monky. Monky is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Monky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Monky. If not, see . -} {-# LANGUAGE OverloadedStrings #-} {-| Module : Monky.Outputs/Dzen2 Description : Output module for dzen2 Maintainer : ongy Stability : testing Portability : Linux This module provides the output generation for piping into a dzen2 bar -} module Monky.Outputs.Dzen2 ( DzenOutput , getDzenOut , getDzenOut' , getDzenOutDiv ) where import System.Directory(getCurrentDirectory) import System.IO (hFlush, stdout) import Monky.Modules import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.IO as T -- |The output handle for dzen2 pipe data DzenOutput = DzenOutput Int Text MonkyOut doOut :: DzenOutput -> MonkyOut -> IO () doOut _ (MonkyPlain t) = T.putStr t doOut (DzenOutput _ p _) (MonkyImage path _) = do T.putStr ("^i(" `T.append` p) T.putStr path T.putStr ".xbm) " doOut (DzenOutput h _ _) (MonkyBar p) = do T.putStr "^p(3)^p(_TOP)^r(6x" putStr . show $ h - div (h * p) 100 T.putStr ")^pa()" doOut (DzenOutput h _ _) (MonkyHBar p) = do T.putStr "^r(" putStr . show $ p T.putStr ("x" `T.append` (T.pack . show $ h `div` 2) `T.append` ")") -- Reverse colours for HBar to support the way we draw them doOut h (MonkyColor (f, b) (MonkyBar p)) = do T.putStr ("^bg(" `T.append` f `T.append` ")^fg(" `T.append` b `T.append` ")") doOut h (MonkyBar p) T.putStr "^bg()^fg()" doOut h (MonkyColor (f, b) o) = do T.putStr ("^bg(" `T.append` b `T.append` ")^fg(" `T.append` f `T.append` ")") doOut h o T.putStr "^bg()^fg()" doSegment :: DzenOutput -> [MonkyOut] -> IO () doSegment h = mapM_ (doOut h) instance MonkyOutput DzenOutput where doLine _ [] = error "Why are you calling doLine without any modules? I don't think your config makes sense" doLine h [x] = do doSegment h x putStr "\n" hFlush stdout doLine h@(DzenOutput _ _ d) (x:xs) = do doSegment h x doOut h d doLine h xs -- |Get an output handle for dzen2 formatting -- Assumes @" | "@ as divider getDzenOut :: Int -- ^The height of your dzen bar in pixel (required for block-drawing) -> Text -- ^Path to the directory cointaining your .xbm files. -> IO DzenOutput getDzenOut h p = return $ DzenOutput h (T.append p "/") $ MonkyPlain " | " -- |Get the output handle for dzen2 formatting. Will asume your .xbm files are -- in \\/xbm\/ getDzenOut' :: Int -- ^The height of your dzen bar in pixel (for block drawing) -> IO DzenOutput getDzenOut' h = do pwd <- getCurrentDirectory getDzenOut h (T.pack pwd `T.append` "/xbm/") -- |Get an output handle for dzen2 formatting getDzenOutDiv :: Int -- ^The height of your dzen bar in pixel (required for block-drawing) -> Text -- ^Path to the directory containing your .xbm files. -> MonkyOut -- ^Divider -> IO DzenOutput getDzenOutDiv h p d = return $ DzenOutput h (T.append p "/") d