vanadium/xmonad: smarter window focusing

We spawn discord on certain window, and ignore its activation request
This commit is contained in:
Primrose 2025-11-16 22:34:45 +08:00
parent 89e9803ed7
commit 0d468192be
Signed by: primrose
GPG key ID: 4E887A4CA9714ADA

View file

@ -24,12 +24,11 @@ import XMonad.Util.NamedScratchpad
import XMonad.Util.SpawnOnce
import XMonad.Layout.Magnifier
import Data.Char.Greek
import qualified Data.Map.Strict as M
import System.Posix
import Graphics.X11.ExtraTypes.XF86
import Data.Char.Greek
main :: IO ()
main =
xmonad
@ -37,6 +36,7 @@ main =
-- https://wiki.archlinux.org/title/java#Gray_window,_applications_not_resizing_with_WM,_menus_immediately_closing
. javaHack
. withSB xmobarConfig . docks
. setEwmhActivateHook myActivateHook
. ewmhFullscreen . ewmh
$ def
{ modMask = superMask
@ -66,31 +66,66 @@ myLayout =
in avoidStruts . smartBorders $
mag tallr ||| Full
isOneOf :: Eq a => Query a -> [a] -> Query Bool
isOneOf q = fmap or . traverse (q =?)
isSioyek :: Query Bool
isSioyek = className =? "sioyek"
isDiscord :: Query Bool
isDiscord =
let electronDiscord = className =? "discord"
firefoxDiscord = isFirefox <&&> title ~? "Discord"
in electronDiscord <||> firefoxDiscord
isEvolution :: Query Bool
isEvolution = className ~? "gnome.Evolution"
isFirefox :: Query Bool
isFirefox = className =? "firefox"
isFirefoxPip :: Query Bool
isFirefoxPip = isFirefox <&&> title =? "Picture-in-Picture"
isFeh :: Query Bool
isFeh = className =? "feh"
isNautilus :: Query Bool
isNautilus = className ~? "Nautilus"
isNautilusPreviewer :: Query Bool
isNautilusPreviewer = className ~? "NautilusPreviewer"
isMinder :: Query Bool
isMinder = className =? "Minder" <&&> (not <$> title ~? "Pick a Color")
isKitty :: Query Bool
isKitty = className =? "kitty"
myActivateHook :: ManageHook
myActivateHook =
-- Ignore activate request
composeOne
[ isDiscord -?> mempty
, isEvolution -?> mempty
, isSioyek -?> mempty
, isFeh -?> mempty
, return True -?> doFocus
]
myManageHook :: ManageHook
myManageHook =
composeAll
[ className ~? "NautilusPreviewer" --> customFloating centeredFloat
, className =? "feh" --> customFloating buttomRightFloat
, className =? "Minder"
<&&> not <$> title ~? "Pick a Color" -- ignore the color picker
--> customFloating centeredFloat
, className =? "firefox"
<&&> title =? "Picture-in-Picture"
--> doFloat
, namedScratchpadManageHook myScratchpads
[ isNautilusPreviewer --> customFloating centeredFloat
, isFeh --> customFloating buttomRightFloat
, isMinder --> customFloating centeredFloat
, isFirefoxPip --> doFloat
, isDiscord --> (doF $ W.shift chatWS)
, isEvolution --> (doF $ W.shift chatWS)
]
<> composeOne
[ className =? "firefox" -?> insertPosition Master Newer
, className =? "kitty" -?> insertPosition Below Newer
, className `isOneOf`
[ "sioyek"
, "Nautilus"
]
-?> insertPosition End Older
[ isFirefox -?> insertPosition Master Newer
, isKitty -?> insertPosition Below Newer
, isNautilus <||> isSioyek -?> insertPosition End Older
]
<> namedScratchpadManageHook myScratchpads
myStartupHook :: X ()
myStartupHook = do
@ -223,9 +258,12 @@ superMask, altMask :: KeyMask
superMask = mod4Mask
altMask = mod1Mask
myWorkspaces :: [String]
myWorkspaces :: [WorkspaceId]
myWorkspaces = map (:[]) $ take 8 greekLower
chatWS :: WorkspaceId
chatWS = myWorkspaces !! 3
centeredFloat, smallFloat, fullFloat, buttomRightFloat :: W.RationalRect
centeredFloat = W.RationalRect (1/9) (1/9) (7/9) (7/9)
smallFloat = W.RationalRect (3/5) (3/5) (2/7) (2/7)