diff options
author | tv <tv@krebsco.de> | 2015-10-29 01:49:27 +0100 |
---|---|---|
committer | tv <tv@krebsco.de> | 2015-10-29 01:49:27 +0100 |
commit | 81329c86ac95ec5c151cbdac98144eb87a5c01d7 (patch) | |
tree | 3ccb6edff8ad1fccf04e78285c9afb4232401265 /tv/5pkgs/xmonad-tv/Util/Shutdown.hs | |
parent | 6db59aa0d6056fd2eb1c8fa6491b34b458a7d62a (diff) |
tv: {2configs/xserver => 5pkgs}/xmonad-tv
Diffstat (limited to 'tv/5pkgs/xmonad-tv/Util/Shutdown.hs')
-rw-r--r-- | tv/5pkgs/xmonad-tv/Util/Shutdown.hs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tv/5pkgs/xmonad-tv/Util/Shutdown.hs b/tv/5pkgs/xmonad-tv/Util/Shutdown.hs new file mode 100644 index 0000000..89e22b4 --- /dev/null +++ b/tv/5pkgs/xmonad-tv/Util/Shutdown.hs @@ -0,0 +1,53 @@ +{-# LANGUAGE LambdaCase #-} +module Util.Shutdown + ( sendShutdownEvent + , handleShutdownEvent + , shutdown + ) + where + +import Control.Monad +import Data.Monoid +import Data.Maybe (catMaybes) +import qualified Data.Map as Map +import System.Environment (getEnv) +import System.Exit (exitSuccess) +import XMonad +import qualified XMonad.StackSet as W + +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 + io . flush =<< asks display + let wsData = show . W.mapLayout show . windowset + maybeShow (t, Right (PersistentExtension ext)) = Just (t, show ext) + maybeShow (t, Left str) = Just (t, str) + maybeShow _ = Nothing + extState = + return . show . catMaybes . map maybeShow . Map.toList . extensibleState + s <- gets (\s -> (wsData s : extState s)) + _ <- io $ do + path <- getEnv "XMONAD_STATE" + writeFile path (unlines s) + exitSuccess + return () |