From 05554f239c79d738848f5453b16b8ad01e9a5f50 Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Sun, 14 Sep 2014 14:28:26 +0400 Subject: Add iconRoot config option For all if path does not start with "/", "./", "../" it will have iconRoot ++ "/" prepended to it. --- readme.md | 8 +++++++- src/Bitmap.hs | 11 ++++++++--- src/Config.hs | 2 ++ src/Parsers.hs | 6 ++++-- src/Xmobar.hs | 2 +- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index 746aead..1cc1d00 100644 --- a/readme.md +++ b/readme.md @@ -319,6 +319,11 @@ Other configuration options: `borderWidth` : Border width in pixels. +`iconRoot` +: Root folder where icons are stored. For + if path start with `"/"`, `"./"` or `"../"` it is interpreted as it is. + Otherwise it will have `iconRoot ++ "/"` prepended to it. Default is `"."`. + `commands` : For setting the options of the programs to run (optional). @@ -495,7 +500,8 @@ form: which will produce the expected result. Accepted image formats are XBM -and XPM (when `with_xpm` flag is enabled). +and XPM (when `with_xpm` flag is enabled). If path does not start with +`"/"`, `"./"`, `"../"` it will have `iconRoot ++ "/"` prepended to it. It's also possible to use action directives of the form: diff --git a/src/Bitmap.hs b/src/Bitmap.hs index ff79262..63baf6a 100644 --- a/src/Bitmap.hs +++ b/src/Bitmap.hs @@ -23,6 +23,7 @@ import Control.Monad.Trans(MonadIO(..)) import Data.Map hiding (foldr, map, filter) import Graphics.X11.Xlib import System.Directory (doesFileExist) +import System.FilePath (()) import System.Mem.Weak ( addFinalizer ) import ColorCache import Parsers (Widget(..)) @@ -41,15 +42,19 @@ data Bitmap = Bitmap { width :: Dimension , bitmapType :: BitmapType } -updateCache :: Display -> Window -> Map FilePath Bitmap -> +updateCache :: Display -> Window -> Map FilePath Bitmap -> FilePath -> [[(Widget, String, Maybe [Action])]] -> IO (Map FilePath Bitmap) -updateCache dpy win cache ps = do +updateCache dpy win cache iconRoot ps = do let paths = map (\(Icon p, _, _) -> p) . concatMap (filter icons) $ ps icons (Icon _, _, _) = True icons _ = False + expandPath path@('/':_) = path + expandPath path@('.':'/':_) = path + expandPath path@('.':'.':'/':_) = path + expandPath path = iconRoot path go m path = if member path m then return m - else do bitmap <- loadBitmap dpy win path + else do bitmap <- loadBitmap dpy win $ expandPath path return $ maybe m (\b -> insert path b m) bitmap foldM go cache paths diff --git a/src/Config.hs b/src/Config.hs index e7c25ad..3514e50 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -67,6 +67,7 @@ data Config = -- 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 @@ -118,6 +119,7 @@ defaultConfig = , allDesktops = True , overrideRedirect = True , pickBroadest = False + , iconRoot = "." , commands = [ Run $ Date "%a %b %_d %Y * %H:%M:%S" "theDate" 10 , Run StdinReader] , sepChar = "%" diff --git a/src/Parsers.hs b/src/Parsers.hs index 5e6f4d6..dceb4b7 100644 --- a/src/Parsers.hs +++ b/src/Parsers.hs @@ -201,14 +201,15 @@ parseConfig = runParser parseConf fields "Config" . stripComments <$?> pFont <|?> pBgColor <|?> pFgColor <|?> pPosition <|?> pBorder <|?> pBdColor <|?> pBdWidth <|?> pHideOnStart <|?> pAllDesktops <|?> pOverrideRedirect <|?> pPickBroadest - <|?> pLowerOnStart <|?> pPersistent + <|?> pLowerOnStart <|?> pPersistent <|?> pIconRoot <|?> pCommands <|?> pSepChar <|?> pAlignSep <|?> pTemplate fields = [ "font", "bgColor", "fgColor", "sepChar", "alignSep" , "border", "borderColor" ,"template", "position" , "allDesktops", "overrideRedirect", "pickBroadest" - , "hideOnStart", "lowerOnStart", "persistent", "commands" + , "hideOnStart", "lowerOnStart", "persistent", "iconRoot" + , "commands" ] pFont = strField font "font" @@ -228,6 +229,7 @@ parseConfig = runParser parseConf fields "Config" . stripComments pAllDesktops = readField allDesktops "allDesktops" pOverrideRedirect = readField overrideRedirect "overrideRedirect" pPickBroadest = readField pickBroadest "pickBroadest" + pIconRoot = readField iconRoot "iconRoot" pCommands = field commands "commands" readCommands diff --git a/src/Xmobar.hs b/src/Xmobar.hs index 91245e2..33feeb0 100644 --- a/src/Xmobar.hs +++ b/src/Xmobar.hs @@ -151,7 +151,7 @@ eventLoop tv xc@(XConf d r w fs is cfg) as signal = do case typ of Wakeup -> do str <- updateString cfg tv - xc' <- updateCache d w is str >>= \c -> return xc { iconS = c } + xc' <- updateCache d w is (iconRoot cfg) str >>= \c -> return xc { iconS = c } as' <- updateActions xc r str runX xc' $ drawInWin r str eventLoop tv xc' as' signal -- cgit v1.2.3