import XMonad import XMonad.Actions.Navigation2D (navigation2DP, windowGo, windowSwap) import qualified XMonad.Actions.CycleWS as WS import XMonad.Util.Ungrab (unGrab) import XMonad.Layout.ThreeColumns import XMonad.Layout.ToggleLayouts (ToggleLayout(..), toggleLayouts) import XMonad.Layout.BinarySpacePartition import XMonad.Layout.BorderResize (borderResize) import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.SetWMName import qualified XMonad.Hooks.ManageDocks as Docks import qualified XMonad.Util.EZConfig as EZ import Numeric.Natural import Control.Monad (when) import Text.Printf (printf) import System.Posix.Process (executeFile) import System.Info (arch,os) import System.Environment (getArgs) import System.FilePath (()) compiledConfig = printf "xmonad-%s-%s" arch os compileRestart resume = do dirs <- asks directories whenX (recompile dirs True) $ do when resume writeStateToFile catchIO ( do args <- getArgs executeFile (cacheDir dirs compiledConfig) False args Nothing ) myLayout = borderResize $ Docks.avoidStruts $ layout where layout = (emptyBSP ||| columns ||| tiled ||| Full) tiled = Tall nmaster delta ratio columns = ThreeColMid nmaster delta ratio nmaster = 1 -- default number of windows in the master pane ratio = 1/2 -- default proportion occupied by master pane delta = 3/100 -- percent of screen to increment when resizing main :: IO () main = getDirectories >>= launch myConfig -- change size of window using direction so that it can be used together with the navigation2D function -- see: similar to windowGo and windowSwap windowMoveSplit :: Direction2D -> Bool -> X () windowMoveSplit direction _ = sendMessage $ MoveSplit direction data VolumeCommand = ToggleVolume | LowerVolume Natural | RaiseVolume Natural interpretVolumeCommand :: VolumeCommand -> String interpretVolumeCommand command = "amixer -q set Master " <> cmd where cmd = case command of ToggleVolume -> "toggle" LowerVolume delta -> show delta <> "%-" RaiseVolume delta -> show delta <> "%+" changeVolume :: VolumeCommand -> X () changeVolume = spawn . interpretVolumeCommand myConfig = ewmhFullscreen $ ewmh $ Docks.docks $ nav $ def { modMask = mod4Mask -- Use Super instead of Alt , terminal = "alacritty" , layoutHook = myLayout -- this seems to be necessary to make java gui applications work :( , startupHook = ewmhDesktopsStartup >> setWMName "LG3D" } `EZ.additionalKeysP` [ ("M-S-z", spawn "xscreensaver-command -lock") , ("M-S-r", compileRestart True) , ("M-S-q", restart "xmonad" True) , ("M-C-s", unGrab *> spawn "scrot -s") , ("M-b", sendMessage Docks.ToggleStruts) , ("M-f", sendMessage (Toggle "Full")) , ("M-p", spawn appLauncher) , ("M-i", spawn passLauncher) , ("M-w", kill) , ("M-l", WS.toggleWS) , ("M-g", WS.prevWS) , ("M-r", WS.nextWS) -- backlight control , ("", spawn "xbacklight -dec 5") , ("", spawn "xbacklight -inc 5") , ("", spawn "xbacklight -dec 5") , ("", spawn "xbacklight -inc 5") -- volume control , ("", changeVolume ToggleVolume) , ("", changeVolume $ LowerVolume 5) , ("", changeVolume $ RaiseVolume 5) , ("M-a", sendMessage Balance) , ("M-S-a", sendMessage Equalize) , ("M-o", sendMessage Rotate) ] where -- navigate using dvorak bindings nav = navigation2DP def ("c", "h", "t", "n") [("M-", windowGo), ("M-C-", windowSwap), ("M-S-", windowMoveSplit)] True appLauncher = "rofi -show combi -modes combi -combi-modes window,drun,run,ssh" passLauncher = "rofi-pass" -- myManageHook :: ManageHook -- myManageHook = composeAll -- [ className =? "Gimp" --> doFloat -- , isDialog --> doFloat -- ]