summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar/App/Config.hs
blob: 48209d3ed00285ff0181620c183eff71890939a6 (plain)
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
------------------------------------------------------------------------------
-- |
-- Module: Xmobar.Config.Defaults
-- Copyright: (c) 2018, 2019 Jose Antonio Ortega Ruiz
-- License: BSD3-style (see LICENSE)
--
-- Maintainer: jao@gnu.org
-- Stability: unstable
-- Portability: portable
-- Created: Sun Nov 25, 2018 22:26
--
--
-- Default values for Xmobar configurations and functions to access
-- configuration files and directories.
--
------------------------------------------------------------------------------


module Xmobar.App.Config (defaultConfig,
                          xmobarConfigDir,
                          xmobarDataDir,
                          xmobarConfigFile) where

import Control.Monad (when)

import System.Environment
import System.Directory
import System.FilePath ((</>))
import System.Posix.Files (fileExist)

import Xmobar.Plugins.Date
import Xmobar.Plugins.StdinReader
import Xmobar.Config.Types
import Xmobar.Run.Runnable

-- | 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>"
           , verbose = False
           }

-- | Return the path to the xmobar configuration directory.  This
-- directory is where user configuration files are stored (e.g, the
-- xmobar.hs file).  You may also create a @lib@ subdirectory in the
-- configuration directory and the default recompile command will add
-- it to the GHC include path.
--
-- Several directories are considered.  In order of
-- preference:
--
--   1. The directory specified in the @XMOBAR_CONFIG_DIR@ environment variable.
--   2. The @~\/.xmobar@ directory.
--   3. The @XDG_CONFIG_HOME/xmobar@ directory.
--
-- The first directory that exists will be used.  If none of the
-- directories exist then (1) will be used if it is set, otherwise (2)
-- will be used.
xmobarConfigDir :: IO String
xmobarConfigDir =
    findFirstDirWithEnv False "XMOBAR_CONFIG_DIR"
      [ getAppUserDataDirectory "xmobar"
      , getXdgDirectory XdgConfig "xmobar"
      ]

-- | Return the path to the xmobar data directory.  This directory is
-- used by Xmobar to store data files such as the run-time state file
-- and the configuration binary generated by GHC.
--
-- Several directories are considered.  In order of preference:
--
--   1. The directory specified in the @XMOBAR_DATA_DIR@ environment variable.
--   2. The @XDG_DATA_HOME/xmobar@ directory.
--   3. The @~\/.xmobar@ directory.
--
-- The first directory that exists will be used.  If none of the
-- directories exist then (1) will be used if it is set, otherwise (2)
-- will be used.  Either way, a directory will be created if
-- necessary.
xmobarDataDir :: IO String
xmobarDataDir =
    findFirstDirWithEnv True "XMOBAR_DATA_DIR"
      [ getXdgDirectory XdgData "xmobar"
      , getAppUserDataDirectory "xmobar"
      ]

-- | Helper function that will find the first existing directory and
-- return its path.  If none of the directories can be found,
-- optionally create and return the first from the list.  If the list
-- is empty this function returns the historical @~\/.xmobar@
-- directory.
findFirstDirOf :: Bool -> [IO FilePath] -> IO FilePath
findFirstDirOf create [] = findFirstDirOf create [getAppUserDataDirectory "xmobar"]
findFirstDirOf create possibles = do
    found <- go possibles
    case found of
      Just path -> return path
      Nothing ->  do
        primary <- head possibles
        when create (createDirectoryIfMissing True primary)
        return primary
  where
    go [] = return Nothing
    go (x:xs) = do
      exists <- x >>= doesDirectoryExist
      if exists then x >>= return . Just else go xs

-- | Simple wrapper around @findFirstDirOf@ that allows the primary
-- path to be specified by an environment variable.
findFirstDirWithEnv :: Bool -> String -> [IO FilePath] -> IO FilePath
findFirstDirWithEnv create envName paths = do
    envPath' <- lookupEnv envName
    case envPath' of
      Nothing -> findFirstDirOf create paths
      Just envPath -> findFirstDirOf create (return envPath:paths)

xmobarConfigFile :: IO (Maybe FilePath)
xmobarConfigFile =
  ffirst [ xdg "xmobar.hs", xdg "xmobarrc", home ".xmobarrc"]
  where xdg p = fmap (</> p) xmobarConfigDir
        home p = fmap (</> p) getHomeDirectory
        ffirst [] = return Nothing
        ffirst (f:fs) =
          f >>= fileExist >>= \e -> if e then fmap Just f else ffirst fs