diff options
Diffstat (limited to 'nixos/config/xmonad.hs')
-rw-r--r-- | nixos/config/xmonad.hs | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/nixos/config/xmonad.hs b/nixos/config/xmonad.hs new file mode 100644 index 0000000..ba14611 --- /dev/null +++ b/nixos/config/xmonad.hs @@ -0,0 +1,304 @@ +-- IMPORTS + +import Data.Map qualified as M +import Data.Monoid +import Graphics.X11.ExtraTypes.XF86 +import System.Exit +import XMonad +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.EwmhDesktops +import XMonad.Hooks.ManageDocks +import XMonad.Layout.Gaps +import XMonad.Layout.Spacing +import XMonad.Layout.ThreeColumns +import XMonad.StackSet qualified as W +import XMonad.Util.Run (spawnPipe) +import XMonad.Util.SpawnOnce (spawnOnce) + +-- Terminal +myTerminal = "kitty" + +-- Whether focus follows the mouse pointer. +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = True + +-- Whether clicking on a window to focus also passes the click to the window +myClickJustFocuses :: Bool +myClickJustFocuses = False + +-- Mod Key (1=Alt 4=Super) +myModMask = mod4Mask + +-- The default number of workspaces (virtual screens) and their names. +-- By default we use numeric strings, but any string may be used as a +-- workspace name. The number of workspaces is determined by the length +-- of this list. +-- +-- A tagging example: +-- +-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] +-- +myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] + +-- Width of the window border in pixels. +myBorderWidth = 2 + +-- Border colors for unfocused and focused windows, respectively. +myNormalBorderColor = "#594C62" + +myFocusedBorderColor = "#C7B2D3" + +------------------------------------------------------------------------ +-- Key bindings. Add, modify or remove key bindings here. +-- +myKeys conf@(XConfig {XMonad.modMask = modm}) = + M.fromList $ + -- launch a terminal + [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf), + -- launch dmenu + ((modm, xK_d), spawn "j4-dmenu-desktop --dmenu='dmenu -i'"), + -- launch dm-scripts menu + ((modm .|. shiftMask, xK_d), spawn "dmenu_run"), + -- launch clipboard menu + ((modm, xK_v), spawn "clipmenu"), + -- close focused window + ((modm .|. shiftMask, xK_q), kill), + -- Brightness Up + ((0, xF86XK_MonBrightnessUp), spawn "brightnessctl s 5%+"), + -- Brightness Down + ((0, xF86XK_MonBrightnessDown), spawn "brightnessctl s 5%-"), + -- Volume Up + ((0, xF86XK_AudioRaiseVolume), spawn "pactl set-sink-volume @DEFAULT_SINK@ +5%"), + -- Volume Down + ((0, xF86XK_AudioLowerVolume), spawn "pactl set-sink-volume @DEFAULT_SINK@ -5%"), + -- Volume Mute + ((0, xF86XK_AudioMute), spawn "pactl set-sink-mute @DEFAULT_SINK@ toggle"), + -- 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_e), windows W.focusDown), + -- Move focus to the previous window + ((modm, xK_i), 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_Return), windows W.swapMaster), + -- Swap the focused window with the next window + ((modm .|. shiftMask, xK_e), windows W.swapDown), + -- Swap the focused window with the previous window + ((modm .|. shiftMask, xK_i), windows W.swapUp), + -- Shrink the master area + ((modm, xK_n), sendMessage Shrink), + -- Expand the master area + ((modm, xK_o), 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) + + -- Quit xmonad + ((modm .|. shiftMask, xK_c), io (exitWith ExitSuccess)), + -- Restart xmonad + -- , ((modm , xK_q ), spawn "xmonad --recompile; pkill xmobar; xmonad --restart") + ((modm, xK_q), spawn "pkill xmobar; xmonad --restart"), + -- Run xmessage with a summary of the default keybindings (useful for beginners) + ((modm .|. shiftMask, xK_slash), spawn ("echo \"" ++ help ++ "\" | xmessage -file -")) + ] + ++ + -- + -- 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) + ] + +------------------------------------------------------------------------ +-- Layouts: + +-- You can specify and transform your layouts by modifying these values. +-- If you change layout bindings be sure to use 'mod-shift-space' after +-- restarting (with 'mod-q') to reset your layout state to the new +-- defaults, as xmonad preserves your old layout settings by default. +-- +-- The available layouts. Note that each layout is separated by |||, +-- which denotes layout choice. +-- +myLayout = avoidStruts $ spacingWithEdge 3 $ tiled ||| ThreeColMid 1 (3 / 100) (1 / 2) ||| Full + where + -- myLayout = gaps [(U,20), (D,20), (L,20), (R,20)] $ avoidStruts tiled ||| Mirror tiled ||| Full + + -- default tiling algorithm partitions the screen into two panes + tiled = Tall nmaster delta ratio + + -- The default number of windows in the master pane + nmaster = 1 + + -- Default proportion of screen occupied by master pane + ratio = 1 / 2 + + -- Percent of screen to increment by when resizing panes + delta = 3 / 100 + +------------------------------------------------------------------------ +-- Window rules: + +-- Execute arbitrary actions and WindowSet manipulations when managing +-- a new window. You can use this to, for example, always float a +-- particular program, or have a client always appear on a particular +-- workspace. +-- +-- To find the property name associated with a program, use +-- > xprop | grep WM_CLASS +-- and click on the client you're interested in. +-- +-- To match on the WM_NAME, you can use 'title' in the same way that +-- 'className' and 'resource' are used below. +-- +myManageHook = + composeAll + [ className =? "mpv" --> doFloat, + resource =? "desktop_window" --> doIgnore + ] + +------------------------------------------------------------------------ +-- Event handling + +-- * EwmhDesktops users should change this to ewmhDesktopsEventHook + +-- +-- Defines a custom handler function for X Events. The function should +-- return (All True) if the default handler is to be run afterwards. To +-- combine event hooks use mappend or mconcat from Data.Monoid. +-- +-- myEventHook = mempty +myEventHook = docksEventHook <+> handleEventHook def <+> fullscreenEventHook + +------------------------------------------------------------------------ +-- Status bars and logging + +-- Perform an arbitrary action on each internal state change or X event. +-- See the 'XMonad.Hooks.DynamicLog' extension for examples. +-- +myLogHook = return () + +------------------------------------------------------------------------ +-- Startup hook + +-- Perform an arbitrary action each time xmonad starts or is restarted +-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize +-- per-workspace layout choices. +-- +-- By default, do nothing. +myStartupHook = do + spawnOnce "setxkbmap -layout us -variant colemak -option caps:escape" + spawnOnce "xsetroot -cursor_name left_ptr" + spawnOnce "feh --bg-scale ~/.wallpapers/PastelPinkLightning.jpg &" + spawnOnce "picom &" + spawnOnce "clipmenud &" + +------------------------------------------------------------------------ +-- XMobar + +myPP = + xmobarPP + { ppCurrent = xmobarColor "#907F9B" "" . wrap "" "", + ppTitle = xmobarColor "#C7B2D3" "" . shorten 100, + ppSep = " | ", + ppOrder = \(ws : _ : t : _) -> [ws, t] + } + +toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b) + +------------------------------------------------------------------------ +-- Now run xmonad with all the defaults we set up. + +-- Run xmonad with the settings you specify. No need to modify this. +-- +-- main = do +-- xmproc <- spawnPipe "xmobar -x 0 /home/venomade/.xmobarrc" +-- xmonad $ docks defaults +main = xmonad =<< statusBar "xmobar" myPP toggleStrutsKey defaults + +-- A structure containing your configuration settings, overriding +-- fields in the default config. Any you don't override, will +-- use the defaults defined in xmonad/XMonad/Config.hs +-- +-- No need to modify this. +-- +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 + } + +-- | Finally, a copy of the default bindings in simple textual tabular format. +help :: String +help = unlines ["Read xmonad.hs"] |