From f60a105dbd866cb1ac23fb3277ff42f896c7f056 Mon Sep 17 00:00:00 2001 From: jao Date: Fri, 7 Aug 2020 03:18:34 +0100 Subject: Don't get confused by empty configuration dirs (fixes #313) By checking full paths, instead of just dirs (option 1). --- changelog.md | 3 ++- src/Xmobar/App/Config.hs | 50 +++++++++++++++++------------------------------- 2 files changed, 20 insertions(+), 33 deletions(-) diff --git a/changelog.md b/changelog.md index 6b18fee..a4801b6 100644 --- a/changelog.md +++ b/changelog.md @@ -7,7 +7,8 @@ _New features_ _Bug fixes_ - - Documentation fixes (Tomáš Janoušek). + - Documentation fixes (Tomáš Janoušek) + - Don't get confused by empty configuration dirs (fixes #313) ## Version 0.35.1 (June, 2020) diff --git a/src/Xmobar/App/Config.hs b/src/Xmobar/App/Config.hs index 48209d3..a183128 100644 --- a/src/Xmobar/App/Config.hs +++ b/src/Xmobar/App/Config.hs @@ -1,7 +1,7 @@ ------------------------------------------------------------------------------ -- | -- Module: Xmobar.Config.Defaults --- Copyright: (c) 2018, 2019 Jose Antonio Ortega Ruiz +-- Copyright: (c) 2018, 2019, 2020 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: jao@gnu.org @@ -17,11 +17,10 @@ module Xmobar.App.Config (defaultConfig, - xmobarConfigDir, xmobarDataDir, xmobarConfigFile) where -import Control.Monad (when) +import Control.Monad (when, filterM) import System.Environment import System.Directory @@ -66,29 +65,6 @@ defaultConfig = , 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. @@ -140,11 +116,21 @@ findFirstDirWithEnv create envName paths = do Nothing -> findFirstDirOf create paths Just envPath -> findFirstDirOf create (return envPath:paths) +xmobarInConfigDirs :: FilePath -> IO (Maybe FilePath) +xmobarInConfigDirs fn = do + env <- lookupEnv "XMOBAR_CONFIG_DIR" + xdg <- getXdgDirectory XdgConfig "xmobar" + app <- getAppUserDataDirectory "xmobar" + hom <- getHomeDirectory + let candidates = case env of + Nothing -> [app, xdg, hom] + Just p -> [p, app, xdg, hom] + fs <- filterM (\d -> fileExist (d fn)) candidates + return $ if null fs then Nothing else Just (head fs fn) + 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 + fmap ffirst $ mapM xmobarInConfigDirs ["xmobar.hs", ".xmobarrc", "xmobarrc"] + where ffirst [] = Nothing + ffirst (Nothing:fs) = ffirst fs + ffirst (p:_) = p -- cgit v1.2.3