From 0d468192be425e59acec80321ce2e12728385a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Sun, 16 Nov 2025 22:34:45 +0800 Subject: [PATCH] vanadium/xmonad: smarter window focusing We spawn discord on certain window, and ignore its activation request --- .../vanadium/home/xmonad/xmonad.hs | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/nix/configurations/vanadium/home/xmonad/xmonad.hs b/nix/configurations/vanadium/home/xmonad/xmonad.hs index 27a744ad..3c3ad491 100644 --- a/nix/configurations/vanadium/home/xmonad/xmonad.hs +++ b/nix/configurations/vanadium/home/xmonad/xmonad.hs @@ -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)