------------------------------------------------------------------------------
-- |
-- Module : Dzen
-- Copyright : (c) Mads N Noe 2009
-- Maintainer : mntnoe (@) gmail.com
-- License : as-is
--
-- Functions for spawning dzen instances.
--
------------------------------------------------------------------------------
module Dzen (
spawnDzenWithPipe,
spawnDzenWithConky,
dzen
) where
-- Haskell modules
import Control.Monad
import Data.List
import Foreign.C.Types (CInt)
import GHC.IOBase (Handle)
import System.Cmd
import System.Environment (getEnv)
import System.Posix.Files(fileExist)
-- XMonad modules
import Control.Monad
import Graphics.X11.Xlib.Display
import XMonad (spawn)
import XMonad.Prompt
import XMonad.Util.Run(spawnPipe)
-- My modules
import Util (Host (Desktop, Laptop))
-- | Spawn two dzen instances at the top of the screen, reading input
-- from xmonad and hbar respectively.
spawnDzenWithPipe :: Host -> XPConfig -> IO Handle
spawnDzenWithPipe host xpc = do
(sw, sh) <- getScreenDim
let w = 300
system $ hbar host ++ dzen xpc
Nothing -- put dzen at the top of the screen
(sw - w) -- horizontal position
w -- horizontal width
'r' -- text align
actions ++ " &"
spawnPipe $ dzen xpc
Nothing -- put dzen at the top of the screen
0 -- horizontal position
(sw - w) -- horizontal width
'l' -- text align
actions
where
-- Show battery info only on the laptop.
hbar Desktop = "hbar -cmt | "
hbar Laptop = "hbar -cmbt | "
-- Mouse clicking cycles between populated workspaces. xmcli is my
-- ServerMode client.
actions = "button3=exec:xmcli 2;button1=exec:xmcli 3"
-- | Spawn a dzen instance at the bottom of the screen using conky for input.
spawnDzenWithConky :: XPConfig -> FilePath -> IO ()
spawnDzenWithConky xpc conkyrc = do
(sw, sh) <- getScreenDim
let dest = dzen xpc
(Just sh) -- put dzen at the bottom of the screen
0 -- horizontal position
sw -- horizontal width
'c' -- text align
"" -- no actions
fileExist conkyrc >>= (flip when $ do_ $ system $ dzenWithConky conkyrc dest)
where
do_ x = x >> return ()
dzenWithConky conkyrc dest = intercalate " " ["conky-cli -c", conkyrc, "|", dest, "&"]
-- | Return a string that launches dzen with the given configuration.
dzen :: Num a => XPConfig -- ^ prompt style configuration
-> Maybe a -- ^ Nothing: put dzen at the top of the screen
-- Just h: put dzen at the bottom of the screen with height h
-> a -- ^ horizontal position
-> a -- ^ horizontal width
-> Char -- ^ text align
-> String -- ^ actions
-> String
dzen xpc mh x w ta e =
let y = case mh of
Nothing -> 0
Just h -> h - (fromInteger $ toInteger $ height xpc) in
intercalate " "
[ "dzen2"
, "-x" , show x
, "-w" , show w
, "-y" , show y
, "-h" , show $ height xpc
, "-fn" , quote $ font xpc
, "-bg" , quote $ bgColor xpc
, "-fg" , quote $ fgColor xpc
, "-ta" , [ta]
, "-e" , quote e
]
where
quote x = "'" ++ x ++ "'"
-- | Return the dimensions of the (primary?) screen.
getScreenDim :: IO (CInt, CInt)
getScreenDim = do
d <- openDisplay ""
let s = defaultScreen d
w = displayWidth d s
h = displayHeight d s
closeDisplay d
return (w, h)