aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/XMobarLog.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Rahm/Desktop/XMobarLog.hs')
-rw-r--r--src/Rahm/Desktop/XMobarLog.hs47
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