{-# LANGUAGE BlockArguments #-} import Control.Monad (forM_, join) import Data.Function ((&)) import System.Environment import System.Process import XMonad import XMonad.Actions.SpawnOn import XMonad.Config import XMonad.Config.Kde import XMonad.Hooks.EwmhDesktops (ewmh, fullscreenEventHook) import XMonad.Hooks.ManageDocks import XMonad.Layout.NoBorders import XMonad.Layout.Spacing import XMonad.Layout.ThreeColumns import XMonad.Operations import XMonad.Util.EZConfig kdeOn :: Bool kdeOn = False -- startingConfig = if kdeOn then kdeConfig else defaultConfig main = xmonad $ ewmh $ docks $ def { modMask = mod4Mask, layoutHook = myLayoutHook, startupHook = startup, manageHook = manageDocks <+> manageSpawn <+> myManagerHook <+> manageHook kdeConfig, handleEventHook = handleEventHook kdeConfig <+> fullscreenEventHook, terminal = myTerminal, workspaces = myWorkspaces, borderWidth = 5, focusedBorderColor = "#4c4f69", normalBorderColor = "#4c4f69" } `additionalKeysP` keymap where myWorkspaces = ["1:dev", "2:browser", "3:chat", "4:reading", "5", "6"] appWorkspaceConfig = [ (3, "Discord"), (4, "alacritty"), (2, "google-chrome-stable") ] manageWorkspaces = appWorkspaceConfig & fmap \(workspaceId, name) -> do let workspaceName = myWorkspaces !! (workspaceId - 1) className =? name --> doShift workspaceName kdeFloats = [ "yakuake", "Yakuake", "Kmix", "kmix", "plasma", "Plasma", "plasma-desktop", "Plasma-desktop", "krunner", "ksplashsimple", "ksplashqml", "ksplashx" ] floatKdeStuff = [className =? name --> doFloat | name <- kdeFloats] myManagerHook = composeAll $ concat [ if kdeOn then floatKdeStuff else [], manageWorkspaces ] myTerminal = "alacritty" myBrowser = "google-chrome-stable" -- TODO: find a way to bind all the program-opening-keybindings to a single sub-map keymap = [ ("M-p", spawn "rofi -show drun"), ("M-w", spawn "rofi -show window"), ("M-g", spawn myBrowser), ("M-d", spawn "Discord"), ("M-v", spawn "alacritty -e vimclip"), ("M-s", spawn "spectacle -rcb"), ("M-S-s", spawn "spectacle -mcb"), ("M-C-s", spawn "spectacle -ucb"), ("M-c", kill) ] uniformBorder = join $ join $ join Border border = uniformBorder 0 spacingHook = spacingRaw False border False border True tall = Tall 1 (3 / 100) (1 / 2) threeCols = ThreeCol 1 (3 / 100) (1 / 2) layouts = tall ||| threeCols ||| Full myLayoutHook = desktopLayoutModifiers $ spacingHook layouts startupApps = [ (0, "alacritty"), (1, "google-chrome-stable"), (2, "Discord") ] startup :: X () startup = do forM_ startupApps \(index, app) -> do spawnOn (myWorkspaces !! index) app