Kill xmobars by name when restarting status bars

killAllStatusBars only kills the PIDs xmonad has stored, and bars that dropped off that list
kept running after M-q and movie, leaving a laptop-config bar on HDMI. pkill -x xmobar
catches them all.
This commit is contained in:
Daniele Fucini
2026-10-13 20:34:53 +02:00
parent 3e77c8be34
commit 07135c3452
+5 -3
View File
@@ -26,6 +26,7 @@ import XMonad.Util.EZConfig
import qualified XMonad.Util.Hacks as Hacks
import XMonad.Util.Loggers
import XMonad.Util.NamedScratchpad
import XMonad.Util.Run (runProcessWithInput)
import XMonad.Util.SpawnOnce
-- Main
@@ -191,12 +192,13 @@ myStatusBar nScreens i = "xmobar -x " ++ show i ++ " ~/.config/xmobar/" ++ rc
rc = if nScreens > 1 && i /= 1 then "xmobarrc_hdmi" else "xmobarrc_laptop"
-- One bar per screen, all restarted on every screen change: the right config for a
-- screen id depends on the screen count, and dynamicSBs would keep the old bar
-- screen id depends on the screen count, and dynamicSBs would keep the old bar.
-- Kills by name (pkill waits) because killAllStatusBars' PID list can lose bars.
restartStatusBars :: X ()
restartStatusBars = do
killAllStatusBars
_ <- runProcessWithInput "pkill" ["-x", "xmobar"] ""
screens <- gets (W.screens . windowset)
forM_ screens $ \s -> let S i = W.screen s in spawnStatusBar (myStatusBar (length screens) i)
forM_ screens $ \s -> let S i = W.screen s in spawn (myStatusBar (length screens) i)
myXmobarPP :: PP
myXmobarPP =