import XMonad import Control.Exception import XMonad.Hooks.DynamicLog import Control.Concurrent import XMonad.Layout.Spacing import XMonad.Actions.WindowNavigation import XMonad.Util.CustomKeys import System.Directory import System.FilePath import System.Process import Internal.Layout import XMonad.Hooks.ManageHelpers import XMonad.Layout.IndependentScreens import Text.Printf import Data.List.Split import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.ManageDocks import XMonad.Util.Run (spawnPipe) import Control.Monad (when) import System.IO import Internal.Keys import Internal.LayoutDraw import Data.List (partition, isPrefixOf) import Data.Maybe main = do -- Execute some commands. homeDir <- getHomeDirectory let fp = homeDir ".xmonad" "startup" xmproc <- spawnPipe "xmobar" config <- applyKeys $ docks $ def { terminal = "alacritty" , modMask = mod3Mask , borderWidth = 2 , keys = \config -> mempty , focusedBorderColor = "#ff6c00" -- , normalBorderColor = "#ffd9bf" , normalBorderColor = "#000000" , layoutHook = avoidStruts myLayout , startupHook = do ewmhDesktopsStartup spawn fp , manageHook = composeAll [ isFullscreen --> doFullFloat , className =? "Tilda" --> doFloat , className =? "yakuake" --> doFloat , className =? "MPlayer" --> doFloat , title =? "Event Tester" --> doFloat , className =? "mpv" --> doFloat , className =? "gnubby_ssh_prompt" --> doFloat ] , workspaces = map return (['0'..'9'] ++ ['a'..'z']) , handleEventHook = fullscreenEventHook , focusFollowsMouse = False , clickJustFocuses = False , logHook = do (_, _, layout) <- showLayout dynamicLogWithPP $ xmobarPP { ppCurrent = xmobarColor "#ff8888" "red" . printf "%s" , ppVisible = xmobarColor "#8888ff" "" . printf "%s" , ppHidden = xmobarColor "#888888" "" . printf "%s" , ppWsSep = " " , ppTitle = xmobarColor "#a0a0a0" "" . printf "%s" , ppSep = xmobarColor "#404040" "" " │ " , ppLayout = const (fromMaybe "" layout) , ppExtras = [] , ppOutput = hPutStrLn xmproc . reverse . trunc 80 , ppOrder = \ss -> let (icons, etc) = partition (" trunc' True amt as (a : acc) '>' -> trunc' False amt as (a : acc) _ -> if ignore then trunc' True amt as (a : acc) else case amt of 0 -> trunc' False 0 as acc 4 | length as > 3 -> trunc' False 0 as ("... " ++ acc) _ -> trunc' False (amt - 1) as (a : acc) splitOnAll arr str = splitOnAll' arr [str] splitOnAll' [] str = str splitOnAll' (a:as) [str] = splitOnAll' as (splitOn a str) splitOnAll' _ lst = lst