1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
{-# LANGUAGE TypeOperators, CPP #-}
-----------------------------------------------------------------------------
-- |
-- Module : Xmobar.Config
-- Copyright : (c) Andrea Rossato
-- License : BSD-style (see LICENSE)
--
-- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org>
-- Stability : unstable
-- Portability : unportable
--
-- The configuration module of Xmobar, a text based status bar
--
-----------------------------------------------------------------------------
module Xmobar.Config
( -- * Configuration
-- $config
Config (..)
, XPosition (..), Align (..), Border(..)
, defaultConfig
, runnableTypes
, getXdgConfigFile
) where
import System.Environment
import System.Directory (getHomeDirectory)
import System.FilePath ((</>))
import Xmobar.Commands
import {-# SOURCE #-} Xmobar.Runnable
import Xmobar.Plugins.Monitors
import Xmobar.Plugins.Date
import Xmobar.Plugins.PipeReader
import Xmobar.Plugins.BufferedPipeReader
import Xmobar.Plugins.MarqueePipeReader
import Xmobar.Plugins.CommandReader
import Xmobar.Plugins.StdinReader
import Xmobar.Plugins.XMonadLog
import Xmobar.Plugins.EWMH
import Xmobar.Plugins.Kbd
import Xmobar.Plugins.Locks
#ifdef INOTIFY
import Xmobar.Plugins.Mail
import Xmobar.Plugins.MBox
#endif
#ifdef DATEZONE
import Xmobar.Plugins.DateZone
#endif
-- $config
-- Configuration data type and default configuration
-- | The configuration data type
data Config =
Config { font :: String -- ^ Font
, additionalFonts :: [String] -- ^ List of alternative fonts
, wmClass :: String -- ^ X11 WM_CLASS property value
, wmName :: String -- ^ X11 WM_NAME property value
, bgColor :: String -- ^ Backgroud color
, fgColor :: String -- ^ Default font color
, position :: XPosition -- ^ Top Bottom or Static
, textOffset :: Int -- ^ Offset from top of window for text
, textOffsets :: [Int] -- ^ List of offsets for additionalFonts
, iconOffset :: Int -- ^ Offset from top of window for icons
, border :: Border -- ^ NoBorder TopB BottomB or FullB
, borderColor :: String -- ^ Border color
, borderWidth :: Int -- ^ Border width
, alpha :: Int -- ^ Transparency from 0 (transparent) to 255 (opaque)
, hideOnStart :: Bool -- ^ Hide (Unmap) the window on
-- initialization
, allDesktops :: Bool -- ^ Tell the WM to map to all desktops
, overrideRedirect :: Bool -- ^ Needed for dock behaviour in some
-- non-tiling WMs
, pickBroadest :: Bool -- ^ Use the broadest display
-- instead of the first one by
-- default
, lowerOnStart :: Bool -- ^ lower to the bottom of the
-- window stack on initialization
, persistent :: Bool -- ^ Whether automatic hiding should
-- be enabled or disabled
, iconRoot :: FilePath -- ^ Root folder for icons
, commands :: [Runnable] -- ^ For setting the command,
-- the command arguments
-- and refresh rate for the programs
-- to run (optional)
, sepChar :: String -- ^ The character to be used for indicating
-- commands in the output template
-- (default '%')
, alignSep :: String -- ^ Separators for left, center and
-- right text alignment
, template :: String -- ^ The output template
} deriving (Read)
data XPosition = Top
| TopW Align Int
| TopSize Align Int Int
| TopP Int Int
| Bottom
| BottomP Int Int
| BottomW Align Int
| BottomSize Align Int Int
| Static {xpos, ypos, width, height :: Int}
| OnScreen Int XPosition
deriving ( Read, Eq )
data Align = L | R | C deriving ( Read, Eq )
data Border = NoBorder
| TopB
| BottomB
| FullB
| TopBM Int
| BottomBM Int
| FullBM Int
deriving ( Read, Eq )
-- | The default configuration values
defaultConfig :: Config
defaultConfig =
Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"
, additionalFonts = []
, wmClass = "xmobar"
, wmName = "xmobar"
, bgColor = "#000000"
, fgColor = "#BFBFBF"
, alpha = 255
, position = Top
, border = NoBorder
, borderColor = "#BFBFBF"
, borderWidth = 1
, textOffset = -1
, iconOffset = -1
, textOffsets = []
, hideOnStart = False
, lowerOnStart = True
, persistent = False
, allDesktops = True
, overrideRedirect = True
, pickBroadest = False
, iconRoot = "."
, commands = [ Run $ Date "%a %b %_d %Y * %H:%M:%S" "theDate" 10
, Run StdinReader]
, sepChar = "%"
, alignSep = "}{"
, template = "%StdinReader% }{ " ++
"<fc=#00FF00>%uname%</fc> * <fc=#FF0000>%theDate%</fc>"
}
-- | An alias for tuple types that is more convenient for long lists.
type a :*: b = (a, b)
infixr :*:
-- | This is the list of types that can be hidden inside
-- 'Runnable.Runnable', the existential type that stores all commands
-- to be executed by Xmobar. It is used by 'Runnable.readRunnable' in
-- the 'Runnable.Runnable' Read instance. To install a plugin just add
-- the plugin's type to the list of types (separated by ':*:') appearing in
-- this function's type signature.
runnableTypes :: Command :*: Monitors :*: Date :*: PipeReader :*:
BufferedPipeReader :*: CommandReader :*: StdinReader :*:
XMonadLog :*: EWMH :*: Kbd :*: Locks :*:
#ifdef INOTIFY
Mail :*: MBox :*:
#endif
#ifdef DATEZONE
DateZone :*:
#endif
MarqueePipeReader :*: ()
runnableTypes = undefined
xdgConfigDir :: IO String
xdgConfigDir = do env <- getEnvironment
case lookup "XDG_CONFIG_HOME" env of
Just val -> return val
Nothing -> fmap (</> ".config") getHomeDirectory
xmobarConfigDir :: IO FilePath
xmobarConfigDir = fmap (</> "xmobar") xdgConfigDir
getXdgConfigFile :: IO FilePath
getXdgConfigFile = fmap (</> "xmobarrc") xmobarConfigDir
|