about summary refs log tree commit diff
path: root/src/lib/XMonad/Custom/Log.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/XMonad/Custom/Log.hs')
-rw-r--r--src/lib/XMonad/Custom/Log.hs82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/lib/XMonad/Custom/Log.hs b/src/lib/XMonad/Custom/Log.hs
new file mode 100644
index 0000000..e9d3c1a
--- /dev/null
+++ b/src/lib/XMonad/Custom/Log.hs
@@ -0,0 +1,82 @@
+-- |
+-- Module                  : XMonad.Custom.Log
+-- Description             : Loggers and statusbar configuration
+-- Copyright               : (c) Azat Bahawi 2018-2021
+-- SPDX-License-Identifier : GPL-3.0-or-later
+-- Maintainer              : azahi@teknik.io
+-- Stability               : experimental
+-- Portability             : non-portable
+--
+
+module XMonad.Custom.Log
+  ( logHook
+  ) where
+
+import           System.IO
+import           XMonad                  hiding ( logHook )
+import           XMonad.Actions.CopyWindow
+import           XMonad.Custom.Theme
+import           XMonad.Hooks.CurrentWorkspaceOnTop
+import           XMonad.Hooks.DynamicLog
+import           XMonad.Hooks.EwmhDesktops
+import           XMonad.Util.NamedScratchpad
+import           XMonad.Util.SpawnNamedPipe
+import           XMonad.Util.WorkspaceCompare
+
+xmobarFont :: Int -> String -> String
+xmobarFont f = wrap (concat ["<fn=", show f, ">"]) "</fn>"
+
+topBarPP :: PP
+topBarPP = def
+  { ppCurrent         = xmobarColor white2 "" . xmobarFont 2 . wrap "=" "="
+  , ppVisible         = xmobarColor white1 "" . wrap "~" "~"
+  , ppHidden          = xmobarColor white1 "" . wrap "-" "-"
+  , ppHiddenNoWindows = xmobarColor white1 "" . wrap "_" "_"
+  , ppUrgent          = xmobarColor red2 "" . wrap "!" "!"
+  , ppSep             = " / "
+  , ppWsSep           = " "
+  , ppTitle           = xmobarColor white1 "" . shorten 50
+  , ppTitleSanitize   = xmobarStrip
+  , ppLayout          = xmobarColor white1 ""
+  , ppOrder           = id
+  , ppSort            = (namedScratchpadFilterOutWorkspace .) <$> getSortByIndex
+  , ppExtras          = []
+  }
+
+botBarPP :: PP
+botBarPP = topBarPP { ppCurrent         = const ""
+                    , ppVisible         = const ""
+                    , ppHidden          = const ""
+                    , ppHiddenNoWindows = const ""
+                    , ppUrgent          = const ""
+                    , ppTitle           = const ""
+                    , ppLayout          = const ""
+                    }
+
+safePrintToPipe :: Maybe Handle -> String -> IO ()
+safePrintToPipe = maybe (\_ -> return ()) hPutStrLn
+
+logHook :: X ()
+logHook = do
+  currentWorkspaceOnTop
+  ewmhDesktopsLogHook
+  t <- getNamedPipe "xmobarTop"
+  b <- getNamedPipe "xmobarBot"
+  c <- wsContainingCopies
+  let copiesCurrent ws
+        | ws `elem` c
+        = xmobarColor yellow2 "" . xmobarFont 2 . wrap "*" "=" $ ws
+        | otherwise
+        = xmobarColor white2 "" . xmobarFont 2 . wrap "=" "=" $ ws
+  let copiesHidden ws
+        | ws `elem` c = xmobarColor yellow1 "" . wrap "*" "-" $ ws
+        | otherwise   = xmobarColor white1 "" . wrap "-" "-" $ ws
+  let copiesUrgent ws
+        | ws `elem` c = xmobarColor yellow2 "" . wrap "*" "!" $ ws
+        | otherwise   = xmobarColor white2 "" . wrap "!" "!" $ ws
+  dynamicLogWithPP $ topBarPP { ppCurrent = copiesCurrent
+                              , ppHidden  = copiesHidden
+                              , ppUrgent  = copiesUrgent
+                              , ppOutput  = safePrintToPipe t
+                              }
+  dynamicLogWithPP $ botBarPP { ppOutput = safePrintToPipe b }

Consider giving Nix/NixOS a try! <3