module PopupMenuF(popupMenuF,oldPopupMenuF,oldPopupMenuF') where
--import ButtonGroupF
import Command
import CompOps((>=^<), (>^=<),(>+<))--(>==<),
import InfixOps((>=..<))--(>^^=<),
import Dlayout(groupF)
import Event
--import Font(FontStruct)
import Fudget
import FRequest
--import Geometry(Line, Point, Rect, Size(..))
import GreyBgF(changeBg)
--import LayoutRequest(LayoutRequest)
import MenuF(menuAltsF,toEqSnd,fstEqSnd,sndEqSnd)--EqSnd,
import MenuPopupF(PopupMenu(..))
import DynListF(dynF)
--import Message(Message(..))
import Path(here)
import SerCompF(serCompLeftToRightF)--idRightF,
import Spops
import EitherUtils(mapEither)
import Xtypes
import CompSP(serCompSP)
import Defaults(bgColor,menuFont)
import Utils(pair)
import NullF(delayF)
--import ShowCommandF(showCommandF) -- debugging
--import SpyF(teeF) -- debugging
--popupMenuF :: [(alt,String)] -> F i o -> F (Either x i) (Either alt o)
alts f =
mapEither fstEqSnd id>^=<
oldPopupMenuF bgColor True menuFont (Button 3) [] []
(pre alts) sndEqSnd f
>=^< mapEither pre id
where
pre = map (`pair` []) . toEqSnd
bgcolor grab fname button mods keys alts show_alt f =
serCompLeftToRightF $
oldPopupMenuF' bgcolor grab fname button mods keys alts show_alt f
bgcolor grab fname button mods keys alts show_alt f =
let grabeventmask = [ButtonPressMask, ButtonReleaseMask]
grabcmd = if grab then [GrabButton True button mods grabeventmask]
else []
eventmask =
(if null keys then [] else [KeyPressMask, KeyReleaseMask]) ++
(if grab then [] else (OwnerGrabButtonMask:grabeventmask)) ++
[LeaveWindowMask]
startcmds = grabcmd ++ [ChangeWindowAttributes [CWEventMask eventmask]]
ungrab = concatMapSP un where
un (High m) = [High m,Low (here,XCmd UngrabEvents)]
un m = [m]
F dynAltsFSP = dynAltsF
dynAltsF =
dynF (altsF alts) >=^< mapEither altsF id
where
altsF alts' = delayF' (menuAltsF fname (map fst alts') show_alt)
-- !! keyboard shortcuts ignored !!
delayF' f = delayF f >=..< filterSP notDestroy
--delayF' = id
--delayF' f = delayF (showCommandF "altsF" f >==< teeF show "altsF: ")
notDestroy (_,XEvt (DestroyNotify _)) = False
notDestroy _ = True
in (groupF (map XCmd startcmds)
(changeBg bgcolor (actionK grab button keys mods))
(F{-ff-} (ungrab `serCompSP` dynAltsFSP) >+< f))
actionK grab button keys mods = K{-kk-} $ concmapSP action where
toF = High . Right
toMenu = High . Left . Right
newMenu = High . Left . Left
action msg = case msg of
High (Right hmsg) -> [toF hmsg]
High (Left alts) -> [newMenu alts] -- breaks backwards compatibility...
Low (XEvt ev) -> case ev of
ButtonEvent {rootPos=rootPos,state=m,type'=Pressed,button=b} | m == mods && b == button ->
[Low $ XCmd (GrabEvents True),toMenu (PopupMenu rootPos ev)]
KeyEvent {rootPos=rootPos,state=m,type'=Pressed,keySym=ks} | (m, ks) `elem` keys ->
[toMenu (PopupMenu rootPos ev)]
LeaveNotify {mode=NotifyUngrab} ->
[Low $ XCmd UngrabEvents,toMenu PopdownMenu]
ButtonEvent {type'=Released} ->
[Low $ XCmd UngrabEvents,toMenu PopdownMenu]
KeyEvent {type'=Released} -> [toMenu PopdownMenu]
_ -> []
Low _ -> []