diff options
Diffstat (limited to '.config/XMonad')
-rw-r--r-- | .config/XMonad/xmonad.hs | 399 |
1 files changed, 148 insertions, 251 deletions
diff --git a/.config/XMonad/xmonad.hs b/.config/XMonad/xmonad.hs index f1907c4..24fabc1 100644 --- a/.config/XMonad/xmonad.hs +++ b/.config/XMonad/xmonad.hs @@ -7,34 +7,23 @@ import Data.Tree import qualified Data.Map as M -- actions -import XMonad.Actions.CycleWS (moveTo, shiftTo, WSType(..), nextScreen, prevScreen) import XMonad.Actions.CopyWindow import XMonad.Actions.CycleWS import XMonad.Actions.GridSelect import XMonad.Actions.SwapWorkspaces -import XMonad.Actions.WindowBringer -import XMonad.Actions.MouseResize -import XMonad.Actions.SpawnOn import qualified XMonad.Actions.TreeSelect as TS -- layout modifiers import XMonad.Layout.Spacing -import XMonad.Layout.LayoutModifier import XMonad.Layout.WindowNavigation as WN -import XMonad.Layout.Renamed as R (renamed, Rename(Replace)) import XMonad.Layout.Maximize import XMonad.Layout.Fullscreen +import XMonad.Layout.NoBorders -- Layouts import XMonad.Layout.BinarySpacePartition as BSP import XMonad.Layout.Grid -import XMonad.Layout.ThreeColumns -import XMonad.Layout.TwoPane -import XMonad.Layout.ResizableTile import XMonad.Layout.Tabbed -import XMonad.Layout.NoBorders -import XMonad.Layout.Accordion -import XMonad.Layout.ZoomRow -- hooks import XMonad.Hooks.SetWMName @@ -45,92 +34,45 @@ import XMonad.Hooks.EwmhDesktops (ewmh) import XMonad.Util.SpawnOnce import XMonad.Util.EZConfig import XMonad.Util.Cursor -import XMonad.Util.Paste -import XMonad.Util.Run import XMonad.Util.NamedScratchpad -myStartupHook :: X () -myStartupHook = do - -- spawnOn "二" "librewolf" - spawnOnce "polybar mybar" - setWMName "LG3D" - setDefaultCursor xC_left_ptr - -- defaults -myModMask :: KeyMask myModMask = mod4Mask - -altMask :: KeyMask altMask = mod1Mask - -myTerminal :: String -myTerminal = "prime-run alacritty" - -myLauncher :: String -myLauncher = "dmenu_run" - -myBrowser :: String -myBrowser = "brave" - -myFileManager :: String -myFileManager = "pcmanfm" - -myEmailClient :: String -myEmailClient = "thunderbird" - -myEditor :: String -myEditor = "nvim" - -myLockscreen :: String myLockscreen = "betterlockscreen -l -t 'Yo, Vidhu!'" - -myScreenshot :: String myScreenshot = "scrot /home/zt/Media/Screenshots/Screenshot-%m-%d-%Y-%T.png" - -myColorPicker :: String myColorPicker = "colorpicker --short --one-shot --preview | xsel -b" +myFont = "xft:Hack:style=Regular:size=14" -- volume -myVolUp :: String myVolUp = "pamixer -i 2 && killall lemonblocks -5" - -myVolDown :: String myVolDown = "pamixer -d 2 && killall lemonblocks -5" - -myVolMute :: String myVolMute = "pamixer -m && killall lemonblocks -5" - -myFont :: String -myFont = "xft:Hack:style=Regular:size=14" - -fBorder = "#bf00ff" --- fBorder = "#3804f4" --- fBorder = "#00ff85" -nBorder = "#130F23" - -myBorderWidth = 2 - -sGap = 4 -- screen gap -wGap = 10 -- window gap - myExtraWorkspaces = [(xK_0, "十")] -- , (xK_comma, " 十一 "), (xK_period, " 十二 "), (xK_slash, " 十三 ")] myWorkspaces = ["一", "二", "三", "四", "五", "六", "七", "八", "九"] ++ (map snd myExtraWorkspaces) --- treeselect config -defaultNavigation = M.fromList - [ ((0, xK_Escape), TS.cancel) - , ((0, xK_Return), TS.select) - , ((0, xK_space), TS.select) - , ((0, xK_Up), TS.movePrev) - , ((0, xK_Down), TS.moveNext) - , ((0, xK_Left), TS.moveParent) - , ((0, xK_Right), TS.moveChild) - , ((0, xK_k), TS.movePrev) - , ((0, xK_j), TS.moveNext) - , ((0, xK_h), TS.moveParent) - , ((0, xK_l), TS.moveChild) - ] +myStartupHook :: X () +myStartupHook = do + spawnOnce "polybar mybar" + setWMName "LG3D" + setDefaultCursor xC_left_ptr + +myScratchpads = [ + NS "Phone" "scrcpy" (title =? "Motorola One Power") defaultFloating, + NS "Terminal" "prime-run alacritty -t 'TerminalScratchpad'" (title =? "TerminalScratchpad") defaultFloating, + NS "Nitrogen" "nitrogen" (title =? "Nitrogen") defaultFloating + ] where role = stringProperty "WM_WINDOW_ROLE" + +myTabTheme = def { fontName = myFont + , activeColor = "#755999" + , inactiveColor = "#282c35" + , activeBorderColor = "#755999" + , inactiveBorderColor = "#313846" + , activeTextColor = "#FFFFFF" + , inactiveTextColor = "#d0d0d0" + , decoHeight = 20 + } myTSConfig = TS.TSConfig { TS.ts_hidechildren = False , TS.ts_background = 0xdd282c34 @@ -180,186 +122,141 @@ myTreeMenu a = TS.treeselectAction a ] ] --- scratchpad config -myScratchpads = [ - NS "Phone" "scrcpy" (title =? "Motorola One Power") defaultFloating, - NS "Terminal" "prime-run alacritty -t 'TerminalScratchpad'" (title =? "TerminalScratchpad") defaultFloating, - NS "Nitrogen" "nitrogen" (title =? "Nitrogen") defaultFloating - ] where role = stringProperty "WM_WINDOW_ROLE" - - --- keybindings myKeys = [ - ((myModMask, xK_Return), spawn (myTerminal)) - , ((0, xK_Print), spawn (myScreenshot)) - , ((myModMask .|. shiftMask, xK_Return), spawn (myScreenshot)) - , ((myModMask, xK_q), spawn (myLockscreen)) - , ((myModMask, xK_n), spawn ("dunstctl close-all")) - - , ((altMask, xK_w), kill1) - , ((myModMask, xK_a), withFocused $ windows . W.sink) -- unfloat windows - - -- launch apps/execute scripts - , ((myModMask, xK_o), spawn (myFileManager)) - , ((myModMask, xK_y), spawn ("gimp")) - , ((myModMask, xK_e), spawn (myEmailClient)) - , ((myModMask, xK_b), spawn ("konqueror")) - , ((myModMask, xK_r), spawn (myTerminal ++ " -e lf")) - - -- launch/copy apps - , ((myModMask .|. shiftMask, xK_o), runOrCopy "pcmanfm" (className =? "Pcmanfm")) - , ((myModMask, xK_m), runOrCopy "prime-run vlc" (className =? "vlc")) - , ((myModMask .|. shiftMask, xK_m), spawn ("prime-run vlc")) - - - -- scratchpad keybindings - , ((myModMask, xK_u), namedScratchpadAction myScratchpads "Phone") - , ((myModMask, xK_t), namedScratchpadAction myScratchpads "Terminal") - , ((myModMask, xK_w), namedScratchpadAction myScratchpads "Nitrogen") - - -- view prev/next workspaces - , ((altMask, xK_h), prevWS) - , ((altMask, xK_l), nextWS) - - -- move to prev/next workspaces - , ((altMask .|. shiftMask, xK_h), shiftToPrev >> prevWS) - , ((altMask .|. shiftMask, xK_l), shiftToNext >> nextWS) - - -- modify gaps on runtime - , ((myModMask, xK_equal), incWindowSpacing 1) - , ((myModMask, xK_minus), decWindowSpacing 1) - , ((myModMask .|. shiftMask, xK_equal), incScreenSpacing 1) - , ((myModMask .|. shiftMask, xK_minus), decScreenSpacing 1) - - -- Swap the focused window and the master window - , ((mod1Mask .|. shiftMask, xK_Return), windows W.swapMaster) - - -- these keybindings are for WindowNavigation - -- and they conflict with BSP layout - -- directional navigation of windows - , ((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 - , ((myModMask .|. shiftMask, xK_l), sendMessage $ WN.Swap R) - , ((myModMask .|. shiftMask, xK_h), sendMessage $ WN.Swap L) - , ((myModMask .|. shiftMask, xK_k), sendMessage $ WN.Swap U) - , ((myModMask .|. shiftMask, xK_j), sendMessage $ WN.Swap D) - - -- cycle through windows - , ((altMask, xK_j), windows W.focusDown) - , ((altMask, xK_k), windows W.focusUp) - - -- kinda bad horizontal resizing of windows in non-bsp layouts - , ((myModMask, xK_Right), sendMessage Expand) - , ((myModMask, xK_Left), sendMessage Shrink) - - -- paste x selection - , ((altMask, xK_v), pasteSelection) - - -- toggle bars - , ((myModMask, xK_backslash), sendMessage ToggleStruts) -- toggle both bars - - -- BSP layout keybindings - -- resize - , ((myModMask .|. mod1Mask, xK_l ), sendMessage $ ExpandTowards R) - , ((myModMask .|. mod1Mask, xK_h ), sendMessage $ ExpandTowards L) - , ((myModMask .|. mod1Mask, xK_j ), sendMessage $ ExpandTowards D) - , ((myModMask .|. mod1Mask, xK_k ), sendMessage $ ExpandTowards U) - , ((myModMask .|. mod1Mask .|. shiftMask , xK_l ), sendMessage $ ShrinkFrom R) - , ((myModMask .|. mod1Mask .|. shiftMask , xK_h ), sendMessage $ ShrinkFrom L) - , ((myModMask .|. mod1Mask .|. shiftMask , xK_j ), sendMessage $ ShrinkFrom D) - , ((myModMask .|. mod1Mask .|. shiftMask , xK_k ), sendMessage $ ShrinkFrom U) - -- other - , ((myModMask, xK_d ), sendMessage Rotate) - , ((myModMask, xK_s ), sendMessage BSP.Swap) - , ((myModMask, xK_f), withFocused (sendMessage . maximizeRestore)) - ] ++ [ -- for extra workspace(s) - ((myModMask, key), (windows $ W.greedyView ws)) - | (key,ws) <- myExtraWorkspaces - ] ++ [ -- also for extra workspaces - ((myModMask .|. shiftMask, key), (windows $ W.shift ws)) - | (key,ws) <- myExtraWorkspaces - ] ++ [ -- to swap workspaces - ((mod1Mask .|. shiftMask, k), windows $ swapWithCurrent i) - | (i, k) <- zip myWorkspaces [xK_1 ..] - ] ++ [ -- copy - ((m .|. myModMask, k), windows $ f i) - | (i, k) <- zip (myWorkspaces) [xK_1 ..] - , (f, m) <- [(copy, shiftMask .|. altMask)] - ] ++ [ -- sticky-ing windows - ((myModMask, xK_v), windows copyToAll) -- make window visible on all screens - , ((myModMask .|. shiftMask, xK_v), killAllOtherCopies) - ] --- Emacs style keybindings -myKeys' :: [(String, X ())] -myKeys' = [-- Running or copying browsers - ("M-i f", runOrCopy "librewolf" (className =? "Firefox")) - , ("M-i S-f", spawn "librewolf") - , ("M-i b", spawn "brave") - , ("M-i S-b", spawn "brave --incognito") - -- this doesn't work when in myKeys - , ("M-c", spawn myColorPicker) - -- Launchers - , ("M-p", myTreeMenu myTSConfig) - , ("M-S-p", spawn myLauncher) - -- GridSelect - , ("M-g g", goToSelected defaultGSConfig) - , ("M-g b", bringSelected defaultGSConfig) - -- volume - , ("<XF86AudioMute>", spawn (myVolMute)) - , ("<XF86AudioLowerVolume>", spawn (myVolDown)) - , ("<XF86AudioRaiseVolume>", spawn (myVolUp)) - ] --- mouse keybindings -myMouseBindings = [ - ((altMask, 2), \w -> kill1) - , ((myModMask, 4), \w -> prevWS) - , ((myModMask, 5), \w -> nextWS) - ] + ((myModMask, xK_Return), spawn ("prime-run alacritty")) + , ((0, xK_Print), spawn (myScreenshot)) + , ((myModMask .|. shiftMask, xK_Return), spawn (myScreenshot)) + , ((myModMask, xK_q), spawn (myLockscreen)) + , ((myModMask, xK_n), spawn ("dunstctl close-all")) + + , ((altMask, xK_w), kill1) + , ((myModMask, xK_a), withFocused $ windows . W.sink) -- unfloat windows + + -- launch apps/execute scripts + , ((myModMask, xK_o), spawn ("pcmanfm")) + , ((myModMask, xK_y), spawn ("gimp")) + , ((myModMask, xK_e), spawn ("thunderbird")) + , ((myModMask, xK_b), spawn ("konqueror")) + , ((myModMask, xK_r), spawn ("prime-run alacritty -e lf")) + + -- launch/copy apps + , ((myModMask .|. shiftMask, xK_o), runOrCopy "pcmanfm" (className =? "Pcmanfm")) + , ((myModMask, xK_m), runOrCopy "prime-run vlc" (className =? "vlc")) + , ((myModMask .|. shiftMask, xK_m), spawn ("prime-run vlc")) + + -- scratchpad keybindings + , ((myModMask, xK_u), namedScratchpadAction myScratchpads "Phone") + , ((myModMask, xK_t), namedScratchpadAction myScratchpads "Terminal") + , ((myModMask, xK_w), namedScratchpadAction myScratchpads "Nitrogen") + + -- modify gaps on runtime + , ((myModMask, xK_equal), incWindowSpacing 1) + , ((myModMask, xK_minus), decWindowSpacing 1) + , ((myModMask .|. shiftMask, xK_equal), incScreenSpacing 1) + , ((myModMask .|. shiftMask, xK_minus), decScreenSpacing 1) + + -- view prev/next workspaces + , ((altMask, xK_h), prevWS) + , ((altMask, xK_l), nextWS) + + -- move to prev/next workspaces + , ((altMask .|. shiftMask, xK_h), shiftToPrev >> prevWS) + , ((altMask .|. shiftMask, xK_l), shiftToNext >> nextWS) + + , ((myModMask, xK_backslash), sendMessage ToggleStruts) -- toggle both bars + , ((myModMask, xK_f), withFocused (sendMessage . maximizeRestore)) -- toggle maximize + + -- cycle through windows + , ((altMask, xK_j), windows W.focusDown) + , ((altMask, 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 + , ((myModMask .|. shiftMask, xK_l), sendMessage $ WN.Swap R) + , ((myModMask .|. shiftMask, xK_h), sendMessage $ WN.Swap L) + , ((myModMask .|. shiftMask, xK_k), sendMessage $ WN.Swap U) + , ((myModMask .|. shiftMask, xK_j), sendMessage $ WN.Swap D) + + -- resize + , ((myModMask .|. mod1Mask, xK_l ), sendMessage $ ExpandTowards R) + , ((myModMask .|. mod1Mask, xK_h ), sendMessage $ ExpandTowards L) + , ((myModMask .|. mod1Mask, xK_j ), sendMessage $ ExpandTowards D) + , ((myModMask .|. mod1Mask, xK_k ), sendMessage $ ExpandTowards U) + , ((myModMask .|. mod1Mask .|. shiftMask , xK_l ), sendMessage $ ShrinkFrom R) + , ((myModMask .|. mod1Mask .|. shiftMask , xK_h ), sendMessage $ ShrinkFrom L) + , ((myModMask .|. mod1Mask .|. shiftMask , xK_j ), sendMessage $ ShrinkFrom D) + , ((myModMask .|. mod1Mask .|. shiftMask , xK_k ), sendMessage $ ShrinkFrom U) + + -- other bsp-only actions + , ((myModMask, xK_d ), sendMessage Rotate) + , ((myModMask, xK_s ), sendMessage BSP.Swap) + ] ++ [ -- for extra workspace(s) + ((myModMask, key), (windows $ W.greedyView ws)) + | (key,ws) <- myExtraWorkspaces + ] ++ [ -- also for extra workspaces + ((myModMask .|. shiftMask, key), (windows $ W.shift ws)) + | (key,ws) <- myExtraWorkspaces + ] ++ [ -- to swap workspaces + ((mod1Mask .|. shiftMask, k), windows $ swapWithCurrent i) + | (i, k) <- zip myWorkspaces [xK_1 ..] + ] ++ [ -- copy + ((m .|. myModMask, k), windows $ f i) + | (i, k) <- zip (myWorkspaces) [xK_1 ..] + , (f, m) <- [(copy, shiftMask .|. altMask)] + ] ++ [ -- sticky-ing windows + ((myModMask, xK_v), windows copyToAll) -- make window visible on all screens + , ((myModMask .|. shiftMask, xK_v), killAllOtherCopies) + ] --- tabs config -myTabTheme = def { fontName = myFont - , activeColor = "#755999" - , inactiveColor = "#282c35" - , activeBorderColor = "#755999" - , inactiveBorderColor = "#313846" - , activeTextColor = "#FFFFFF" - , inactiveTextColor = "#d0d0d0" - , decoHeight = 20 - } +sGap = 4 -- screen gap +wGap = 10 -- window gap --- layouts myGap = spacingRaw True (Border sGap sGap sGap sGap) True (Border wGap wGap wGap wGap) True +myGap' = spacingRaw False (Border sGap sGap sGap sGap) True (Border wGap wGap wGap wGap) True -myLayoutHook = avoidStruts ( -- layouts to be used in almost every workspace - renamed [R.Replace "BSP"] (maximize $ smartBorders $ windowNavigation $ myGap $ emptyBSP) - ||| renamed [R.Replace "Tabbed"] (maximize $ smartBorders $ windowNavigation $ myGap $ tabbed shrinkText myTabTheme) - ||| renamed [R.Replace "Accordion"] (maximize $ smartBorders $ windowNavigation $ myGap $ Accordion) - ||| renamed [R.Replace "ZoomRow"] (maximize $ smartBorders $ windowNavigation $ myGap $ zoomRow) - ||| renamed [R.Replace "TwoPane"] (maximize $ smartBorders $ windowNavigation $ myGap $ TwoPane (3/100) (1/2)) - ||| renamed [R.Replace "ZoomRow Mirrored"] (maximize $ smartBorders $ windowNavigation $ myGap $ Mirror zoomRow) - ||| renamed [R.Replace "ThreeCol Mid (1)"] (maximize $ smartBorders $ windowNavigation $ myGap $ ThreeColMid 1 (3/100) (1/2)) - ||| renamed [R.Replace "ThreeCol Mid (2)"] (maximize $ smartBorders $ windowNavigation $ myGap $ ThreeColMid 2 (3/100) (1/2)) - ||| renamed [R.Replace "Grid"] (maximize $ smartBorders $ windowNavigation $ myGap $ Grid) - ||| renamed [R.Replace "ThreeCol (1)"] (maximize $ smartBorders $ windowNavigation $ myGap $ ThreeCol 1 (3/100) (1/2)) - ||| renamed [R.Replace "Tabbed"] (maximize $ smartBorders $ windowNavigation $ myGap $ tabbed shrinkText myTabTheme) - ||| renamed [R.Replace "ThreeCol (2)"] (maximize $ smartBorders $ windowNavigation $ myGap $ ThreeCol 2 (3/100) (1/2)) - ) +myLayoutHook = avoidStruts $ maximize $ windowNavigation $ ( + myGap' emptyBSP + ||| smartBorders (tabbed shrinkText myTabTheme) + ||| smartBorders (myGap emptyBSP) + ||| smartBorders (myGap Grid) + ) main :: IO () main = do xmonad $ ewmh $ docks $ fullscreenSupport def { - terminal = myTerminal - , focusFollowsMouse = True - , borderWidth = myBorderWidth + focusFollowsMouse = True + , borderWidth = 2 , modMask = myModMask , workspaces = myWorkspaces - , normalBorderColor = nBorder - , focusedBorderColor = fBorder + , normalBorderColor = "#130F23" + , focusedBorderColor = "#BF00FF" , layoutHook = myLayoutHook - , manageHook = manageSpawn <+> namedScratchpadManageHook myScratchpads <+> manageDocks + , manageHook = namedScratchpadManageHook myScratchpads <+> manageDocks , startupHook = myStartupHook -} `additionalMouseBindings` myMouseBindings `additionalKeys` myKeys `additionalKeysP` myKeys' +} `additionalMouseBindings` [ + ((altMask, 2), \w -> kill1) + , ((myModMask, 4), \w -> prevWS) + , ((myModMask, 5), \w -> nextWS) + ] `additionalKeys` myKeys `additionalKeysP` [ + ("M-i f", runOrCopy "librewolf" (className =? "Firefox")) + , ("M-i S-f", spawn "librewolf") + , ("M-i b", spawn "brave") + , ("M-i S-b", spawn "brave --incognito") + -- this doesn't work when in myKeys + , ("M-c", spawn myColorPicker) + -- Launchers + , ("M-p", myTreeMenu myTSConfig) + , ("M-S-p", spawn "dmenu_run") + -- GridSelect + , ("M-g g", goToSelected defaultGSConfig) + , ("M-g b", bringSelected defaultGSConfig) + -- volume + , ("<XF86AudioMute>", spawn (myVolMute)) + , ("<XF86AudioLowerVolume>", spawn (myVolDown)) + , ("<XF86AudioRaiseVolume>", spawn (myVolUp)) + ] |