{-# LANGUAGE LambdaCase #-} module XMonad.Stockholm.Shutdown ( sendShutdownEvent , handleShutdownEvent , shutdown ) where import Control.Monad import Data.Monoid import System.Exit (exitSuccess) import XMonad sendShutdownEvent :: IO () sendShutdownEvent = do dpy <- openDisplay "" rw <- rootWindow dpy $ defaultScreen dpy a <- internAtom dpy "XMONAD_SHUTDOWN" False allocaXEvent $ \e -> do setEventType e clientMessage setClientMessageEvent e rw a 32 0 currentTime sendEvent dpy rw False structureNotifyMask e sync dpy False handleShutdownEvent :: Event -> X All handleShutdownEvent = \case ClientMessageEvent { ev_message_type = mt } -> do c <- (mt ==) <$> getAtom "XMONAD_SHUTDOWN" when c shutdown return (All c) _ -> return (All True) shutdown :: X () shutdown = do broadcastMessage ReleaseResources writeStateToFile _ <- io $ do exitSuccess return ()