alkaa/roles/xmonad/files/xmonad_t460p.hs

293 lines
12 KiB
Haskell

{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE PostfixOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
-- Imports
import XMonad
import Data.Monoid
import System.Exit
import XMonad.Util.Run
import XMonad.Util.SpawnOnce
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Layout.Spacing
import XMonad.Layout.ThreeColumns
import XMonad.Layout.LayoutModifier
import XMonad.Layout.Renamed
import XMonad.Hooks.SetWMName
import XMonad.Util.Cursor
import XMonad.Layout.NoBorders
import XMonad.Layout.PerWorkspace
import XMonad.Hooks.EwmhDesktops
import XMonad.Util.EZConfig
import XMonad.Util.NamedScratchpad
import XMonad.Actions.TopicSpace
import XMonad.Prompt
import XMonad.Prompt.FuzzyMatch
import XMonad.Prompt.Shell
import XMonad.Prompt.Workspace
import XMonad.Hooks.WorkspaceHistory (workspaceHistoryHook)
import XMonad.Hooks.DynamicProperty
import qualified XMonad.StackSet as W
import qualified Data.Map as M
import Text.Regex.Posix
import XMonad.Util.WorkspaceCompare ( getSortByIndex, filterOutWs )
import Data.Maybe (fromMaybe)
-- colours
white :: String = "#dcdccc"
yellow :: String = "#efef8f"
orange :: String = "#ffcfaf"
red :: String = "#dca3a3"
blue :: String = "#8cd0d3"
darkBlue :: String = "#8c8cbc"
green :: String = "#7f9f7f"
grey :: String = "#3f3f3f"
darkGrey :: String = "#262626"
-- variables
myTerminal = "alacritty"
myBorderWidth = 1
myModMask = mod4Mask
-- scratchpads
myScratchpads :: [NamedScratchpad]
myScratchpads =
[ NS "keepassxc" "keepassxc ~/db.kdbx" (title =? "it factum Max Hohlfeld - KeePassXC" <||> title =? "db.kdbx [Gesperrt] - KeePassXC") defaultFloating
, NS "nnn" "alacritty -t nnn -e nnnwrapper" (title =? "nnn") (customFloating $ W.RationalRect (1/4) (1/6) (2/4) (4/6))
, NS "vimwiki" "alacritty -t vimwiki -e vwwrapper" (title =? "vimwiki") (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3))
, NS "pavucontrol" "pavucontrol" (title =? "Lautstärkeregler") (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3))
, NS "cmus" "alacritty -t 'cmus' -e cmus" (title =? "cmus") (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3))
]
-- Topic Space
topicItems :: [TopicItem]
topicItems =
[ noAction "1" "~/"
, noAction "2" "~/"
, noAction "3" "~/"
, noAction "4" "~/"
, noAction "5" "~/"
, TI "alkaa" "~/projekte/alkaa" (switchToLayout "Programming" *> spawnShell *> spawnEditor)
, TI "IHD_Backend" "~/projekte/IHD/Tractatio_Backend" (switchToLayout "Full" *> spawnShellAndExecute "rider ~/projekte/IHD/Tractatio_Backend/IHD_Tractatio.sln")
, TI "IHD_Frontend" "~/projekte/IHD/Demonstrare_Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor)
, TI "InternalVertecApi" "~/projekte/InternalVertecAPI" (switchToLayout "Programming" *> spawn "rider ~/projekte/InternalVertecAPI/InternalVertecAPI.sln")
, TI "Abwesenheitskalender_Frontend" "~/projekte/Abwesenheitskalender_Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor)
, TI "aoc" "~/projekte/aoc" (switchToLayout "Programming" *> spawnShell *> spawnEditor)
, TI "ST_Frontend" "~/projekte/SchulungsTracker/Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor)
, TI "ST_Backend" "~/projekte/SchulungsTracker/Backend" (switchToLayout "Full" *> spawnShellAndExecute "rider ~/projekte/SchulungsTracker/Backend/Schulungstracker.backend.sln")
, TI "ST_Wiki" "~/projekte/SchulungsTracker/Wiki" (switchToLayout "Programming" *> spawnEditor)
]
myTopicConfig :: TopicConfig
myTopicConfig = def
{ topicDirs = tiDirs topicItems
, topicActions = tiActions topicItems
, defaultTopicAction = const (pure ()) -- by default, do nothing
, defaultTopic = "1" -- fallback
}
spawnShell :: X ()
spawnShell = proc $ termInDir >-$ currentTopicDir myTopicConfig
spawnEditor :: X ()
spawnEditor = proc $ (termInDir >-$ currentTopicDir myTopicConfig) >-> execute "nvim"
switchToLayout :: String -> X ()
switchToLayout = sendMessage . JumpToLayout
spawnShellAndExecute :: String -> X ()
spawnShellAndExecute cmd = proc $ (termInDir >-$ currentTopicDir myTopicConfig) >-> execute cmd
toggleTopic :: X ()
toggleTopic = switchNthLastFocusedByScreen myTopicConfig 1
myWorkSpacePrompt :: XPConfig -> (String -> X ()) -> X ()
myWorkSpacePrompt c job = do ws <- gets (W.workspaces . windowset)
sort <- getSortByIndex
let filter = filterOutWs ["1", "2", "3", "4", "5", "NSP"]
let ts = map W.tag $ filter ws
mkXPrompt (Wor "") c (mkComplFunFromList' c ts) job
topicPrompt :: XPConfig
topicPrompt = def
{ historySize = 0 -- No history in the prompt.
, fgColor = white
, fgHLight = "#3f3f3f"
, bgHLight = red
, alwaysHighlight = True -- Current best match
, height = 25
, position = CenteredAt 0.45 0.3
, promptBorderWidth = myBorderWidth -- Fit in with rest of config
, borderColor = red
, maxComplRows = Just 10 -- Max rows to show in completion window
, maxComplColumns = Just 1
, searchPredicate = fuzzyMatch
, sorter = fuzzySort
}
-- custom keybinds
myAdditionalKeys :: [(String, X ())]
myAdditionalKeys =
-- xmonad specific
[ ("M-q", spawn "xmonad --recompile; xmonad --restart")
, ("M-S-c", kill)
, ("M-j", windows W.focusDown)
, ("M-k", windows W.focusUp)
, ("M-S-j", windows W.swapDown)
, ("M-S-k", windows W.swapUp)
, ("M-h", sendMessage Shrink)
, ("M-l", sendMessage Expand)
, ("M-,", sendMessage (IncMasterN 1))
, ("M-S-,", sendMessage (IncMasterN (-1)))
, ("M-.", sendMessage ToggleStruts)
-- dmenu prompts
, ("M-<Return>", spawn "dm-recent-aliases")
, ("M-p s", spawn "dm-screenshot")
, ("M-p k", spawn "dm-kill")
, ("M-p p", shellPrompt topicPrompt)
-- scratchpads
, ("M-n", namedScratchpadAction myScratchpads "nnn")
, ("M-S-a", namedScratchpadAction myScratchpads "keepassxc")
, ("M-s v", namedScratchpadAction myScratchpads "vimwiki")
, ("M-s a", namedScratchpadAction myScratchpads "pavucontrol")
, ("M-s c", namedScratchpadAction myScratchpads "cmus")
-- open terminal
, ("M-S-<Return>", spawnShell)
, ("M-b", spawn "firefox")
-- layout
, ("M-t t", switchToLayout "Tall")
, ("M-t p", switchToLayout "Programming")
, ("M-t f", switchToLayout "Full")
, ("M-S-f", withFocused $ windows . W.sink)
-- media keys
, ("<XF86AudioMute>", spawn "pamixer -t" *> spawn "brightnessctl -q -d platform::mute s $((1-$(brightnessctl -d platform::mute g)))")
, ("<XF86AudioLowerVolume>", spawn "pamixer -d 5")
, ("<XF86AudioRaiseVolume>", spawn "pamixer -i 5")
, ("<XF86AudioMicMute>", spawn "pamixer --default-source -t" *> spawn "brightnessctl -q -d platform::micmute s $((1-$(brightnessctl -d platform::micmute g)))")
, ("<XF86MonBrightnessDown>", spawn "brightnessctl -q -- s '-10%'")
, ("<XF86MonBrightnessUp>", spawn "brightnessctl -q -- s '+10%'")
-- lock screen
, ("M-S-l", spawn "slock")
-- workspace switching
, ("M-<Tab>", toggleTopic)
, ("M-<Space>", myWorkSpacePrompt topicPrompt (switchTopic myTopicConfig))
, ("M-S-<Space>", myWorkSpacePrompt topicPrompt (windows . W.shift))
]
++
[ ("M-" ++ m ++ k, f i)
| (i, k) <- zip (topicNames topicItems) (map show [1 .. 5 :: Int])
, (f, m) <- [(switchTopic myTopicConfig, ""), (windows . W.shift, "S-")]
]
-- Layouts
mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a
mySpacing i = spacingRaw True (Border i i i i) True (Border i i i i) True
myLayout = avoidStruts $ tiling ||| hacking ||| full
where
tiling = renamed [Replace "Tall"] $ smartBorders $ mySpacing 6 $ Tall 1 (3/100) (1/2)
hacking = renamed [Replace "Programming"] $ smartBorders $ mySpacing 6 $ Tall 1 (3/100) (5/8)
full = noBorders Full
-- Regex lifted up to use in manageHook
(*!?) :: Functor f => f String -> String -> f Bool
q *!? x = fmap (=~ x) q
-- window rules
myManageHook = composeAll . concat $
[ [ resource =? "desktop_window" --> doIgnore ]
, [ resource =? "kdesktop" --> doIgnore ]
, [ ( className =? "LibreWolf" <&&> role =? "Organizer" ) --> doFloat ]
-- float specific classes
, [ className =? c --> doFloat | c <- myFloatingClasses ]
-- safeyes
, [ title =? "SafeEyes-0" --> maybe mempty doShift =<< liftX (screenWorkspace 1) ]
, [ title =? "SafeEyes-1" --> maybe mempty doShift =<< liftX (screenWorkspace 2) ]
, [ className =? "Safeeyes" --> doFloat ]
-- scratchpads
, [ namedScratchpadManageHook myScratchpads ]
]
where
role = stringProperty "WM_WINDOW_ROLE"
myFloatingClasses = ["Gimp", "Origin"]
------------------------------------------------------------------------
-- Event handling
-- * EwmhDesktops users should change this to ewmhDesktopsEventHook
--
-- Defines a custom handler function for X Events. The function should
-- return (All True) if the default handler is to be run afterwards. To
-- combine event hooks use mappend or mconcat from Data.Monoid.
--
myEventHook = dynamicPropertyChange "WM_NAME" (title =? "it factum Max Hohlfeld - KeePassXC" <||> title =? "db.kdbx [Gesperrt] - KeePassXC" --> floating)
where floating = customFloating $ W.RationalRect (1/8) (1/8) (3/4) (3/4)
------------------------------------------------------------------------
-- Status bars and logging
-- Perform an arbitrary action on each internal state change or X event.
-- See the 'XMonad.Hooks.DynamicLog' extension for examples.
--
-- myLogHook = return ()
-- Startup hook
myStartupHook = do
setWMName "LG3D"
setDefaultCursor xC_left_ptr
spawnOnce "redshift -l 51.33:12.40"
spawnOnce "safeeyes -e"
spawnOnce "/usr/bin/dunst"
spawnOnce "feh --bg-fill ~/bg.jpg ~/bg.jpg"
-- Main
main = do
xmproc0 <- spawnPipe "xmobar -x 0 /home/max/.config/xmobar/xmobarrc"
xmproc1 <- spawnPipe "xmobar -x 1 /home/max/.config/xmobar/xmobarrc"
xmonad $ spawnExternalProcess def $ docks def {
-- simple stuff
terminal = myTerminal,
borderWidth = myBorderWidth,
modMask = myModMask,
workspaces = topicNames topicItems,
normalBorderColor = white,
focusedBorderColor = red,
keys = mempty,
-- hooks, layouts
layoutHook = myLayout,
manageHook = myManageHook,
handleEventHook = myEventHook,
logHook = workspaceHistoryHook >> (dynamicLogWithPP $ filterOutWsPP ["NSP"] $ xmobarPP {
ppCurrent = xmobarColor "#dca3a3" "" . wrap "[ " " ]",
ppHidden = xmobarColor "#8cd0d3" "",
ppLayout = xmobarColor "#8c8cbc" "",
ppTitle = xmobarColor "#ffcfaf" "" . shorten 100,
ppSep = " | ",
ppOutput = \x -> hPutStrLn xmproc0 x >> hPutStrLn xmproc1 x
}),
startupHook = myStartupHook
} `additionalKeysP` myAdditionalKeys