Cap XMonad volume at 100% and clean up config

- Raise volume with wpctl, capped at 100%
- Define workspace names once instead of repeating the strings
- Remove unused imports and the never-matching transmission-gtk rule
- Add missing type signatures
- Document why the isFullscreen rule is needed alongside ewmhFullscreen
This commit is contained in:
Daniele Fucini
2026-10-08 16:11:27 +02:00
parent c7275031ba
commit 4d905774b8
+39 -33
View File
@@ -1,22 +1,17 @@
-- Import
import Data.Default
import Data.Monoid
import Graphics.X11.ExtraTypes.XF86
import Control.Monad (liftM2)
import XMonad
import XMonad.Actions.PhysicalScreens
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.FloatConfigureReq
import XMonad.Hooks.InsertPosition
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.Rescreen
import XMonad.Hooks.StatusBar
import XMonad.Hooks.StatusBar.PP
import XMonad.Layout.Grid
import XMonad.Layout.LayoutCombinators
import XMonad.Layout.Magnifier
import XMonad.Layout.NoBorders
import XMonad.Layout.PerWorkspace
@@ -61,8 +56,10 @@ myFocusBorderColor = "#41a6b5"
myKeyboardLayoutIT :: String
myKeyboardLayoutIT = " -layout it"
myKeyboardLayoutUS :: String
myKeyboardLayoutUS = " -layout us"
myKeyboardLayoutSK :: String
myKeyboardLayoutSK = " -layout sk -variant qwerty"
myScreenshotDir :: String
@@ -145,7 +142,7 @@ myConfig =
]
`additionalKeys` [ ((0, xF86XK_AudioMute), spawn "pactl set-sink-mute $(pactl get-default-sink) toggle"),
((0, xF86XK_AudioLowerVolume), spawn "pactl set-sink-volume $(pactl get-default-sink) -10%"),
((0, xF86XK_AudioRaiseVolume), spawn "pactl set-sink-volume $(pactl get-default-sink) +10%"),
((0, xF86XK_AudioRaiseVolume), spawn "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 10%+"),
((0, xF86XK_Calculator), spawn "qalculate-gtk"),
((0, xF86XK_HomePage), spawn myBrowser),
((0, xF86XK_Mail), namedScratchpadAction myScratchpads "Mail"),
@@ -158,10 +155,19 @@ myConfig =
-- Workspaces
myWorkspaces :: [String]
myWorkspaces = ["1:\xf489 ", "2:\xe743 ", "3:\xf1b6 ", "4:\xf10b ", "5:\xead9 ", "6:\xeb69 ", "7:\xea7a "] ++ map show [8, 9]
myWorkspaces = [wsTerm, wsWeb, wsGames, wsChat, wsMedia, wsDocs, wsVM] ++ map show [8, 9]
wsTerm, wsWeb, wsGames, wsChat, wsMedia, wsDocs, wsVM :: String
wsTerm = "1:\xf489 "
wsWeb = "2:\xe743 "
wsGames = "3:\xf1b6 "
wsChat = "4:\xf10b "
wsMedia = "5:\xead9 "
wsDocs = "6:\xeb69 "
wsVM = "7:\xea7a "
-- Layout
myLayoutHook = onWorkspace "2:\xe743 " myWebLayout $ onWorkspace "3:\xf1b6 " myGamesLayout $ onWorkspace "5:\xead9 " myVideoLayout myDefaultLayout
myLayoutHook = onWorkspace wsWeb myWebLayout $ onWorkspace wsGames myGamesLayout $ onWorkspace wsMedia myVideoLayout myDefaultLayout
where
myWebLayout = avoidStruts $ renamed [CutWordsLeft 1] $ spacingWithEdge 3 $ myTabbed ||| tiled ||| Mirror tiled ||| threeCol ||| Grid ||| spiral 0.856
myGamesLayout = avoidStruts $ smartBorders Full
@@ -242,41 +248,41 @@ myStartupHook = do
myManageHook :: ManageHook
myManageHook =
composeAll
[ className =? "Gpodder" --> doShift "5:\xead9 ",
className =? "An Anime Game Launcher" --> doShift "3:\xf1b6 ",
[ className =? "Gpodder" --> doShift wsMedia,
className =? "An Anime Game Launcher" --> doShift wsGames,
className =? "Qalculate-gtk" --> doFloat,
title =? "Genshin Impact" --> doShift "3:\xf1b6 ",
className =? "Signal" --> doShift "4:\xf10b ",
className =? "Spotify" --> doShift "5:\xead9 ",
className =? "Transmission-gtk" --> doShift "2:\xe743 ",
title =? "Genshin Impact" --> doShift wsGames,
className =? "Signal" --> doShift wsChat,
className =? "Spotify" --> doShift wsMedia,
className =? "Transmission-gtk" --> doShift wsWeb,
className =? "Viewnior" --> doFloat,
className =? "Vivaldi-stable" --> doShift "2:\xe743 ",
className =? "Vivaldi-stable" --> doShift wsWeb,
className =? "Xmessage" --> doFloat,
className =? "Xreader" --> doShift "6:\xeb69 ",
className =? "calibre" --> doShift "6:\xeb69 ",
className =? "discord" --> doShift "4:\xf10b ",
className =? "explorer.exe" --> doShift "3:\xf1b6 ",
className =? "Xreader" --> doShift wsDocs,
className =? "calibre" --> doShift wsDocs,
className =? "discord" --> doShift wsChat,
className =? "explorer.exe" --> doShift wsGames,
className =? "feh" --> doFloat,
title =? "glxgears" --> doFloat,
className =? "library_manager" --> doShift "6:\xeb69 ",
className =? "libreoffice-calc" --> doShift "6:\xeb69 ",
className =? "libreoffice-writer" --> doShift "6:\xeb69 ",
className =? "library_manager" --> doShift wsDocs,
className =? "libreoffice-calc" --> doShift wsDocs,
className =? "libreoffice-writer" --> doShift wsDocs,
className =? "mpv" --> doFullFloat,
className =? "mpv" --> viewShift "5:\xead9 ",
className =? "freetube" --> doShift "5:\xead9 ",
className =? myTerminal --> doShift "1:\xf489 ",
className =? "scrcpy" --> doShift "5:\xead9 ",
className =? "steam" --> doShift "3:\xf1b6 ",
className =? "mpv" --> viewShift wsMedia,
className =? "freetube" --> doShift wsMedia,
className =? myTerminal --> doShift wsTerm,
className =? "scrcpy" --> doShift wsMedia,
className =? "steam" --> doShift wsGames,
className =? "steam_app_109600" --> doFloat,
className =? "steam_app_109600" --> doShift "3:\xf1b6 ",
className =? "steam_app_109600" --> doShift wsGames,
className =? "steam_app_289070" --> doFloat,
className =? "steam_app_289070" --> doShift "3:\xf1b6 ",
className =? "transmission-gtk" --> doShift "2:\xe743 ",
className =? "VirtualBox Machine" --> doShift "7:\xea7a ",
className =? "steam_app_289070" --> doShift wsGames,
className =? "VirtualBox Machine" --> doShift wsVM,
className =? "VirtualBox Machine" --> doFullFloat,
className =? "VirtualBox Manager" --> doShift "7:\xea7a ",
className =? "zen" --> doShift "2:\xe743 ",
className =? "VirtualBox Manager" --> doShift wsVM,
className =? "zen" --> doShift wsWeb,
isDialog --> doFloat,
-- Windows that open already fullscreen; ewmhFullscreen only handles later requests
isFullscreen --> doFullFloat
]
<+> namedScratchpadManageHook myScratchpads