From 43a880fbbcbd76ad103cf0633bd7bb8a74077556 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 22 Nov 2022 00:20:28 -0700 Subject: Better implementation of the pending buffer. Still need to iron out some bugs. --- src/Rahm/Desktop/XMobarLog.hs | 47 ++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'src/Rahm/Desktop/XMobarLog.hs') 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 " " + tell $ printf " " pendingBufferColor tell pendingBuffer - tell " " + tell "" tell " " tell (toChangeLayoutAction layoutXpm) @@ -132,6 +143,18 @@ xMobarLogHook = do logLevelToXMobar Fatal = "[Fatal] " 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 -- cgit