summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCori Barker <coribarker2@gmail.com>2026-03-22 15:37:40 +0000
committerCori Barker <coribarker2@gmail.com>2026-03-22 15:37:40 +0000
commitd994eb7b7a278b30e9d296ccd44618f3b02bbdaa (patch)
tree824cbb25a9fc7c193392252cc6950812fbd6a6ff
parent27cf89ad7f4b731116b31ca7fbc3f8fe2382d3d5 (diff)
[xmonad] added xmonad config file
-rw-r--r--xmonad.hs205
1 files changed, 205 insertions, 0 deletions
diff --git a/xmonad.hs b/xmonad.hs
new file mode 100644
index 0000000..f4755f2
--- /dev/null
+++ b/xmonad.hs
@@ -0,0 +1,205 @@
+-- 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-<Return>", 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-<Space>", withFocused toggleFloat)
+ , ("M-<Space>", windows W.focusMaster)
+ , ("M-f", withFocused (windows . W.sink) >> sendMessage NextLayout)
+
+ , ("M-S-<minus>", windows (W.shift "NSP"))
+ , ("M-<minus>", windows (W.greedyView "NSP"))
+
+ , ("<XF86AudioRaiseVolume>", spawn "pamixer --increase 5")
+ , ("<XF86AudioLowerVolume>", spawn "pamixer --decrease 5")
+ , ("<XF86AudioMute>", spawn "pamixer --toggle-mute")
+
+ , ("<XF86MonBrightnessUp>", spawn "brightnessctl set +10%")
+ , ("<XF86MonBrightnessDown>", 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