module Keybindings where import System.Exit import System.IO import XMonad import qualified XMonad.StackSet as W -- actions import XMonad.Actions.CopyWindow import XMonad.Actions.WithAll import XMonad.Actions.CycleWS import XMonad.Actions.GridSelect import XMonad.Actions.SwapWorkspaces -- layout modifiers import XMonad.Layout.Spacing import XMonad.Layout.WindowNavigation as WN import XMonad.Layout.Maximize -- Layouts import XMonad.Layout.BinarySpacePartition as BSP -- hooks import XMonad.Hooks.ManageDocks -- utilities import XMonad.Util.SpawnOnce import XMonad.Util.EZConfig import XMonad.Util.NamedScratchpad import Defaults import Scratchpads myMouseKeybindings :: [((ButtonMask, Button), Window -> X ())] myMouseKeybindings = [ ((myModMask, 4), \w -> prevWS) , ((myModMask, 5), \w -> nextWS) , ((myModShiftMask, 4), \w -> shiftToPrev >> prevWS) , ((myModShiftMask, 5), \w -> shiftToNext >> nextWS) ] myKeybindings :: [((KeyMask, KeySym), X ())] myKeybindings = [ ((myModMask, xK_Return), spawn myTerminal) , ((myModMask .|. shiftMask, xK_q), kill1) , ((myModShiftMask, xK_p), spawn myLauncher) -- scratchpads , ((myModMask, xK_u), myScratchpad "Term 0") , ((myModMask, xK_i), myScratchpad "Term 1") , ((myModMask, xK_o), myScratchpad "Term 2") , ((myModMask, xK_p), myScratchpad "Term 3") -- volume keys , ((myModMask, xK_equal), spawn volUp) , ((myModMask, xK_minus), spawn volDown) , ((myModMask, xK_BackSpace), spawn volMute) -- brightness keys , ((myModMask .|. shiftMask, xK_equal), spawn backlightUp) , ((myModMask .|. shiftMask, xK_minus), spawn backlightDown) -- modify gaps on runtime , ((myModMask, xK_F2), incWindowSpacing 1) , ((myModMask, xK_F1), decWindowSpacing 1) , ((myModMask .|. shiftMask, xK_F2), incScreenSpacing 1) , ((myModMask .|. shiftMask, xK_F1), decScreenSpacing 1) -- view prev/next workspaces , ((myModShiftMask, xK_Tab ), prevWS) , ((myModMask, xK_Tab ), nextWS) , ((myModMask, xK_semicolon ), prevWS) , ((myModMask, xK_apostrophe), nextWS) , ((myModMask', xK_h ), prevWS) , ((myModMask', xK_l ), nextWS) -- move to prev/next workspaces , ((myModShiftMask', xK_h ), shiftToPrev >> prevWS) , ((myModShiftMask', xK_l ), shiftToNext >> nextWS) , ((myModShiftMask', xK_semicolon ), shiftToPrev >> prevWS) , ((myModShiftMask', xK_apostrophe), shiftToNext >> nextWS) -- focus previous/next monitor , ((myModMask, xK_bracketleft ), prevScreen) , ((myModMask, xK_bracketright), nextScreen) -- move window to previous/next monitor , ((myModShiftMask, xK_bracketleft ), shiftPrevScreen >> prevScreen) , ((myModShiftMask, xK_bracketright), shiftNextScreen >> nextScreen) -- swap different screens , ((myModMask .|. controlMask, xK_bracketleft ), swapPrevScreen) , ((myModMask .|. controlMask, xK_bracketright), swapNextScreen) -- toggle maximize , ((myModMask, xK_f), withFocused (sendMessage . maximizeRestore)) -- unfloat windows , ((myModMask .|. shiftMask, xK_f), withFocused $ windows . W.sink) -- cycle through windows , ((myModMask', xK_j), windows W.focusDown) , ((myModMask', xK_k), windows W.focusUp) -- 2D navigation , ((myModMask, xK_l), sendMessage $ Go R) , ((myModMask, xK_h), sendMessage $ Go L) , ((myModMask, xK_k), sendMessage $ Go U) , ((myModMask, xK_j), sendMessage $ Go D) -- swap windows , ((myModShiftMask, xK_l), sendMessage $ WN.Swap R) , ((myModShiftMask, xK_h), sendMessage $ WN.Swap L) , ((myModShiftMask, xK_k), sendMessage $ WN.Swap U) , ((myModShiftMask, xK_j), sendMessage $ WN.Swap D) -- resize , ((myModMask .|. myModMask', xK_l), sendMessage $ ExpandTowards R) , ((myModMask .|. myModMask', xK_h), sendMessage $ ExpandTowards L) , ((myModMask .|. myModMask', xK_j), sendMessage $ ExpandTowards D) , ((myModMask .|. myModMask', xK_k), sendMessage $ ExpandTowards U) , ((myModMask .|. myModShiftMask', xK_l), sendMessage $ ShrinkFrom R) , ((myModMask .|. myModShiftMask', xK_h), sendMessage $ ShrinkFrom L) , ((myModMask .|. myModShiftMask', xK_j), sendMessage $ ShrinkFrom D) , ((myModMask .|. myModShiftMask', xK_k), sendMessage $ ShrinkFrom U) ] ++ [ -- for extra workspace(s) ((myModMask, key), windows $ W.greedyView ws) | (key,ws) <- myExtraWorkspaces ] ++ [ -- also for extra workspaces ((myModShiftMask, key), windows $ W.shift ws) | (key,ws) <- myExtraWorkspaces ] ++ [ -- to swap workspace ((myModShiftMask', k), windows $ swapWithCurrent i) | (i, k) <- zip myWorkspaces [xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9, xK_0] ] ++ [ -- copy ((m .|. myModMask, k), windows $ f i) | (i, k) <- zip myWorkspaces [xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9, xK_0] , (f, m) <- [(copy, myModShiftMask')] ] ++ [ -- for not swapping tags while using multihead ((m .|. myModMask, k), windows $ f i) | (i, k) <- zip myWorkspaces [xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9, xK_0] , (f, m) <- [(W.view, 0), (W.shift, shiftMask)] ] myKeybindingsP :: [(String, X())] myKeybindingsP = [ ("", spawn backlightUp) , ("", spawn backlightDown) , ("", spawn volUp) , ("", spawn volDown) , ("", spawn volMute) -- actions -- TODO: add reboot, shutdown, logout, copy, cut, paste , ("M-a w", spawn wifiOff) , ("M-a S-w", spawn wifiOn) , ("M-a s", spawn customScreenshot) , ("M-a S-s", spawn fullScreenshot) , ("M-a m", spawn volMute) -- media , ("M-m w", myScratchpad "wallpaper") , ("M-m o", spawn "obs") , ("M-m S-o", spawn "osu") , ("M-m s", spawn "syncplay") , ("M-m g", spawn "gimp") , ("M-m k", spawn "kdenlive") , ("M-m l", spawn "lutris") , ("M-m v", spawn "vlc") , ("M-m m", spawn "minecraft-launcher") -- system apps/scratchpads , ("M-b t", spawn myTorrentClient) , ("M-b i", spawn myBrowser) , ("M-b d", myScratchpad "aarandr") , ("M-b c", myScratchpad "calc") , ("M-b b", myScratchpad "blueman") , ("M-b p", myScratchpad "pavucontrol") , ("M-b m", myScratchpad "BPYTOP") , ("M-b n", myScratchpad "nmtui") -- websites , ("M-n y", spawn $ myBrowser ++ " https://youtube.com") , ("M-n d", spawn $ myBrowser ++ " https://duckduckgo.com") , ("M-n g", spawn $ myBrowser ++ " https://google.com") , ("M-n S-g", spawn $ myBrowser ++ " https://github.com") , ("M-n j", spawn $ myBrowser ++ " https://www.youtube.com/playlist?list=PL8lRJQHQWddu55nsz8CezmJJ-GRVISZ1E") , ("M-n k", spawn $ myBrowser ++ " https://www.youtube.com/playlist?list=PL8lRJQHQWddvzCv02lClCfDfUo97wzX1A") , ("M-n c", spawn $ myBrowser ++ " https://www.youtube.com/playlist?list=PL8lRJQHQWdduy2V0DQQ4Lm0P572XJFVB9") , ("M-n v", spawn $ myBrowser ++ " https://vidhukant.xyz") , ("M-n S-v", spawn $ myBrowser ++ " https://blog.vidhukant.xyz") , ("M-n m", spawn $ myBrowser ++ " https://myanimelist.net/profile/0ZeroTsu") , ("M-n S-m", spawn $ myBrowser ++ " https://animixplay.to") -- other apps -- TODO: add scrcpy , ("M-y e", spawn myTextEditor) , ("M-y S-e", spawn "thunderbird") , ("M-y t", spawn myTorrentClient) , ("M-y S-t", spawn "torbrowser-launcher") , ("M-y i", spawn myBrowser) , ("M-y d", spawn "discord") , ("M-y f", spawn "firefox") , ("M-y v", spawn "virt-manager") , ("M-y b", spawn "brave") , ("M-y p", spawn myFileManager) , ("M-y S-p", spawn $ myTerminal' ++ " -e " ++ myFileManager') -- XMonad , ("M-q q", gridselectWindow myGridSelect >>= flip whenJust (\w -> killWindow w)) , ("M-q S-q", killAll) , ("M-q r", sendMessage Rotate) , ("M-q t", sendMessage ToggleStruts) , ("M-q s", sendMessage BSP.Swap) , ("M-q g", goToSelected myGridSelect) , ("M-q c", windows copyToAll) , ("M-q S-c", killAllOtherCopies) , ("M-q b", bringSelected myGridSelect) -- gaps , ("M-q x d", decWindowSpacing 3) , ("M-q x i", incWindowSpacing 3) , ("M-q x S-d", decScreenSpacing 3) , ("M-q x S-i", incScreenSpacing 3) , ("M-q x b", setSmartSpacing False) , ("M-q x S-b", setSmartSpacing True) , ("M-q x n", setWindowSpacingEnabled False) , ("M-q x S-n", setWindowSpacingEnabled True) , ("M-q x m", setScreenSpacingEnabled False) , ("M-q x S-m", setScreenSpacingEnabled True) -- resize windows , ("M-q h", sendMessage $ ExpandTowards L) , ("M-q j", sendMessage $ ExpandTowards D) , ("M-q k", sendMessage $ ExpandTowards U) , ("M-q l", sendMessage $ ExpandTowards R) , ("M-q S-h", sendMessage $ ShrinkFrom L) , ("M-q S-j", sendMessage $ ShrinkFrom D) , ("M-q S-k", sendMessage $ ShrinkFrom U) , ("M-q S-l", sendMessage $ ShrinkFrom R) ]