-- xmonad.hs import XMonad import XMonad.Hooks.DynamicLog import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageHelpers import XMonad.Hooks.EwmhDesktops import XMonad.Layout.NoBorders import XMonad.Util.EZConfig (additionalKeysP) import XMonad.Util.SpawnOnce import XMonad.Util.Run (spawnPipe) import qualified XMonad.StackSet as W import qualified Data.Map as M import System.IO (hPutStrLn, Handle) import System.Exit (exitSuccess) import System.Random (randomRIO) ------------------------------------------------------------------------ -- Basic settings ------------------------------------------------------------------------ myModMask :: KeyMask myModMask = mod1Mask myTerminal :: String myTerminal = "urxvt" myBorderWidth :: Dimension myBorderWidth = 1 myNormalBorderColor :: String myNormalBorderColor = "#222222" myFocusedBorderColor :: String myFocusedBorderColor = "#285577" myFocusFollowsMouse :: Bool myFocusFollowsMouse = True ------------------------------------------------------------------------ -- Workspaces ------------------------------------------------------------------------ myWorkspaces :: [String] myWorkspaces = map show [1..10] ------------------------------------------------------------------------ -- Layouts ------------------------------------------------------------------------ myLayout = avoidStruts $ smartBorders $ tiled ||| Mirror tiled ||| Full where tiled = Tall nmaster delta ratio nmaster = 1 ratio = 1/2 delta = 3/100 ------------------------------------------------------------------------ -- Manage hook ------------------------------------------------------------------------ myManageHook :: ManageHook myManageHook = composeAll [ className =? "privateinternetaccess" --> doShift "NSP" , isFullscreen --> doFullFloat ] <+> manageDocks ------------------------------------------------------------------------ -- Startup hook ------------------------------------------------------------------------ myStartupHook :: X () myStartupHook = do spawnOnce "nm-applet" spawnOnce "pa-applet" spawnOnce "xset r rate 300 50" spawnOnce "parcellite" spawnOnce "flameshot" spawnOnce "/opt/piavpn/bin/pia-client" spawnOnce "dunst" spawnOnce "mkfifo /tmp/xmonad-log 2>/dev/null; polybar main &" ------------------------------------------------------------------------ -- Key bindings ------------------------------------------------------------------------ myKeys :: [(String, X ())] myKeys = [ ("M-", spawn myTerminal) , ("M-g", spawn "waterfox") , ("M-e", spawn "pcmanfm") , ("M-q", kill) , ("M-d", spawn "dmenu_run -nb '#111111' -nf '#aaaaaa' -sb '#285577' -sf '#ffffff' -fn 'Fira Code-10'") , ("M-S-c", spawn "xmonad --recompile && xmonad --restart") , ("M-S-r", spawn "xmonad --restart") , ("M-S-e", io exitSuccess) , ("M-S-x", lockScreen) , ("M-j", windows W.focusDown) , ("M-k", windows W.focusUp) , ("M-h", windows W.focusMaster) , ("M-l", windows W.focusDown) , ("M-S-j", windows W.swapDown) , ("M-S-k", windows W.swapUp) , ("M-S-h", windows W.swapMaster) , ("M-S-l", windows W.swapDown) , ("M-r h", sendMessage Shrink) , ("M-r l", sendMessage Expand) , ("M-,", sendMessage (IncMasterN 1)) , ("M-.", sendMessage (IncMasterN (-1))) , ("M-s", sendMessage NextLayout) , ("M-S-", withFocused toggleFloat) , ("M-", windows W.focusMaster) , ("M-f", withFocused (windows . W.sink) >> sendMessage NextLayout) , ("M-S-", windows (W.shift "NSP")) , ("M-", windows (W.greedyView "NSP")) , ("", spawn "pamixer --increase 5") , ("", spawn "pamixer --decrease 5") , ("", spawn "pamixer --toggle-mute") , ("", spawn "brightnessctl set +10%") , ("", spawn "brightnessctl set 10%-") ] ++ [ ("M-" ++ key, windows $ W.greedyView ws) | (key, ws) <- zip (map show [1..9] ++ ["0"]) myWorkspaces ] ++ [ ("M-S-" ++ key, windows $ W.shift ws) | (key, ws) <- zip (map show [1..9] ++ ["0"]) myWorkspaces ] toggleFloat :: Window -> X () toggleFloat w = do isFloat <- gets (M.member w . W.floating . windowset) if isFloat then windows $ W.sink w else float w ------------------------------------------------------------------------ -- Polybar log hook ------------------------------------------------------------------------ myLogHook :: Handle -> X () myLogHook fifo = dynamicLogWithPP $ def { ppOutput = hPutStrLn fifo , ppSep = " " , ppTitleSanitize = xmobarStrip , ppCurrent = wrap "%{B#285577}%{F#ffffff} " " %{F-}%{B-}" , ppHidden = wrap "%{F#888888} " " %{F-}" , ppHiddenNoWindows = wrap "%{F#333333} " " %{F-}" , ppUrgent = wrap "%{B#cc4444}%{F#ffffff} " " %{F-}%{B-}" , ppTitle = wrap "%{F#555555}" "%{F-}" . shorten 40 , ppLayout = wrap "%{F#444444}[" "]%{F-}" . \l -> case l of "Tall" -> "T" "Mirror Tall" -> "M" "Full" -> "F" _ -> "?" } ------------------------------------------------------------------------ -- Lock screen helper function ------------------------------------------------------------------------ lockScreen :: X () lockScreen = do let modes = ["spiral", "space", "helix", "grav"] i <- io $ randomRIO (0, length modes - 1) spawn $ "xlock -mode " ++ (modes !! i) ------------------------------------------------------------------------ -- Main ------------------------------------------------------------------------ main :: IO () main = do fifo <- spawnPipe "cat > /tmp/xmonad-log" xmonad . ewmhFullscreen . ewmh . docks $ def { modMask = myModMask , terminal = myTerminal , borderWidth = myBorderWidth , normalBorderColor = myNormalBorderColor , focusedBorderColor = myFocusedBorderColor , focusFollowsMouse = myFocusFollowsMouse , workspaces = myWorkspaces , layoutHook = myLayout , manageHook = myManageHook , startupHook = myStartupHook , logHook = myLogHook fifo } `additionalKeysP` myKeys