import qualified Data.Map as M import System.Exit import XMonad import qualified XMonad.StackSet as W import XMonad.Actions.GridSelect import XMonad.Actions.WithAll import XMonad.Hooks.DynamicLog import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.StatusBar import XMonad.Hooks.StatusBar.PP import XMonad.Util.ClickableWorkspaces import XMonad.Util.EZConfig import XMonad.Util.NamedScratchpad import XMonad.Layout.BoringWindows hiding (Replace) import XMonad.Layout.Renamed import XMonad.Layout.Spacing import XMonad.Layout.ThreeColumns import XMonad.Layout.ToggleLayouts import LaNinpreConfig myKeys :: [(String, X ())] myKeys = [ ("M-", spawn myTerminal) , ("M-w", spawn myBrowser) , ("M-p", spawn "dmenu_run") , ("", spawn "scrot_cmd -f") , ("C-", spawn "scrot_cmd -a") , ("M1-", spawn "scrot_cmd -w") , ("M-s t", namedScratchpadAction myScratchPads "terminal") , ("M-s c", namedScratchpadAction myScratchPads "calculator") , ("M-s m", namedScratchpadAction myScratchPads "mocp") , ("M-s v", namedScratchpadAction myScratchPads "mpvfloat") , ("M-g t", goToSelected myGsConfig) , ("M-g b", bringSelected myGsConfig) , ("M-g g", mySpawnSelected myGsConfig myAppGrid) , ("M-S-c", kill) , ("M-", sendMessage NextLayout) , ("M-f", sendMessage ToggleLayout) , ("M-h", sendMessage Shrink) , ("M-l", sendMessage Expand) , ("M-j", focusDown) , ("M-k", focusUp) , ("M-S-j", swapDown) , ("M-S-k", swapUp) , ("M-m", focusMaster) , ("M-S-m", windows W.swapMaster) , ("M-t", withFocused $ windows . W.sink) , ("M-S-t", sinkAll) , ("M-", toggleWindowSpacingEnabled >> toggleScreenSpacingEnabled) , ("M-S-q", io (exitWith ExitSuccess)) , ("M-S-r", spawn "xmonad --recompile && xmonad --restart") ] ++ [("M-" ++ m ++ show k, windows $ f i) | (i, k) <- zip (myWorkspaces) [1..9] , (f, m) <- [(W.greedyView, ""), (W.shift, "S-")] ] myColorizer :: a -> Bool -> X (String, String) myColorizer _ active = if active then return (col_bg_alt def, col_fg_alt def) else return (col_bg def, col_fg def) myGsConfig :: GSConfig a myGsConfig = (buildDefaultGSConfig myColorizer) { gs_font = head myFonts , gs_bordercolor = col_bg_alt def } mySpawnSelected :: GSConfig String -> [(String, String)] -> X () mySpawnSelected conf lst = gridselect conf lst >>= flip whenJust spawn myXmobarPP :: PP myXmobarPP = def { ppSep = xmobarColor (col_bg_alt def) "" " | " , ppCurrent = xmobarColor (col_fg_alt def) "" . sitelen , ppHidden = xmobarColor (col_fg def) "" . sitelen , ppHiddenNoWindows = xmobarColor (col_bg_alt def) "" . sitelen } where sitelen = xmobarFont 3 mySB :: StatusBarConfig mySB = statusBarProp "xmobar" $ clickablePP $ filterOutWsPP [scratchpadWorkspaceTag] myXmobarPP myLayout = boringWindows $ toggleLayouts full $ tiled ||| threeCol where tiled = renamed [Replace "lawa"] $ spacingWithEdge space $ Tall nmaster delta ratio threeCol = renamed [Replace "supa"] $ spacingWithEdge space $ ThreeColMid nmaster delta ratio full = renamed [Replace "suli"] $ Full nmaster = 1 ratio = 1/2 delta = 3/100 space = 4 myConfig = def { terminal = myTerminal , modMask = myModMask , layoutHook = myLayout , manageHook = myManageHook <+> namedScratchpadManageHook myScratchPads , workspaces = myWorkspaces , borderWidth = myBorderWidth , keys = const M.empty -- discard default keybindings , normalBorderColor = col_bg def , focusedBorderColor = col_bg_alt def } `additionalKeysP` myKeys main :: IO () main = xmonad . ewmhFullscreen . ewmh . withEasySB mySB defToggleStrutsKey $ myConfig