module PosPopupShellF(posPopupShellF) where
import Command
import Shells(unmappedShellF)
--import Event(Event(..))
import Fudget
import FRequest
import Geometry(origin, pP, psub)
--import LayoutRequest(LayoutRequest)
import Loops(loopCompThroughRightF)
--import Message(Message(..))
import NullF
--import Path(Path(..))
import QueryPointer
--import SP
--import Xtypes
title wattrs f =
loopCompThroughRightF (unmappedShellF startcmds popupK f)
where
startcmds =
[XCmd $ StoreName title,
XCmd $ SetNormalHints origin,
XCmd $ ChangeWindowAttributes wattrs]
= kf (error "premature output from fudget inside posPopupShellF")
where
pickPos p cont =
case p of
Just pos -> cont pos
Nothing -> queryPointerK (\(_, r, _, _) -> cont (psub r (pP 5 5)))
kf s@(mapped,trig) =
getK $ \msg ->
case msg of
High (Right (trig', optpos)) ->
pickPos optpos $ \pos ->
putsK ([Low $ XCmd $ moveWindow pos,
High (Left trig')] ++
if not mapped then [Low $ XCmd MapRaised] else []) $
kf (True,trig')
High (Left y) ->
putsK ((if mapped then [Low $ XCmd UnmapWindow] else []) ++
[High (Right (trig, y))]) $
kf (False,trig)
_ -> kf s