diff --git a/nix/configurations/vanadium/home/xmonad/xmonad.hs b/nix/configurations/vanadium/home/xmonad/xmonad.hs index ed2d5c7c..194247a9 100644 --- a/nix/configurations/vanadium/home/xmonad/xmonad.hs +++ b/nix/configurations/vanadium/home/xmonad/xmonad.hs @@ -31,196 +31,197 @@ import Leanamonad.GreekChar -- Note: `xmonad --restart` will make Firefox's fullscreen work duck the xmobar stop working -- You need restart Firefox main :: IO () -main = xmonad - -- Fix all java things that don't scale with XMonad - -- https://wiki.archlinux.org/title/java#Gray_window,_applications_not_resizing_with_WM,_menus_immediately_closing - . javaHack - . dynamicEasySBs xmonadOn - . ewmhFullscreen . ewmh - $ def - { modMask = superMask - , borderWidth = 5 - , normalBorderColor = "#18005f" - , focusedBorderColor = "#875fff" - , focusFollowsMouse = True - , terminal = myTerm - , workspaces = myWorkspaces +main = + xmonad + -- Fix all java things that don't scale with XMonad + -- https://wiki.archlinux.org/title/java#Gray_window,_applications_not_resizing_with_WM,_menus_immediately_closing + . javaHack + . dynamicEasySBs xmonadOn + . ewmhFullscreen . ewmh + $ def + { modMask = superMask + , borderWidth = 5 + , normalBorderColor = "#18005f" + , focusedBorderColor = "#875fff" + , focusFollowsMouse = True + , terminal = myTerm + , workspaces = myWorkspaces - , logHook = - let - fadeHook = - composeAll - [ opaque + , logHook = + let + fadeHook = + composeAll + [ opaque - , className ~? "steam" --> opaque + , className ~? "steam" --> opaque - -- Based on state - , isUnfocused --> transparency 0.08 - , isFloating --> transparency 0.08 + -- Based on state + , isUnfocused --> transparency 0.08 + , isFloating --> transparency 0.08 - , isFirefoxFullscreen --> opaque - , isFirefoxPIP --> opaque - , isFirefoxVideo --> opaque - ] - in - fadeWindowsLogHook fadeHook - <+> refocusLastLogHook - - , startupHook = do - spawnOnce "fcitx5 &" -- Input method - spawn "feh --no-fehbg --bg-fill ~/.wallpaper &" -- wallpaper - - -- Needed to make gnome keyring work - -- https://wiki.archlinux.org/title/GNOME/Keyring#Using_gnome-keyring-daemon_outside_desktop_environments_(KDE,_GNOME,_XFCE,_...) - spawn "dbus-update-activation-environment DISPLAY XAUTHORITY WAYLAND_DISPLAY" - - , layoutHook = - let tallr = reflectMsg . reflectHoriz - $ ResizableTall 1 (1/10) (3/7) [] - in smartBorders - ( named "Normal" - (smartSpacingWithEdge 5 tallr) - ||| Full - ) - - , manageHook = - let - hasEvenWindows :: X Bool - hasEvenWindows = g <$> get - where g = - even . length . W.integrate' - . W.stack . W.workspace . W.current . windowset - in - composeAll - [ className ~? "NautilusPreviewer" --> customFloating centeredFloat - , className =? "feh" --> doFloat - , isFirefoxPIP --> doFloat - - , namedScratchpadManageHook myScratchpads - ] - - <+> - composeOne - [ className =? "firefox" -?> insertPosition Above Newer - , className =? "sioyek" -?> insertPosition Below Older - , className =? "kitty" -?> insertPosition Below Newer - , className ~? "Nautilus" -?> insertPosition Below Older -- For some reason Older doesn't work - - , ifM - (liftX hasEvenWindows) - (Just <$> insertPosition Below Newer) -- New window is odd - (Just <$> insertPosition Above Newer) -- New window is even - ] - } - - -- Only remove mappings that needs pass through (it's a map). - `removeKeys` - [ (superMask, xK_h) - , (superMask, xK_l) - , (superMask, xK_p) - - -- It has been more than once that I actidently killed xmonad >:( - , (superMask .|. shiftMask, xK_q) - ] - ++ [ (superMask , n) | n <- [xK_1 .. xK_9] ] - ++ [ (superMask .|. shiftMask, n) | n <- [xK_1 .. xK_9] ] - - `additionalKeys` - [ - -- Display - ((0, xF86XK_MonBrightnessDown), spawn "light -U 5") - , ((0, xF86XK_MonBrightnessUp ), spawn "light -A 5") - , ((shiftMask, xF86XK_MonBrightnessDown), spawn "light -U 1") - , ((shiftMask, xF86XK_MonBrightnessUp ), spawn "light -A 1") - - -- Volume adjustments - -- Don't overload the mute button - -- In case of doubt, smashing the button becomes deterministic - , ((0, xF86XK_AudioMute), spawn "pactl -- set-sink-mute 0 1" ) -- mute - , ((controlMask, xF86XK_AudioMute), spawn "pactl -- set-sink-mute 0 0" ) -- unmute - , ((0, xF86XK_AudioLowerVolume), spawn "pactl -- set-sink-volume 0 -5%") - , ((0, xF86XK_AudioRaiseVolume), spawn "pactl -- set-sink-volume 0 +5%") - , ((shiftMask, xF86XK_AudioLowerVolume), spawn "pactl -- set-sink-volume 0 -1%") - , ((shiftMask, xF86XK_AudioRaiseVolume), spawn "pactl -- set-sink-volume 0 +1%") - - -- Playback control - , ((0, xF86XK_AudioPrev), spawn "playerctl previous" ) - , ((0, xF86XK_AudioPlay), spawn "playerctl play-pause") - , ((0, xF86XK_AudioNext), spawn "playerctl next" ) - - -- Toggle fullscreen - , ((superMask, xK_Escape), sendMessage NextLayout) - - -- Resize windows - , ((superMask, xK_equal ), sendMessage $ IncMasterN 1) - , ((superMask, xK_minus ), sendMessage $ IncMasterN -1) - , ((superMask, xK_comma ), sendMessage Shrink ) - , ((superMask, xK_period ), sendMessage Expand ) - , ((superMask .|. shiftMask, xK_comma ), sendMessage MirrorShrink ) - , ((superMask .|. shiftMask, xK_period), sendMessage MirrorExpand ) - - -- [D]o sink and lift - , ( (superMask, xK_d) - , submap $ M.fromList - [ ((0, xK_t), withFocused $ windows . W.sink) - , ((0, xK_l), withFocused $ windows . flip W.float centeredFloat) + , isFirefoxFullscreen --> opaque + , isFirefoxPIP --> opaque + , isFirefoxVideo --> opaque ] - ) - ] + in + fadeWindowsLogHook fadeHook + <+> refocusLastLogHook - -- Screenshots - ++ (let - fullscreen = "maim -u | xclip -in -selection clipboard -t image/png" - withSelection = "maim -u -s -b 5 -o | xclip -in -selection clipboard -t image/png" - toFloat = "maim -u -s -b 5 -o | feh --auto-zoom -" - in - [ ((0, xK_Print), spawn fullscreen ) - , ((superMask .|. shiftMask, xK_3 ), spawn fullscreen ) - , ((superMask .|. shiftMask, xK_4 ), spawn withSelection) - , ((superMask .|. shiftMask, xK_5 ), spawn toFloat ) - ]) + , startupHook = do + spawnOnce "fcitx5 &" -- Input method + spawn "feh --no-fehbg --bg-fill ~/.wallpaper &" -- wallpaper - -- Yeet - ++ (let - workspaceKeys = [xK_h, xK_t, xK_n, xK_s, xK_m, xK_w, xK_v, xK_z] - in - [ ((superMask, k), windows $ W.greedyView space) - | (k, space) <- zip workspaceKeys myWorkspaces - ] - ++ - [ ((superMask .|. altMask, k), windows $ W.greedyView space . W.shift space) - | (k, space) <- zip workspaceKeys myWorkspaces - ] - ++ - [ ((superMask .|. controlMask, k), windows $ swapWithCurrent space) - | (k, space) <- zip workspaceKeys myWorkspaces - ]) + -- Needed to make gnome keyring work + -- https://wiki.archlinux.org/title/GNOME/Keyring#Using_gnome-keyring-daemon_outside_desktop_environments_(KDE,_GNOME,_XFCE,_...) + spawn "dbus-update-activation-environment DISPLAY XAUTHORITY WAYLAND_DISPLAY" - -- Launcher - ++ (let - launchFirefox = "if type firefox; then firefox; else firefox-esr; fi" - launchDmenu = "dmenu_run -i -fn \"Iosevka-14\" -nb \"#36363a\" -nf \"#e2e2e4\" -sb \"#f7f7f8\" -sf \"#36363a\" -l 10" - lock = "xscreensaver-command -lock" - in - [ ((controlMask .|. altMask, xK_m), namedScratchpadAction myScratchpads "cmus" ) - , ((controlMask .|. altMask, xK_t), namedScratchpadAction myScratchpads "btop" ) - , ((controlMask .|. altMask, xK_p), namedScratchpadAction myScratchpads "pass" ) - , ((controlMask .|. altMask, xK_e), namedScratchpadAction myScratchpads "emoji-picker") - , ((controlMask .|. altMask, xK_b), spawn launchFirefox ) - , ((superMask, xK_o), spawn launchDmenu ) - , ((superMask, xK_l), spawn lock ) - ]) + , layoutHook = + let tallr = reflectMsg . reflectHoriz + $ ResizableTall 1 (1/10) (3/7) [] + in smartBorders + ( named "Normal" + (smartSpacingWithEdge 5 tallr) + ||| Full + ) - ++ (let - powerprofile p = (p, spawn $ "powerprofilesctl set " ++ p) + , manageHook = + let + hasEvenWindows :: X Bool + hasEvenWindows = g <$> get + where g = + even . length . W.integrate' + . W.stack . W.workspace . W.current . windowset in - [ ( (superMask, xK_p), visualSubmap def $ M.fromList - [ ((0, xK_1), powerprofile "power-saver") - , ((0, xK_2), powerprofile "balanced" ) - , ((0, xK_3), powerprofile "performance") - ] - ) - ]) + composeAll + [ className ~? "NautilusPreviewer" --> customFloating centeredFloat + , className =? "feh" --> doFloat + , isFirefoxPIP --> doFloat + + , namedScratchpadManageHook myScratchpads + ] + + <+> + composeOne + [ className =? "firefox" -?> insertPosition Above Newer + , className =? "sioyek" -?> insertPosition Below Older + , className =? "kitty" -?> insertPosition Below Newer + , className ~? "Nautilus" -?> insertPosition Below Older -- For some reason Older doesn't work + + , ifM + (liftX hasEvenWindows) + (Just <$> insertPosition Below Newer) -- New window is odd + (Just <$> insertPosition Above Newer) -- New window is even + ] + } + + -- Only remove mappings that needs pass through (it's a map). + `removeKeys` + [ (superMask, xK_h) + , (superMask, xK_l) + , (superMask, xK_p) + + -- It has been more than once that I actidently killed xmonad >:( + , (superMask .|. shiftMask, xK_q) + ] + ++ [ (superMask , n) | n <- [xK_1 .. xK_9] ] + ++ [ (superMask .|. shiftMask, n) | n <- [xK_1 .. xK_9] ] + + `additionalKeys` + [ + -- Display + ((0, xF86XK_MonBrightnessDown), spawn "light -U 5") + , ((0, xF86XK_MonBrightnessUp ), spawn "light -A 5") + , ((shiftMask, xF86XK_MonBrightnessDown), spawn "light -U 1") + , ((shiftMask, xF86XK_MonBrightnessUp ), spawn "light -A 1") + + -- Volume adjustments + -- Don't overload the mute button + -- In case of doubt, smashing the button becomes deterministic + , ((0, xF86XK_AudioMute), spawn "pactl -- set-sink-mute 0 1" ) -- mute + , ((controlMask, xF86XK_AudioMute), spawn "pactl -- set-sink-mute 0 0" ) -- unmute + , ((0, xF86XK_AudioLowerVolume), spawn "pactl -- set-sink-volume 0 -5%") + , ((0, xF86XK_AudioRaiseVolume), spawn "pactl -- set-sink-volume 0 +5%") + , ((shiftMask, xF86XK_AudioLowerVolume), spawn "pactl -- set-sink-volume 0 -1%") + , ((shiftMask, xF86XK_AudioRaiseVolume), spawn "pactl -- set-sink-volume 0 +1%") + + -- Playback control + , ((0, xF86XK_AudioPrev), spawn "playerctl previous" ) + , ((0, xF86XK_AudioPlay), spawn "playerctl play-pause") + , ((0, xF86XK_AudioNext), spawn "playerctl next" ) + + -- Toggle fullscreen + , ((superMask, xK_Escape), sendMessage NextLayout) + + -- Resize windows + , ((superMask, xK_equal ), sendMessage $ IncMasterN 1) + , ((superMask, xK_minus ), sendMessage $ IncMasterN -1) + , ((superMask, xK_comma ), sendMessage Shrink ) + , ((superMask, xK_period ), sendMessage Expand ) + , ((superMask .|. shiftMask, xK_comma ), sendMessage MirrorShrink ) + , ((superMask .|. shiftMask, xK_period), sendMessage MirrorExpand ) + + -- [D]o sink and lift + , ( (superMask, xK_d) + , submap $ M.fromList + [ ((0, xK_t), withFocused $ windows . W.sink) + , ((0, xK_l), withFocused $ windows . flip W.float centeredFloat) + ] + ) + ] + + -- Screenshots + ++ (let + fullscreen = "maim -u | xclip -in -selection clipboard -t image/png" + withSelection = "maim -u -s -b 5 -o | xclip -in -selection clipboard -t image/png" + toFloat = "maim -u -s -b 5 -o | feh --auto-zoom -" + in + [ ((0, xK_Print), spawn fullscreen ) + , ((superMask .|. shiftMask, xK_3 ), spawn fullscreen ) + , ((superMask .|. shiftMask, xK_4 ), spawn withSelection) + , ((superMask .|. shiftMask, xK_5 ), spawn toFloat ) + ]) + + -- Yeet + ++ (let + workspaceKeys = [xK_h, xK_t, xK_n, xK_s, xK_m, xK_w, xK_v, xK_z] + in + [ ((superMask, k), windows $ W.greedyView space) + | (k, space) <- zip workspaceKeys myWorkspaces + ] + ++ + [ ((superMask .|. altMask, k), windows $ W.greedyView space . W.shift space) + | (k, space) <- zip workspaceKeys myWorkspaces + ] + ++ + [ ((superMask .|. controlMask, k), windows $ swapWithCurrent space) + | (k, space) <- zip workspaceKeys myWorkspaces + ]) + + -- Launcher + ++ (let + launchFirefox = "if type firefox; then firefox; else firefox-esr; fi" + launchDmenu = "dmenu_run -i -fn \"Iosevka-14\" -nb \"#36363a\" -nf \"#e2e2e4\" -sb \"#f7f7f8\" -sf \"#36363a\" -l 10" + lock = "xscreensaver-command -lock" + in + [ ((controlMask .|. altMask, xK_m), namedScratchpadAction myScratchpads "cmus" ) + , ((controlMask .|. altMask, xK_t), namedScratchpadAction myScratchpads "btop" ) + , ((controlMask .|. altMask, xK_p), namedScratchpadAction myScratchpads "pass" ) + , ((controlMask .|. altMask, xK_e), namedScratchpadAction myScratchpads "emoji-picker") + , ((controlMask .|. altMask, xK_b), spawn launchFirefox ) + , ((superMask, xK_o), spawn launchDmenu ) + , ((superMask, xK_l), spawn lock ) + ]) + + ++ (let + powerprofile p = (p, spawn $ "powerprofilesctl set " ++ p) + in + [ ( (superMask, xK_p), visualSubmap def $ M.fromList + [ ((0, xK_1), powerprofile "power-saver") + , ((0, xK_2), powerprofile "balanced" ) + , ((0, xK_3), powerprofile "performance") + ] + ) + ]) myTerm :: String myTerm = "kitty"