summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs b/src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs
index 8c1d1ad..5bd9df3 100644
--- a/src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs
+++ b/src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs
@@ -16,9 +16,12 @@ module Xmobar.Plugins.Monitors.MultiCoreTemp (startMultiCoreTemp) where
import Xmobar.Plugins.Monitors.Common
import Control.Monad (filterM)
+import Data.Char (isDigit)
+import Data.List (isPrefixOf)
import System.Console.GetOpt
import System.Directory ( doesDirectoryExist
, doesFileExist
+ , listDirectory
)
-- | Declare Options.
@@ -75,13 +78,32 @@ cTConfig = mkMConfig cTTemplate cTOptions
, "avg" , "avgpc" , "avgbar" , "avgvbar" , "avgipat"
] ++ map (("core" ++) . show) [0 :: Int ..]
+-- | Returns all paths in dir matching the predicate.
+getMatchingPathsInDir :: FilePath -> (String -> Bool) -> IO [FilePath]
+getMatchingPathsInDir dir f = do exists <- doesDirectoryExist dir
+ if exists
+ then do
+ files <- filter f <$> listDirectory dir
+ return $ fmap (\file -> dir ++ "/" ++ file) files
+ else return []
+
+-- | Given a prefix, suffix, and path string, return true if the path string
+-- format is prefix ++ numeric ++ suffix.
+numberedPathMatcher :: String -> String -> String -> Bool
+numberedPathMatcher prefix suffix path =
+ prefix `isPrefixOf` path
+ && not (null digits)
+ && afterDigits == suffix
+ where afterPrefix = drop (length prefix) path
+ digits = takeWhile isDigit afterPrefix
+ afterDigits = dropWhile isDigit afterPrefix
-- | Returns the first coretemp.N path found.
coretempPath :: IO (Maybe String)
-coretempPath = do xs <- filterM doesDirectoryExist ps
- return (if null xs then Nothing else Just $ head xs)
- where ps = [ "/sys/bus/platform/devices/coretemp." ++ show (x :: Int) ++ "/"
- | x <- [0..9] ]
+coretempPath = do ps <- getMatchingPathsInDir "/sys/bus/platform/devices" coretempMatcher
+ xs <- filterM doesDirectoryExist ps
+ return (if null xs then Nothing else Just $ head xs ++ "/")
+ where coretempMatcher = numberedPathMatcher "coretemp." ""
-- | Returns the first hwmonN in coretemp path found or the ones in sys/class.
hwmonPaths :: IO [String]
@@ -89,10 +111,10 @@ hwmonPaths = do p <- coretempPath
let (sc, path) = case p of
Just s -> (False, s)
Nothing -> (True, "/sys/class/")
- let cps = [ path ++ "hwmon/hwmon" ++ show (x :: Int) ++ "/"
- | x <- [0..9] ]
+ cps <- getMatchingPathsInDir (path ++ "hwmon") hwmonMatcher
ecps <- filterM doesDirectoryExist cps
return $ if sc || null ecps then ecps else [head ecps]
+ where hwmonMatcher = numberedPathMatcher "hwmon" ""
-- | Checks Labels, if they refer to a core and returns Strings of core-
-- temperatures.
@@ -100,11 +122,11 @@ corePaths :: Maybe String -> IO [String]
corePaths s = do ps <- case s of
Just pth -> return [pth]
_ -> hwmonPaths
- let cps = [p ++ "temp" ++ show (x :: Int) ++ "_label"
- | x <- [0..9], p <- ps ]
+ cps <- concat <$> traverse (flip getMatchingPathsInDir corePathMatcher) ps
ls <- filterM doesFileExist cps
cls <- filterM isLabelFromCore ls
return $ map labelToCore cls
+ where corePathMatcher = numberedPathMatcher "temp" "_label"
-- | Checks if Label refers to a core.
isLabelFromCore :: FilePath -> IO Bool