module KeyBindings ( KeyBindings.modify ) where import Control.Monad (void) import Data.Foldable (forM_) import Data.List (sort, isSuffixOf) import Data.Maybe (isJust) import Graphics.X11.Types import System.Exit -- import Text.EditDistance import XMonad import XMonad.Actions.CycleWS import XMonad.Actions.DynamicProjects import XMonad.Core import XMonad.Layout.ToggleLayouts import XMonad.Operations import XMonad.Prompt import XMonad.Prompt.ConfirmPrompt import XMonad.Prompt.Shell import XMonad.Util.EZConfig import XMonad.Util.NamedScratchpad import qualified Nord as N import qualified Scratchpad as R import qualified XMonad.StackSet as W -- Custom (in libs) import Password (passPrompt) modify :: XConfig l -> XConfig l modify conf = conf { modMask = mod4Mask -- Use the "Win" key for the mod key } `additionalKeysP` -- Add some extra key bindings: [ ("M-S-q", confirmPrompt promptConfig "exit" (io exitSuccess)) , ("", spawn "/run/current-system/sw/bin/xbacklight -10") , ("", spawn "/run/current-system/sw/bin/xbacklight +10") , ("", spawn "/run/current-system/sw/bin/mpc toggle") , ("", spawn "/run/current-system/sw/bin/mpc next") , ("", spawn "/run/current-system/sw/bin/mpc prev") , ("M-", kill) , ("M-", windows W.focusDown) , ("M-", sendMessage (Toggle "Full")) , ("M-$", sendMessage (Toggle "Full")) , ("M-", prevWS) , ("M-i", prevScreen) , ("M-e", nextScreen) , ("M-", nextWS) , ("M-", toggleWS' ["NSP"]) , ("M-", windows W.focusUp) , ("M-S-", spawn "/run/current-system/sw/bin/mpc pause; /run/current-system/sw/bin/xset s activate") , ("M-S-", shiftToPrev >> prevWS) , ("M-S-", shiftToNext >> nextWS) , ("M-s s", spawn "flameshot gui") , ("M-s t", spawn "/run/current-system/sw/bin/scrot /tmp/screen.png") -- Workspace and tasks , ("M-b", switchProjectPrompt promptConfig) , ("M-p m", shiftToProjectPrompt promptConfig) , ("M-p n", switchProjectPrompt promptConfig) , ("M-p r", renameProjectPrompt promptConfig) , ("M-p s", shellPrompt promptConfig) , ("M-p c", withFocused centerWindow) , ("M-d", passPrompt promptConfig) -- Scratchpads , ("M-p p", namedScratchpadAction R.pads "htop") ] viewProject :: WorkspaceId -> X () viewProject id = do project <- lookupProject id forM_ project switchProject -- Borrowed from https://www.reddit.com/r/xmonad/comments/gzq316/how_can_i_centre_a_floating_window_without/fthtx29/ centerWindow :: Window -> X () centerWindow win = do (_, W.RationalRect x y w h) <- floatLocation win windows $ W.float win (W.RationalRect ((1 - w) / 2) ((1 - h) / 2) w h) return () promptConfig = def { position = Bottom , alwaysHighlight = True , borderColor = N.nord9 -- Normal , bgColor = N.nord9 , fgColor = N.background -- Selection , bgHLight = N.nord6 , fgHLight = N.background -- , defaultText = "" , font = "xft:Iosevka Samae:style=Regular:size=8:charwidth=5" , height = 24 , promptBorderWidth = 5 } -- -- Slightly taken from -- -- https://mail.haskell.org/pipermail/xmonad/2010-October/010671.html -- data FuzzySpawn = FuzzySpawn deriving (Read, Show) -- instance XPrompt FuzzySpawn where showXPrompt _ = "RunC: " -- fuzzyPrompt config = do -- cmds <- io getCommands -- let compl s -- | null s = [] -- | otherwise = let weight c = levenshteinDistance defaultEditCosts s c -- in map snd $ take 20 $ sort $ map (\c -> (weight c,c)) cmds -- mkXPrompt FuzzySpawn config (return . compl) spawn --