fudgets-0.18.3: hsrc/kernelutils/QuitK.hs
module QuitK where
import Command
import Event
import Fudget
--import FudgetIO
import FRequest
import Xcommand
import HaskellIO(haskellIO)
import InternAtom
--import Message(Message(..))
import NullF
import Spops(nullSP)
import CompFfun(postProcessHighK,preProcessHighK)
--import Sockets
import Xtypes
import DialogueIO hiding (IOError)
quitK action =
nullSP `postProcessHighK`
wmK (Just action)
`preProcessHighK` nullSP
-- (*) wmK always enables the WM_DELETE_WINDOW protocol, since some window
-- managers provide a close button that destroy the window if the protocol
-- is disabled. Sigh.
wmK optAction =
wmDeleteWindowK $ \dw -> -- (*)
case optAction of
Just action ->
-- wmDeleteWindowK $ \dw -> -- (*)
internAtomK "WM_PROTOCOLS" False $ \ pr ->
wmK' (lowHandler action pr dw)
Nothing -> wmK' (const id)
where
lowHandler action pr dw event =
case event of
XEvt (ClientMessage a (Long (p : _))) | a == pr && Atom (fromIntegral p) == dw ->
action
_ -> id
wmK' lowHandler = loop
where
loop =
getK $ \msg ->
case msg of
Low event -> lowHandler event loop
High (Left title) -> xcommandK (StoreName title) loop
High (Right True) -> xcommandK MapRaised loop
High (Right False) -> unmapWindowK loop
_ -> loop
-- Some handlers:
exitK cont = haskellIO (Exit 0) (const nullK)
unmapWindowK = xcommandK UnmapWindow
reportK = putK (High ())
wmDeleteWindowK cont =
internAtomK "WM_DELETE_WINDOW" False $ \dw ->
xcommandK (SetWMProtocols [dw]) $
cont dw