dotfiles/.xmonad/xmonad-laptop.hs
2021-07-25 19:06:29 +02:00

190 lines
5.9 KiB
Haskell

import qualified Data.Map as M
import Data.Monoid
import System.Exit
import XMonad
import XMonad.Util.Run
import XMonad.Util.SpawnOnce
import XMonad.Layout.Spacing
import XMonad.Hooks.ManageDocks
import qualified XMonad.StackSet as W
myTerminal :: String
myTerminal = "kitty"
myBrowser :: String
myBrowser = "brave"
myAppMenu :: String
myAppMenu = "rofi -show run"
myAppMenuThemes :: String
myAppMenuThemes = "rofi-theme-selector"
myFocusFollowsMouse :: Bool
myFocusFollowsMouse = True
myClickJustFocuses :: Bool
myClickJustFocuses = False
myBorderWidth = 3
myModMask = mod4Mask
myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
myNormalBorderColor = "#dddddd"
myFocusedBorderColor = "#ff8700"
myKeys conf@(XConfig {XMonad.modMask = modm}) =
M.fromList $
-- launch a terminal
[ ((modm, xK_Return), spawn $ XMonad.terminal conf),
-- launch dmenu
((modm, xK_p), spawn myAppMenu),
-- launch gmrun
((modm .|. shiftMask, xK_p), spawn myAppMenuThemes),
-- close focused window
((modm, xK_q), kill),
-- Rotate through the available layout algorithms
((modm, xK_space), sendMessage NextLayout),
-- Reset the layouts on the current workspace to default
((modm .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf),
-- Resize viewed windows to the correct size
((modm, xK_n), refresh),
-- Move focus to the next window
((modm, xK_Tab), windows W.focusDown),
-- Move focus to the next window
((modm, xK_j), windows W.focusDown),
-- Move focus to the previous window
((modm, xK_k), windows W.focusUp),
-- Move focus to the master window
((modm, xK_m), windows W.focusMaster),
-- Swap the focused window and the master window
((modm, xK_s), windows W.swapMaster),
-- Swap the focused window with the next window
((modm .|. shiftMask, xK_j), windows W.swapDown),
-- Swap the focused window with the previous window
((modm .|. shiftMask, xK_k), windows W.swapUp),
-- Shrink the master area
((modm, xK_h), sendMessage Shrink),
-- Expand the master area
((modm, xK_l), sendMessage Expand),
-- Push window back into tiling
((modm, xK_t), withFocused $ windows . W.sink),
-- Increment the number of windows in the master area
((modm, xK_comma), sendMessage (IncMasterN 1)),
-- Deincrement the number of windows in the master area
((modm, xK_period), sendMessage (IncMasterN (-1))),
-- Toggle the status bar gap
-- Use this binding with avoidStruts from Hooks.ManageDocks.
-- See also the statusBar function from Hooks.DynamicLog.
--
-- , ((modm , xK_b ), sendMessage ToggleStruts)
-- Launch Browser
((modm, xK_i), spawn myBrowser),
((modm .|. shiftMask, xK_s), spawn "systemctl suspend"),
-- Quit xmonad
((modm .|. shiftMask, xK_q), io (exitWith ExitSuccess)),
-- Restart xmonad
((modm .|. shiftMask, xK_o), spawn "xmonad --recompile; xmonad --restart")
]
++
--
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
--
[ ((m .|. modm, k), windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9],
(f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
]
++
--
--
-- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
-- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
--
[ ((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
| (key, sc) <- zip [xK_w, xK_e, xK_r] [0 ..],
(f, m) <- [(W.view, 0), (W.shift, shiftMask)]
]
------------------------------------------------------------------------
-- Mouse bindings: default actions bound to mouse events
--
myMouseBindings (XConfig {XMonad.modMask = modm}) =
M.fromList $
-- mod-button1, Set the window to floating mode and move by dragging
[ ( (modm, button1),
( \w ->
focus w >> mouseMoveWindow w
>> windows W.shiftMaster
)
),
-- mod-button2, Raise the window to the top of the stack
((modm, button2), (\w -> focus w >> windows W.shiftMaster)),
-- mod-button3, Set the window to floating mode and resize by dragging
( (modm, button3),
( \w ->
focus w >> mouseResizeWindow w
>> windows W.shiftMaster
)
)
-- you may also bind events to the mouse scroll wheel (button4 and button5)
]
myLayout = spacing 24 $ avoidStruts (tiled ||| Mirror tiled ||| Full)
where
tiled = Tall nmaster delta ratio
nmaster = 1
ratio = 1/2
delta = 3/100
myManageHook =
composeAll
[ className =? "MPlayer" --> doFloat,
className =? "Gimp" --> doFloat,
resource =? "desktop_window" --> doIgnore,
resource =? "kdesktop" --> doIgnore
]
myEventHook = mempty
myLogHook = return ()
myStartupHook = do
spawnOnce "xrandr --output DP-0 --primary --left-of HDMI-0 --auto &"
spawnOnce "nitrogen --restore &"
spawnOnce "killall picom; picom --config ~/.config/picom/picom.conf --vsync &"
spawnOnce "killall jackd;"
main = do
-- xmproc0 <- spawnPipe ""
xmproc0 <- spawnPipe "killall xmobar; xmobar ~/.config/xmobar/xmobar.config"
xmproc1 <- spawnPipe "jackd"
xmonad $ docks defaults
defaults =
def
{ -- simple stuff
terminal = myTerminal,
focusFollowsMouse = myFocusFollowsMouse,
clickJustFocuses = myClickJustFocuses,
borderWidth = myBorderWidth,
modMask = myModMask,
workspaces = myWorkspaces,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
-- key bindings
keys = myKeys,
mouseBindings = myMouseBindings,
-- hooks, layouts
layoutHook = myLayout,
manageHook = myManageHook,
handleEventHook = myEventHook,
logHook = myLogHook,
startupHook = myStartupHook
}