{-# LANGUAGE MultiWayIf #-}
module XMonad.Util.Loggers (
Logger
, aumixVolume
, battery
, date
, loadAvg
, maildirNew, maildirUnread
, logCmd , logFileCount
, logCurrent, logLayout
, logTitle, logTitles, logTitles'
, logClassname, logClassnames, logClassnames'
, logConst, logDefault, (.|)
, logCurrentOnScreen, logLayoutOnScreen
, logTitleOnScreen, logClassnameOnScreen, logWhenActive
, logTitlesOnScreen, logTitlesOnScreen'
, logClassnamesOnScreen, logClassnamesOnScreen'
, TitlesFormat(..)
, ClassnamesFormat(..)
, onLogger
, wrapL, fixedWidthL
, logSp, padL
, shortenL
, dzenColorL, xmobarColorL
) where
import XMonad (Default, gets, liftIO, Window)
import XMonad.Core
import qualified XMonad.StackSet as W
import XMonad.Hooks.StatusBar.PP
import XMonad.Hooks.UrgencyHook (readUrgents)
import XMonad.Util.Font (Align (..))
import XMonad.Util.NamedWindows (getName, getNameWMClass)
import Control.Exception as E
import XMonad.Prelude (find, fromMaybe, isPrefixOf, isSuffixOf, WindowScreen)
import Data.Time (defaultTimeLocale, formatTime, getCurrentTime)
import System.Directory (getDirectoryContents)
import System.IO (hGetLine)
import System.Process (runInteractiveCommand)
econst :: Monad m => a -> IOException -> m a
econst :: forall (m :: * -> *) a. Monad m => a -> IOException -> m a
econst = forall a b. a -> b -> a
const forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return
type Logger = X (Maybe String)
aumixVolume :: Logger
aumixVolume :: Logger
aumixVolume = String -> Logger
logCmd String
"aumix -vq"
battery :: Logger
battery :: Logger
battery = String -> Logger
logCmd String
"acpi | sed -r 's/.*?: (.*%).*/\\1/; s/[dD]ischarging, ([0-9]+%)/\\1-/; s/[cC]harging, ([0-9]+%)/\\1+/; s/[cC]harged, //'"
date :: String -> Logger
date :: String -> Logger
date String
fmt = forall (m :: * -> *) a. MonadIO m => IO a -> m a
io forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t. FormatTime t => TimeLocale -> String -> t -> String
formatTime TimeLocale
defaultTimeLocale String
fmt forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime
getCurrentTime
loadAvg :: Logger
loadAvg :: Logger
loadAvg = String -> Logger
logCmd String
"uptime | sed 's/.*: //; s/,//g'"
logCmd :: String -> Logger
logCmd :: String -> Logger
logCmd String
c = forall (m :: * -> *) a. MonadIO m => IO a -> m a
io forall a b. (a -> b) -> a -> b
$ do (Handle
_, Handle
out, Handle
_, ProcessHandle
_) <- String -> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveCommand String
c
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just (Handle -> IO String
hGetLine Handle
out) forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`E.catch` forall (m :: * -> *) a. Monad m => a -> IOException -> m a
econst forall a. Maybe a
Nothing
logFileCount :: FilePath
-> (String -> Bool)
-> Logger
logFileCount :: String -> (String -> Bool) -> Logger
logFileCount String
d String -> Bool
p = do
[String]
c <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO ( String -> IO [String]
getDirectoryContents String
d)
let n :: Int
n = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
Prelude.filter String -> Bool
p [String]
c
case Int
n of
Int
0 -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Int
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show Int
n
maildirUnread :: FilePath -> Logger
maildirUnread :: String -> Logger
maildirUnread String
mdir = String -> (String -> Bool) -> Logger
logFileCount (String
mdir forall a. [a] -> [a] -> [a]
++ String
"/cur/") (forall a. Eq a => [a] -> [a] -> Bool
isSuffixOf String
",")
maildirNew :: FilePath -> Logger
maildirNew :: String -> Logger
maildirNew String
mdir = String -> (String -> Bool) -> Logger
logFileCount (String
mdir forall a. [a] -> [a] -> [a]
++ String
"/new/") (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Eq a => [a] -> [a] -> Bool
isPrefixOf String
".")
fetchWindowTitle :: Window -> X String
fetchWindowTitle :: Window -> X String
fetchWindowTitle = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Show a => a -> String
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. Window -> X NamedWindow
getName
logTitle :: Logger
logTitle :: Logger
logTitle = (Window -> X String) -> Logger
logWindowInfoFocusedWindow Window -> X String
fetchWindowTitle
logTitlesOnScreen
:: ScreenId
-> (String -> String)
-> (String -> String)
-> Logger
logTitlesOnScreen :: ScreenId -> (String -> String) -> (String -> String) -> Logger
logTitlesOnScreen ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc =
(Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
fetchWindowTitle ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUnfoc
logTitlesOnScreen' :: ScreenId -> TitlesFormat -> Logger
logTitlesOnScreen' :: ScreenId -> TitlesFormat -> Logger
logTitlesOnScreen' ScreenId
sid (TitlesFormat String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg) =
(Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
fetchWindowTitle ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg
logTitles :: (String -> String) -> (String -> String) -> Logger
logTitles :: (String -> String) -> (String -> String) -> Logger
logTitles String -> String
formatFoc String -> String
formatUnfoc =
(Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen Window -> X String
fetchWindowTitle String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUnfoc
logTitles' :: TitlesFormat -> Logger
logTitles' :: TitlesFormat -> Logger
logTitles' (TitlesFormat String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg) =
(Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen Window -> X String
fetchWindowTitle String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg
data TitlesFormat = TitlesFormat
{ TitlesFormat -> String -> String
focusedFormat :: String -> String
, TitlesFormat -> String -> String
unfocusedFormat :: String -> String
, TitlesFormat -> String -> String
urgentFormat :: String -> String
}
instance Default TitlesFormat where
def :: TitlesFormat
def = TitlesFormat
{ focusedFormat :: String -> String
focusedFormat = String -> String
xmobarFocusedFormat
, unfocusedFormat :: String -> String
unfocusedFormat = String -> String
xmobarWsFormat
, urgentFormat :: String -> String
urgentFormat = String -> String
xmobarUrgentFormat
}
fetchWindowClassname :: Window -> X String
fetchWindowClassname :: Window -> X String
fetchWindowClassname = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Show a => a -> String
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. Window -> X NamedWindow
getNameWMClass
logClassname :: Logger
logClassname :: Logger
logClassname = (Window -> X String) -> Logger
logWindowInfoFocusedWindow Window -> X String
fetchWindowClassname
logClassnamesOnScreen
:: ScreenId
-> (String -> String)
-> (String -> String)
-> Logger
logClassnamesOnScreen :: ScreenId -> (String -> String) -> (String -> String) -> Logger
logClassnamesOnScreen ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc =
(Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
fetchWindowClassname ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUnfoc
logClassnamesOnScreen' :: ScreenId -> ClassnamesFormat -> Logger
logClassnamesOnScreen' :: ScreenId -> ClassnamesFormat -> Logger
logClassnamesOnScreen' ScreenId
sid (ClassnamesFormat String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg) =
(Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
fetchWindowClassname ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg
logClassnames :: (String -> String) -> (String -> String) -> Logger
logClassnames :: (String -> String) -> (String -> String) -> Logger
logClassnames String -> String
formatFoc String -> String
formatUnfoc =
(Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen Window -> X String
fetchWindowClassname String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUnfoc
logClassnames' :: ClassnamesFormat -> Logger
logClassnames' :: ClassnamesFormat -> Logger
logClassnames' (ClassnamesFormat String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg) =
(Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen Window -> X String
fetchWindowClassname String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg
data ClassnamesFormat = ClassnamesFormat
{ ClassnamesFormat -> String -> String
focusedFormatClassname :: String -> String
, ClassnamesFormat -> String -> String
unfocusedFormatClassname :: String -> String
, ClassnamesFormat -> String -> String
urgentFormatClassname :: String -> String
}
instance Default ClassnamesFormat where
def :: ClassnamesFormat
def = ClassnamesFormat
{ focusedFormatClassname :: String -> String
focusedFormatClassname = String -> String
xmobarFocusedFormat
, unfocusedFormatClassname :: String -> String
unfocusedFormatClassname = String -> String
xmobarWsFormat
, urgentFormatClassname :: String -> String
urgentFormatClassname = String -> String
xmobarUrgentFormat
}
logWindowInfoOnScreen
:: (Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen :: (Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
getWindowInfo ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg =
((WindowScreen -> Logger) -> ScreenId -> Logger
`withScreen` ScreenId
sid) forall a b. (a -> b) -> a -> b
$ \WindowScreen
screen -> do
let focWin :: Maybe Window
focWin = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Stack a -> a
W.focus forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> Maybe (Stack a)
W.stack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace forall a b. (a -> b) -> a -> b
$ WindowScreen
screen
[Window]
urgWins <- X [Window]
readUrgents
(Window -> X String)
-> WindowScreen -> (Window -> String -> String) -> Logger
logWindowInfoOnScreenWorker Window -> X String
getWindowInfo WindowScreen
screen forall a b. (a -> b) -> a -> b
$ \Window
win String
name ->
if | forall a. a -> Maybe a
Just Window
win forall a. Eq a => a -> a -> Bool
== Maybe Window
focWin -> String -> String
formatFoc String
name
| Window
win forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Window]
urgWins -> String -> String
formatUrg String
name
| Bool
otherwise -> String -> String
formatUnfoc String
name
logWindowInfoOnScreenWorker
:: (Window -> X String)
-> WindowScreen
-> (Window -> String -> String)
-> Logger
logWindowInfoOnScreenWorker :: (Window -> X String)
-> WindowScreen -> (Window -> String -> String) -> Logger
logWindowInfoOnScreenWorker Window -> X String
getWindowInfo WindowScreen
screen Window -> String -> String
logger = do
let wins :: [Window]
wins = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] forall a. Stack a -> [a]
W.integrate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> Maybe (Stack a)
W.stack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace forall a b. (a -> b) -> a -> b
$ WindowScreen
screen
[String]
winNames <- forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Window -> X String
getWindowInfo [Window]
wins
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Window -> String -> String
logger [Window]
wins [String]
winNames
logWindowInfoFocusedScreen
:: (Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen :: (Window -> X String)
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoFocusedScreen Window -> X String
getWindowInfo String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg = do
ScreenId
sid <- forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets forall a b. (a -> b) -> a -> b
$ forall i l a sid sd. Screen i l a sid sd -> sid
W.screen forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. StackSet i l a sid sd -> Screen i l a sid sd
W.current forall b c a. (b -> c) -> (a -> b) -> a -> c
. XState -> WindowSet
windowset
(Window -> X String)
-> ScreenId
-> (String -> String)
-> (String -> String)
-> (String -> String)
-> Logger
logWindowInfoOnScreen Window -> X String
getWindowInfo ScreenId
sid String -> String
formatFoc String -> String
formatUnfoc String -> String
formatUrg
logWindowInfoFocusedWindow :: (Window -> X String) -> Logger
logWindowInfoFocusedWindow :: (Window -> X String) -> Logger
logWindowInfoFocusedWindow Window -> X String
getWindowInfo = forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Window -> X String
getWindowInfo forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a s sd. StackSet i l a s sd -> Maybe a
W.peek
xmobarWsFormat, xmobarFocusedFormat, xmobarUrgentFormat :: String -> String
xmobarWsFormat :: String -> String
xmobarWsFormat = String -> String
xmobarRaw forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
shorten Int
30 forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
xmobarStrip
xmobarFocusedFormat :: String -> String
xmobarFocusedFormat = String -> String -> String -> String
wrap String
"[" String
"]" forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
xmobarWsFormat
xmobarUrgentFormat :: String -> String
xmobarUrgentFormat = String -> String -> String -> String
wrap String
"!" String
"!" forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
xmobarWsFormat
logLayout :: Logger
logLayout :: Logger
logLayout = forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {i} {a} {sid} {sd}.
StackSet i (Layout Window) a sid sd -> String
ld
where ld :: StackSet i (Layout Window) a sid sd -> String
ld = forall (layout :: * -> *) a.
LayoutClass layout a =>
layout a -> String
description forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> l
W.layout forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. StackSet i l a sid sd -> Screen i l a sid sd
W.current
logCurrent :: Logger
logCurrent :: Logger
logCurrent = forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a s sd. StackSet i l a s sd -> i
W.currentTag
logConst :: String -> Logger
logConst :: String -> Logger
logConst = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just
logDefault :: Logger -> Logger -> Logger
logDefault :: Logger -> Logger -> Logger
logDefault Logger
l Logger
d = Logger
l forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe Logger
d String -> Logger
logConst
(.|) :: Logger -> Logger -> Logger
.| :: Logger -> Logger -> Logger
(.|) = Logger -> Logger -> Logger
logDefault
logWhenActive :: ScreenId -> Logger -> Logger
logWhenActive :: ScreenId -> Logger -> Logger
logWhenActive ScreenId
n Logger
l = do
ScreenId
c <- forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> sid
W.screen forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. StackSet i l a sid sd -> Screen i l a sid sd
W.current
if ScreenId
n forall a. Eq a => a -> a -> Bool
== ScreenId
c then Logger
l else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
logTitleOnScreen :: ScreenId -> Logger
logTitleOnScreen :: ScreenId -> Logger
logTitleOnScreen = (Window -> X String) -> ScreenId -> Logger
logWindowInfoFocusedWindowOnScreen Window -> X String
fetchWindowTitle
logClassnameOnScreen :: ScreenId -> Logger
logClassnameOnScreen :: ScreenId -> Logger
logClassnameOnScreen = (Window -> X String) -> ScreenId -> Logger
logWindowInfoFocusedWindowOnScreen Window -> X String
fetchWindowClassname
logWindowInfoFocusedWindowOnScreen :: (Window -> X String) -> ScreenId -> Logger
logWindowInfoFocusedWindowOnScreen :: (Window -> X String) -> ScreenId -> Logger
logWindowInfoFocusedWindowOnScreen Window -> X String
getWindowInfo =
(WindowScreen -> Logger) -> ScreenId -> Logger
withScreen
forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Window -> X String
getWindowInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Stack a -> a
W.focus forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> Maybe (Stack a)
W.stack
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace
logCurrentOnScreen :: ScreenId -> Logger
logCurrentOnScreen :: ScreenId -> Logger
logCurrentOnScreen = (WindowScreen -> Logger) -> ScreenId -> Logger
withScreen forall a b. (a -> b) -> a -> b
$ String -> Logger
logConst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> i
W.tag forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace
logLayoutOnScreen :: ScreenId -> Logger
logLayoutOnScreen :: ScreenId -> Logger
logLayoutOnScreen =
(WindowScreen -> Logger) -> ScreenId -> Logger
withScreen forall a b. (a -> b) -> a -> b
$ String -> Logger
logConst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (layout :: * -> *) a.
LayoutClass layout a =>
layout a -> String
description forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a. Workspace i l a -> l
W.layout forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> Workspace i l a
W.workspace
withScreen :: (WindowScreen -> Logger) -> ScreenId -> Logger
withScreen :: (WindowScreen -> Logger) -> ScreenId -> Logger
withScreen WindowScreen -> Logger
f ScreenId
n = do
[WindowScreen]
ss <- forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a s sd. StackSet i l a s sd -> [Screen i l a s sd]
W.screens
case forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((forall a. Eq a => a -> a -> Bool
== ScreenId
n) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a sid sd. Screen i l a sid sd -> sid
W.screen) [WindowScreen]
ss of
Just WindowScreen
s -> WindowScreen -> Logger
f WindowScreen
s
Maybe WindowScreen
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing
onLogger :: (String -> String) -> Logger -> Logger
onLogger :: (String -> String) -> Logger -> Logger
onLogger = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
wrapL :: String -> String -> Logger -> Logger
wrapL :: String -> String -> Logger -> Logger
wrapL String
l String
r = (String -> String) -> Logger -> Logger
onLogger forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String
wrap String
l String
r
fixedWidthL :: Align
-> String
-> Int
-> Logger -> Logger
fixedWidthL :: Align -> String -> Int -> Logger -> Logger
fixedWidthL Align
a String
str Int
n Logger
logger = do
Maybe String
mbl <- Logger
logger
let l :: String
l = forall a. a -> Maybe a -> a
fromMaybe String
"" Maybe String
mbl
case Align
a of
Align
AlignCenter -> forall {a}. a -> X (Maybe a)
toL (forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$ forall {t :: * -> *} {a}. Foldable t => t a -> String
padhalf String
l forall a. [a] -> [a] -> [a]
++ String
l forall a. [a] -> [a] -> [a]
++ String
cs)
Align
AlignRight -> forall {a}. a -> X (Maybe a)
toL (forall a. [a] -> [a]
reverse (forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
reverse String
l forall a. [a] -> [a] -> [a]
++ String
cs))
Align
_ -> forall {a}. a -> X (Maybe a)
toL (forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$ String
l forall a. [a] -> [a] -> [a]
++ String
cs)
where
toL :: a -> X (Maybe a)
toL = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just
cs :: String
cs = forall a. [a] -> [a]
cycle String
str
padhalf :: t a -> String
padhalf t a
x = forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
take ((Int
n forall a. Num a => a -> a -> a
- forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
x) forall a. Integral a => a -> a -> a
`div` Int
2) String
cs
logSp :: Int -> Logger
logSp :: Int -> Logger
logSp Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
cycle String
" "
padL :: Logger -> Logger
padL :: Logger -> Logger
padL = (String -> String) -> Logger -> Logger
onLogger String -> String
pad
shortenL :: Int -> Logger -> Logger
shortenL :: Int -> Logger -> Logger
shortenL = (String -> String) -> Logger -> Logger
onLogger forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
shorten
dzenColorL :: String -> String -> Logger -> Logger
dzenColorL :: String -> String -> Logger -> Logger
dzenColorL String
fg String
bg = (String -> String) -> Logger -> Logger
onLogger forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String
dzenColor String
fg String
bg
xmobarColorL :: String -> String -> Logger -> Logger
xmobarColorL :: String -> String -> Logger -> Logger
xmobarColorL String
fg String
bg = (String -> String) -> Logger -> Logger
onLogger forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String
xmobarColor String
fg String
bg