module PopupF(popupShellF,popupShellF') where
import Command
import DShellF
import FDefaults
import Fudget
import FRequest
import Xcommand
import Geometry(Point(..), pP)
--import LayoutRequest(LayoutRequest)
import Loops(loopCompThroughRightF)
--import Message(Message(..))
--import Spops
import MapstateK
import Xtypes
--import NullF(putsK)
import CompSP
import Path(here)
= popupShellF' standard
popupShellF' :: Customiser ShellF -> String -> Maybe Point -> F a b -> F a (a,b)
pm title optpos (F f) =
let pos = case optpos of
Just pos -> pos
Nothing -> pP 300 300
params = pm . setVisible False . setDeleteQuit False
in loopCompThroughRightF (shellKF' params (popupK title pos)
(F{-ff-} $ prepostMapSP pre post (idRightSP f)))
pre (Low m) = Left (Low m)
pre (High (Left a)) = Left (High a)
pre (High (Right a)) = Right a
post (Right a) = Low (here,a)
post (Left (Low m)) = Low m
post (Left (High a)) = High a
title pos =
let kf s@(mapped,trig) msg =
case msg of
High (Right trig') -> ((True,trig'),
[High (Left (Left trig')),lowfromf (GrabEvents True)] ++
if not mapped then [Low $ XCmd MapRaised] else [])
High (Left x) -> ((False,trig),
(if mapped then unmapcmds else []) ++
[lowfromf UngrabEvents,High (Right (trig, x))])
Low _ -> (s, [])
lowfromf = High . Left . Right . XCmd
unmapcmds = [Low $ XCmd UnmapWindow,Low $ XCmd Flush]
startcmds =
[StoreName title, SetNormalHints pos, moveWindow pos,
ChangeWindowAttributes [CWSaveUnder True]]
in xcommandsK startcmds $
mapstateK kf (False,error "premature output from fudget inside popupShellF")