From fd9b80d992fda97ff4e2c01cb4168584bda5d614 Mon Sep 17 00:00:00 2001 From: JasterV <49537445+JasterV@users.noreply.github.com> Date: Sat, 12 Apr 2025 01:04:20 +0200 Subject: [PATCH] update xmonad.hs --- .config/xmonad/xmonad.hs | 342 ++++++++++++++++++++++++++++++--------- 1 file changed, 269 insertions(+), 73 deletions(-) diff --git a/.config/xmonad/xmonad.hs b/.config/xmonad/xmonad.hs index 86f068f..c3fc82a 100644 --- a/.config/xmonad/xmonad.hs +++ b/.config/xmonad/xmonad.hs @@ -1,87 +1,283 @@ +import qualified Data.Map as M +import Data.Monoid +import System.Exit import XMonad -import XMonad.Hooks.DynamicLog -import XMonad.Hooks.EwmhDesktops -import XMonad.Hooks.ManageDocks -import XMonad.Hooks.ManageHelpers -import XMonad.Hooks.StatusBar -import XMonad.Hooks.StatusBar.PP -import XMonad.Layout.Magnifier -import XMonad.Layout.ThreeColumns -import XMonad.Operations -import XMonad.Util.EZConfig -import XMonad.Util.Loggers +import qualified XMonad.StackSet as W import XMonad.Util.SpawnOnce -main :: IO () -main = - xmonad - . ewmhFullscreen - . ewmh - . withEasySB (statusBarProp "xmobar -x 0 ~/.config/xmobar/xmobarrc" (pure myXmobarPP)) defToggleStrutsKey - $ myConfig +------------------------------------------------------------------------ +-- Now run xmonad with all the defaults we set up. -myConfig = +-- Run xmonad with the settings you specify. No need to modify this. +-- +main = xmonad 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 - { modMask = mod4Mask, -- Rebind Mod to the Super key - layoutHook = myLayout, -- Use custom layouts - manageHook = myManageHook, -- Match on certain windows - startupHook = myStartupHook, - terminal = "ghostty" + { -- simple stuff + terminal = "ghostty", + focusFollowsMouse = False, + clickJustFocuses = False, + borderWidth = 2, + modMask = mod4Mask, + workspaces = myWorkspaces, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + -- key bindings + keys = myKeys, + mouseBindings = myMouseBindings, + -- hooks, layouts + layoutHook = myLayout, + manageHook = myManageHook, + handleEventHook = myEventHook, + logHook = myLogHook, + startupHook = myStartupHook } - `additionalKeysP` [ ("M-S-z", spawn "xscreensaver-command -lock"), - ("M-C-s", unGrab *> spawn "scrot -s"), - ("M-f", spawn "brave-browser") - ] +-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] +myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] + +-- Border colors for unfocused and focused windows, respectively. +myNormalBorderColor = "#dddddd" + +myFocusedBorderColor = "#ff0000" + +------------------------------------------------------------------------ +-- 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_p), spawn "dmenu_run"), + -- launch gmrun + ((modm .|. shiftMask, xK_p), spawn "gmrun"), + -- close focused window + ((modm .|. shiftMask, xK_c), 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_Return), 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) + + -- Quit xmonad + ((modm .|. shiftMask, xK_q), io (exitWith ExitSuccess)), + -- Restart xmonad + ((modm, xK_q), spawn "xmonad --recompile; 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 = tiled ||| Mirror tiled ||| Full + where + -- 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 =? "MPlayer" --> doFloat, + className =? "Gimp" --> doFloat, + resource =? "desktop_window" --> doIgnore, + resource =? "kdesktop" --> 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 + +------------------------------------------------------------------------ +-- 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. myStartupHook = do spawnOnce "sh ~/.screenlayout/default.sh" spawnOnce "xsetroot -cursor_name left_ptr" - spawnOnce "xfce4-power-manager &" - spawnOnce "nm-applet --sm-disable &" - spawnOnce "trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 10 --transparent true --tint 0x5f5f5f --height 18 &" spawnOnce "feh --bg-fill /usr/share/backgrounds/Fuji_san_by_amaral.png" spawnOnce "xscreensaver -no-splash &" -myManageHook :: ManageHook -myManageHook = - composeAll - [ className =? "Gimp" --> doFloat, - isDialog --> doFloat +-- | Finally, a copy of the default bindings in simple textual tabular format. +help :: String +help = + unlines + [ "The default modifier key is 'alt'. Default keybindings:", + "", + "-- launching and killing programs", + "mod-Shift-Enter Launch xterminal", + "mod-p Launch dmenu", + "mod-Shift-p Launch gmrun", + "mod-Shift-c Close/kill the focused window", + "mod-Space Rotate through the available layout algorithms", + "mod-Shift-Space Reset the layouts on the current workSpace to default", + "mod-n Resize/refresh viewed windows to the correct size", + "", + "-- move focus up or down the window stack", + "mod-Tab Move focus to the next window", + "mod-Shift-Tab Move focus to the previous window", + "mod-j Move focus to the next window", + "mod-k Move focus to the previous window", + "mod-m Move focus to the master window", + "", + "-- modifying the window order", + "mod-Return Swap the focused window and the master window", + "mod-Shift-j Swap the focused window with the next window", + "mod-Shift-k Swap the focused window with the previous window", + "", + "-- resizing the master/slave ratio", + "mod-h Shrink the master area", + "mod-l Expand the master area", + "", + "-- floating layer support", + "mod-t Push window back into tiling; unfloat and re-tile it", + "", + "-- increase or decrease number of windows in the master area", + "mod-comma (mod-,) Increment the number of windows in the master area", + "mod-period (mod-.) Deincrement the number of windows in the master area", + "", + "-- quit, or restart", + "mod-Shift-q Quit xmonad", + "mod-q Restart xmonad", + "mod-[1..9] Switch to workSpace N", + "", + "-- Workspaces & screens", + "mod-Shift-[1..9] Move client to workspace N", + "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", + "", + "-- Mouse bindings: default actions bound to mouse events", + "mod-button1 Set the window to floating mode and move by dragging", + "mod-button2 Raise the window to the top of the stack", + "mod-button3 Set the window to floating mode and resize by dragging" ] - -myLayout = tiled ||| Mirror tiled ||| Full ||| threeCol - where - threeCol = magnifiercz' 1.3 $ ThreeColMid nmaster delta ratio - tiled = Tall nmaster delta ratio - nmaster = 1 -- Default number of windows in the master pane - ratio = 1 / 2 -- Default proportion of screen occupied by master pane - delta = 3 / 100 -- Percent of screen to increment by when resizing panes - -myXmobarPP :: PP -myXmobarPP = - def - { ppSep = magenta " • ", - ppTitleSanitize = xmobarStrip, - ppCurrent = wrap " " "" . xmobarBorder "Top" "#8be9fd" 2, - ppHidden = white . wrap " " "", - ppHiddenNoWindows = lowWhite . wrap " " "", - ppUrgent = red . wrap (yellow "!") (yellow "!"), - ppOrder = \[ws, l, _, wins] -> [ws, l, wins], - ppExtras = [logTitles formatFocused formatUnfocused] - } - where - formatFocused = wrap (white "[") (white "]") . magenta . ppWindow - formatUnfocused = wrap (lowWhite "[") (lowWhite "]") . blue . ppWindow - - -- \| Windows should have *some* title, which should not not exceed a - -- sane length. - ppWindow :: String -> String - ppWindow = xmobarRaw . (\w -> if null w then "untitled" else w) . shorten 30 - - blue, lowWhite, magenta, red, white, yellow :: String -> String - magenta = xmobarColor "#ff79c6" "" - blue = xmobarColor "#bd93f9" "" - white = xmobarColor "#f8f8f2" "" - yellow = xmobarColor "#f1fa8c" "" - red = xmobarColor "#ff5555" "" - lowWhite = xmobarColor "#bbbbbb" ""