module PopupGroupF(popupGroupF,rootPopupF) where
import Command
import CompOps((>=^^<), (>^^=<))
--import Direction
import Dlayout(unmappedGroupF)
import Sizing(Sizing(..))
import Shells(unmappedShellF)
--import Event
import Fudget
import FRequest
import Geometry(psub,pP)
import LayoutRequest
import LoopLow
--import Message(Message(..))
import ParK
--import Path(Path(..))
import Popupmsg
--import Spops
import MapstateK
import SpEither(filterRightSP)
--import SerCompF(concatMapF)
import Spops
--import Xtypes
= popupF (unmappedGroupF Dynamic)
= popupF unmappedShellF
grF (offset, wattrs, k) f =
let post (tag, cmd) =
case cmd of
LCmd req ->
case req of
-- Layout size fh' fv -> [High (tag, LEvt $ LayoutPlace (Rect origin size))]
LayoutRequest (Layout {minsize=size}) ->
[High (tag, LEvt $ LayoutSize size)]
-- treated specially in windowKF.
_ -> []
cmd' -> [Low (tag, cmd')]
pre ev =
case ev of
High ev' -> [ev']
Low (_, LEvt (LayoutPlace _)) -> [] -- shouldn't happen?
Low tev -> [tev]
distr (Popup p x) = [Right x, Left (Left (Just p))]
distr Popdown = [Left (Left Nothing)]
startcmds = [XCmd $ ChangeWindowAttributes wattrs]
in (filterRightSP >^^=<
loopLow (concmapSP post)
(concmapSP pre)
(grF startcmds (compK (placeK offset) k) f)) >=^^<
concatMapSP distr
placeK offset = mapstateK sizeT (False,pP 0 0)
where
sizeT s@(mapped,size) msg =
case msg of
High (Just p) ->
((True,size),
[Low $ XCmd (moveWindow (psub p (offset size)))] ++
if not mapped then [Low $ XCmd MapRaised] else [])
High Nothing ->
((False,size),if mapped then [Low $ XCmd UnmapWindow] else [])
Low (LEvt (LayoutSize size')) ->
((mapped,size'), [])
_ -> (s, [])