Compare commits

...

4 commits

Author SHA1 Message Date
5f1cea7f25
vanadium/xmonad: shift windows based on dynamic title property 2025-11-17 08:31:01 +08:00
0d468192be
vanadium/xmonad: smarter window focusing
We spawn discord on certain window, and ignore its activation request
2025-11-17 00:02:02 +08:00
89e9803ed7
home/firefox: always open link in new window 2025-11-16 22:33:01 +08:00
34619bec86
vanadium/disko: try compressing /home 2025-11-15 22:53:30 +08:00
3 changed files with 95 additions and 22 deletions

View file

@ -8,6 +8,7 @@ import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.InsertPosition import XMonad.Hooks.InsertPosition
import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.OnPropertyChange
import XMonad.Hooks.RefocusLast import XMonad.Hooks.RefocusLast
import XMonad.Hooks.StatusBar import XMonad.Hooks.StatusBar
import XMonad.Layout.NoBorders import XMonad.Layout.NoBorders
@ -24,12 +25,12 @@ import XMonad.Util.NamedScratchpad
import XMonad.Util.SpawnOnce import XMonad.Util.SpawnOnce
import XMonad.Layout.Magnifier import XMonad.Layout.Magnifier
import Data.Char.Greek
import Data.Semigroup
import qualified Data.Map.Strict as M import qualified Data.Map.Strict as M
import System.Posix import System.Posix
import Graphics.X11.ExtraTypes.XF86 import Graphics.X11.ExtraTypes.XF86
import Data.Char.Greek
main :: IO () main :: IO ()
main = main =
xmonad xmonad
@ -37,6 +38,7 @@ main =
-- https://wiki.archlinux.org/title/java#Gray_window,_applications_not_resizing_with_WM,_menus_immediately_closing -- https://wiki.archlinux.org/title/java#Gray_window,_applications_not_resizing_with_WM,_menus_immediately_closing
. javaHack . javaHack
. withSB xmobarConfig . docks . withSB xmobarConfig . docks
. setEwmhActivateHook myActivateHook
. ewmhFullscreen . ewmh . ewmhFullscreen . ewmh
$ def $ def
{ modMask = superMask { modMask = superMask
@ -50,6 +52,7 @@ main =
, startupHook = myStartupHook , startupHook = myStartupHook
, layoutHook = myLayout , layoutHook = myLayout
, manageHook = myManageHook , manageHook = myManageHook
, handleEventHook = myEventHandleHook
} }
-- Only remove mappings that needs pass through -- Only remove mappings that needs pass through
@ -66,31 +69,88 @@ myLayout =
in avoidStruts . smartBorders $ in avoidStruts . smartBorders $
mag tallr ||| Full mag tallr ||| Full
isOneOf :: Eq a => Query a -> [a] -> Query Bool isSioyek :: Query Bool
isOneOf q = fmap or . traverse (q =?) 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"
isSpotify :: Query Bool
isSpotify = isFirefox <&&> title ~? "Spotify"
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 :: ManageHook
myManageHook = myManageHook =
composeAll composeAll
[ className ~? "NautilusPreviewer" --> customFloating centeredFloat [ isNautilusPreviewer --> customFloating centeredFloat
, className =? "feh" --> customFloating buttomRightFloat , isFeh --> customFloating buttomRightFloat
, className =? "Minder" , isMinder --> customFloating centeredFloat
<&&> not <$> title ~? "Pick a Color" -- ignore the color picker , isFirefoxPip --> doFloat
--> customFloating centeredFloat , isDiscord --> (doF $ W.shift chatWS)
, className =? "firefox" , isEvolution --> (doF $ W.shift chatWS)
<&&> title =? "Picture-in-Picture"
--> doFloat
, namedScratchpadManageHook myScratchpads
] ]
<> composeOne <> composeOne
[ className =? "firefox" -?> insertPosition Master Newer [ isFirefox -?> insertPosition Master Newer
, className =? "kitty" -?> insertPosition Below Newer , isKitty -?> insertPosition Below Newer
, className `isOneOf` , isNautilus <||> isSioyek -?> insertPosition End Older
[ "sioyek"
, "Nautilus"
]
-?> insertPosition End Older
] ]
<> namedScratchpadManageHook myScratchpads
myEventHandleHook :: Event -> X All
myEventHandleHook =
-- TODO: is there a way to always open certain sites in new windows in firefox?
onTitleChange $ composeAll
[ isSpotify --> doShiftAndViewIfMoved multimediaWS
, isDiscord --> doShiftAndViewIfMoved chatWS
]
-- If the title changes in the background, we don't want to greedy view that workspace.
-- Imagine Spotify playing in the background, a track change would focus that workspace.
-- We prevent this by checking if the window is already there.
doShiftAndViewIfMoved :: WorkspaceId -> Query (Endo WindowSet)
doShiftAndViewIfMoved n = doF . shiftAndViewIfMoved n =<< ask
shiftAndViewIfMoved :: WorkspaceId -> Window -> WindowSet -> WindowSet
shiftAndViewIfMoved n w s = case W.findTag w s of
Just from | n `W.tagMember` s && n /= from -> W.greedyView n $ W.shiftWin n w s
_ -> s
myStartupHook :: X () myStartupHook :: X ()
myStartupHook = do myStartupHook = do
@ -223,9 +283,15 @@ superMask, altMask :: KeyMask
superMask = mod4Mask superMask = mod4Mask
altMask = mod1Mask altMask = mod1Mask
myWorkspaces :: [String] myWorkspaces :: [WorkspaceId]
myWorkspaces = map (:[]) $ take 8 greekLower myWorkspaces = map (:[]) $ take 8 greekLower
multimediaWS :: WorkspaceId
multimediaWS = myWorkspaces !! 6
chatWS :: WorkspaceId
chatWS = myWorkspaces !! 3
centeredFloat, smallFloat, fullFloat, buttomRightFloat :: W.RationalRect centeredFloat, smallFloat, fullFloat, buttomRightFloat :: W.RationalRect
centeredFloat = W.RationalRect (1/9) (1/9) (7/9) (7/9) centeredFloat = W.RationalRect (1/9) (1/9) (7/9) (7/9)
smallFloat = W.RationalRect (3/5) (3/5) (2/7) (2/7) smallFloat = W.RationalRect (3/5) (3/5) (2/7) (2/7)

View file

@ -75,7 +75,10 @@
}; };
"/home" = { "/home" = {
mountOptions = [ "noatime" ]; mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/home"; mountpoint = "/home";
}; };

View file

@ -56,6 +56,10 @@ in
"browser.ctrlTab.sortByRecentlyUsed" = false; "browser.ctrlTab.sortByRecentlyUsed" = false;
"layout.css.devPixelsPerPx" = 1.1; "layout.css.devPixelsPerPx" = 1.1;
# open links in new window
# this works a lot better with xmonad where I have a bunch of windows
"browser.link.open_newwindow" = 2;
# Sponsored crap # Sponsored crap
# Yes # Yes
"browser.newtabpage.activity-stream.showSearch" = true; "browser.newtabpage.activity-stream.showSearch" = true;