blob: b3b8609b4e8c43295fc0aa2077465940d8081b2d [file] [log] [blame]
-- spell-checker:words xmonad
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# HLINT ignore "Move brackets to avoid $" #-}
import XMonad
import System.Exit
import XMonad.Util.EZConfig
import XMonad.Config.Desktop
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import qualified DBus.Client as D
import XMonad.Hooks.DynamicLog
import XMonadLog
import Blaze.ByteString.Builder (toByteString)
import Data.Containers
import Data.List ((\\))
import qualified Data.Map as M
import Foreign.C
import Graphics.X11.ExtraTypes (xF86XK_AudioLowerVolume,
xF86XK_AudioMute,
xF86XK_AudioRaiseVolume,
xF86XK_MonBrightnessDown,
xF86XK_MonBrightnessUp,
xF86XK_Xfer)
import qualified XMonad as W
import XMonad.Hooks.DynamicProperty (dynamicPropertyChange)
import XMonad.Hooks.ManageHelpers (doFullFloat, doLower,
doRectFloat, isInProperty)
import XMonad.Hooks.Place (fixed, placeHook, underMouse, withGaps)
import XMonad.Hooks.UrgencyHook
import XMonad.Layout (Tall)
import XMonad.Layout.Drawer (propertyToQuery)
import XMonad.Layout.Gaps
import XMonad.Layout.Grid
import XMonad.Layout.MultiToggle (mkToggle)
import XMonad.Layout.NoBorders (Ambiguity (Combine, OnlyScreenFloat),
SetsAmbiguous, With (Union),
hasBorder, hiddens, lessBorders,
smartBorders)
import XMonad.Layout.ResizableTile (MirrorResize (MirrorExpand, MirrorShrink),
ResizableTall (ResizableTall))
import XMonad.Layout.Spacing
import qualified XMonad.StackSet as W
import XMonad.StackSet (allWindows)
import XMonad.Util.Hacks
import XMonad.Util.PureX (curScreen, curScreenId)
import XMonad.Util.Run (safeSpawn, safeSpawnProg)
volumeChangeCmd = "${{./vol_change.py}}"
terminal = "/usr/bin/env SHLVL=0 kitty" -- Kitty, my beloved <3
launcher = "pkill rofi; rofi -show combi"
networkManager = "wpa_cli select_network $(wpa_cli list_networks | tail -n +3 | awk '!seen[$2]++' | rofi -dmenu -window-title 'Select Network' | awk '{print $1;}')"
screenshot = "mkdir -p ~/Screenshots && maim | tee ~/Screenshots/\"$(date --rfc-3339=seconds)\".png | xclip -select clipboard -t image/png"
selectScreenshot = "mkdir -p ~/Screenshots && maim -us | tee ~/Screenshots/\"$(date --rfc-3339=seconds)\".png | xclip -select clipboard -t image/png"
modifierKey = mod4Mask -- Use Super as our mod key
statusBar = "pkill polybar; polybar main; polybar dp1; polybar dp2; polybar dp3; polybar dp4"
compositor = "pkill picom; picom"
background = "pkill show; show ~/.xmonad/wallpaper.glsl > /dev/null"
colorSelection = "xcolor | xclip -sel clip"
keybindings = "setxkbmap -option caps:none && xmodmap ~/.Xmodmap"
shift = shiftMask
-- spell-checker:words xobsock
xobsock = "$XDG_RUNTIME_DIR/xob.sock"
workspaces = ["7", "5", "3", "1", "9", "0", "2", "4", "6", "8"];
data NonFloats = NonFloats deriving (Read, Show)
instance SetsAmbiguous NonFloats where
hiddens _ wset _ _ _ = allWindows wset \\ M.keys (W.floating wset)
startupHook = do
spawn Main.statusBar
spawn Main.compositor
spawn background
spawn keybindings
windows $ W.view "0"
spawn "pgrep keepass || run_keepass"
spawn $ "pkill xob; rm -f " ++ xobsock ++ " && mkfifo " ++ xobsock ++ " && tail -f " ++ xobsock ++ " | xob"
numRowKeys = [xK_bracketleft
, xK_braceleft
, xK_braceright
, xK_parenleft
, xK_equal
, xK_asterisk
, xK_parenright
, xK_plus
, xK_bracketright
, xK_exclam
]
main :: IO ()
main = XMonadLog.xmonadLog >>= main'
main' :: D.Client -> IO ()
main' dbus = xmonad
$ javaHack
$ ewmh . setEwmhActivateHook doAskUrgent
$ docks
$ def
{ modMask = modifierKey -- Use Super as our mod key
, borderWidth = 2
, normalBorderColor = "#61afef"
, focusedBorderColor = "#61afef"
, XMonad.terminal = Main.terminal
, XMonad.workspaces = Main.workspaces
, XMonad.startupHook = Main.startupHook
, XMonad.logHook = dynamicLogWithPP (polybarHook dbus)
, XMonad.layoutHook = lessBorders NonFloats
$ (smartSpacing 5
$ avoidStruts
$ gaps [(U, 5), (D, 5), (L, 5), (R, 5)]
$ Grid
||| ResizableTall 1 (3/100) (1/2) []
||| Full
||| Mirror (ResizableTall 1 (3/100) (1/2) []))
||| gaps [(U, 0), (D, 0), (L, 0), (R, 0)] Full
, XMonad.manageHook = composeAll
[ isInProperty "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DESKTOP"
--> hasBorder False <+> doIgnore <+> doLower <+> doLower
, checkDock --> doLower <+> doLower
, isInProperty "_NET_WM_STATE" "_NET_WM_STATE_MODAL"
--> placeHook (withGaps (30, 30, 30, 30) (underMouse (0.5, 0.5))) <+> doFloat
] <+> manageHook def
, XMonad.handleEventHook = composeAll
[ windowedFullscreenFixEventHook
, dynamicPropertyChange "_NET_WM_WINDOW_TYPE"
(isInProperty "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DESKTOP"
--> hasBorder False <+> doLower
<+> (ask >>= \w -> liftX (modifyWindowSet (W.delete w))
>> mempty)
<+> (ask >>= \w -> liftX (withDisplay $ \dpy -> io (moveResizeWindow dpy w 0 0 (fromIntegral $ displayWidth dpy $ defaultScreen dpy) (fromIntegral $ displayHeight dpy $ defaultScreen dpy))) >> mempty))
]
<+> handleEventHook def
} `additionalKeys` (
[ ((modifierKey, xK_d), spawn launcher)
, ((modifierKey, xK_n), spawn networkManager)
, ((modifierKey .|. Main.shift, xK_q), kill)
, ((modifierKey, xK_o), sendMessage MirrorShrink)
, ((modifierKey, xK_e), sendMessage MirrorExpand)
, ((modifierKey, xK_q), spawn "xmonad --restart")
, ((modifierKey .|. Main.shift, xK_c), io exitSuccess)
, ((modifierKey .|. Main.shift, xK_s), spawn selectScreenshot)
, ((modifierKey .|. Main.shift, xK_h), spawn colorSelection)
, ((0, xK_Print), spawn screenshot)
, ((modifierKey .|. Main.shift, xK_Return), spawn Main.terminal)
, ((0, xF86XK_AudioLowerVolume), spawn $ volumeChangeCmd ++ " -d")
, ((0, xF86XK_AudioRaiseVolume), spawn $ volumeChangeCmd ++ " -u")
, ((0, xF86XK_AudioMute), spawn $ volumeChangeCmd ++ " -m")
, ((modifierKey, xF86XK_AudioLowerVolume), spawn $ volumeChangeCmd ++ " -d -i")
, ((modifierKey, xF86XK_AudioRaiseVolume), spawn $ volumeChangeCmd ++ " -u -i")
, ((modifierKey, xF86XK_AudioMute), spawn $ volumeChangeCmd ++ " -m -i")
, ((0, xF86XK_MonBrightnessDown), spawn $ "light -U 6 && light -G | cut -d'.' -f1 > " ++ xobsock)
, ((0, xF86XK_MonBrightnessUp), spawn $ "light -A 6 && light -G | cut -d'.' -f1 > " ++ xobsock)
, ((modifierKey, xF86XK_MonBrightnessDown), spawn $ "light -U 3 && light -G | cut -d'.' -f1 > " ++ xobsock)
, ((modifierKey, xF86XK_MonBrightnessUp), spawn $ "light -A 3 && light -G | cut -d'.' -f1 > " ++ xobsock)
] ++ (zip numRowKeys Main.workspaces >>= (\(key, workspace) -> [((modifierKey, key), windows $ W.view workspace)
, ((modifierKey .|. Main.shift, key), windows $ W.shift workspace)
])))