about summary refs log tree commit diff
path: root/nixos/config/xmonad.hs
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/config/xmonad.hs')
-rw-r--r--nixos/config/xmonad.hs304
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"]