diff options
Diffstat (limited to 'src/Rahm/Desktop/XMobarLog.hs')
| -rw-r--r-- | src/Rahm/Desktop/XMobarLog.hs | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/src/Rahm/Desktop/XMobarLog.hs b/src/Rahm/Desktop/XMobarLog.hs index 7ac8315..62cf7c9 100644 --- a/src/Rahm/Desktop/XMobarLog.hs +++ b/src/Rahm/Desktop/XMobarLog.hs @@ -3,7 +3,8 @@ module Rahm.Desktop.XMobarLog (XMobarLog, spawnXMobar, xMobarLogHook) where import Control.Arrow (second) import Control.Monad (forM_, unless) import Control.Monad.Writer (execWriter, tell) -import Data.Char (isAsciiLower, isAsciiUpper, isDigit) +import Data.Char (isAsciiLower, isAsciiUpper, isDigit, isSpace) +import Data.IORef import Data.List (sortBy) import Data.Maybe (isJust, mapMaybe) import Data.Ord (comparing) @@ -19,7 +20,7 @@ import Text.Printf import XMonad (X) import qualified XMonad as X import XMonad.Util.NamedWindows (getName) -import XMonad.Util.Run (spawnPipe) +import XMonad.Util.Run (runProcessWithInput, spawnPipe) newtype XMobarLog = XMobarLog Handle @@ -43,12 +44,12 @@ spawnXMobar = do -- XMonad Log Hook meant to be used with the XMonad config logHook. xMobarLogHook :: IO (XMobarLog -> X ()) xMobarLogHook = do - -- uname <- readProcess "/usr/bin/uname" ["-r"] "" - let uname = "44444" + unameRef <- newIORef Nothing - return $ \(XMobarLog xmproc) -> do - let pendingBufferFiller = " " + -- (_, uname, _) <- readProcessWithExitCode "/usr/bin/uname" ["-r"] "" + -- putStrLn $ "Uname " ++ uname + return $ \(XMobarLog xmproc) -> do (_, _, layoutXpm) <- drawLayout loglevel <- getLogLevel @@ -57,19 +58,29 @@ xMobarLogHook = do winset <- X.gets X.windowset title <- maybe (pure "") (fmap show . getName) . S.peek $ winset pendingBuffer'' <- getPendingBuffer - let pendingBuffer' = + + uname <- getUname unameRef + + let pendingBufferSize = max 10 $ length uname + + let (pendingBufferColor, pendingBuffer') = if null pendingBuffer'' - then uname - else pendingBuffer'' - let pendingBuffer = take 10 $ reverse (take 10 (reverse pendingBuffer')) ++ repeat ' ' + then ("#a0a0a0", uname) + else ("#f0a0a0,#202020", pendingBuffer'') + let pendingBuffer = + take pendingBufferSize $ + reverse + ( take pendingBufferSize (reverse pendingBuffer') + ) + ++ repeat ' ' let wss = getPopulatedWorkspaces winset let log = trunc 80 $ execWriter $ do - tell " <fc=#a0a0a0><fn=3>" + tell $ printf "<fc=%s><fn=3> " pendingBufferColor tell pendingBuffer - tell "</fn></fc> " + tell "</fn></fc>" tell " " tell (toChangeLayoutAction layoutXpm) @@ -132,6 +143,18 @@ xMobarLogHook = do logLevelToXMobar Fatal = "<fn=3><fc=#888888>[Fatal]</fc></fn> " logLevelToXMobar _ = "" + getUname ref = X.io $ do + s <- readIORef ref + case s of + Nothing -> do + uname' <- runProcessWithInput "uname" ["-r"] "" + + let uname = dropWhile isSpace (reverse $ dropWhile isSpace $ reverse uname') + + writeIORef ref $ Just uname + return uname + Just uname -> return uname + -- Truncate an XMobar string to the provided number of _visible_ characters. -- This is to keep long window titles from overrunning the whole bar. trunc :: Int -> String -> String |