--- /dev/null
+<USE "VS100">
+<INCLUDE "VSUTYPES" "VSUDEFS">
+
+<SETG MENU-STUFF '["FOO" "BAR" "BLETCH" "MUMBLE"]>
+
+<DEFINE BAR (CH "AUX" EVENT)
+ <REPEAT (OX OY OLD)
+ <BUFOUT .CH>
+ <COND (<TYPE? <SET EVENT <CHANNEL-OP .CH READ-BYTE-IMMEDIATE>> CHARACTER>
+ <CHANNEL-OP .CH WRITE-BUFFER .EVENT>)
+ (<TYPE? .EVENT FIX>)
+ (<TYPE? .EVENT WINDOW-EVENT>
+ <RECYCLE-EVENTS .EVENT>)
+ (<==? <ME-KIND .EVENT> ,ME-LEFT-PRESSED>
+ <SET OLD <CHANNEL-OP .CH MOUSE-MOVE? ,MOUSE-LEFT>>
+ <SET OX <ME-X .EVENT>>
+ <SET OY <ME-Y .EVENT>>
+ <RECYCLE-EVENTS .EVENT>
+ <REPEAT ()
+ <COND (<TYPE? <SET EVENT <CHANNEL-OP .CH READ-BYTE-IMMEDIATE>>
+ MOUSE-EVENT>
+ <COND (<OR <==? <ME-KIND .EVENT> ,ME-MOVED>
+ <==? <ME-KIND .EVENT> ,ME-LEAVE-WINDOW>>
+ <CHANNEL-OP .CH DRAW-LINE ,GX-XOR .OX .OY
+ <SET OX <ME-X .EVENT>>
+ <SET OY <ME-Y .EVENT>>>
+ <RECYCLE-EVENTS .EVENT>)
+ (<==? <ME-KIND .EVENT> ,ME-LEFT-RELEASED>
+ <RECYCLE-EVENTS .EVENT>
+ <CHANNEL-OP .CH MOUSE-MOVE? .OLD>
+ <RETURN>)
+ (<==? <ME-KIND .EVENT> ,ME-ENTER-WINDOW>
+ <SET OX <ME-X .EVENT>>
+ <SET OY <ME-Y .EVENT>>
+ <RECYCLE-EVENTS .EVENT>)
+ (T
+ <RECYCLE-EVENTS .EVENT>)>)
+ (<TYPE? .EVENT WINDOW-EVENT>
+ <RECYCLE-EVENTS .EVENT>)>>)
+ (T
+ <RECYCLE-EVENTS .EVENT>)>>>
+
+<DEFINE FOO (CH "AUX" EVENT MW)
+ <REPEAT ()
+ <BUFOUT .CH>
+ <COND (<TYPE? <SET EVENT <CHANNEL-OP .CH READ-BYTE-IMMEDIATE>> CHARACTER>
+ <CHANNEL-OP .CH WRITE-BUFFER .EVENT>)
+ (<TYPE? .EVENT FIX>)
+ (<TYPE? .EVENT WINDOW-EVENT>
+ <RECYCLE-EVENTS .EVENT>)
+ (<==? <ME-KIND .EVENT> ,ME-LEFT-PRESSED>
+ <RECYCLE-EVENTS .EVENT>
+ <PROG (CC H (CY 0))
+ <SET CC <CHANNEL-OP .CH MAKE-TEMP-WINDOW
+ <* 4 <SET H <CHANNEL-OP .CH LINE-HEIGHT>>>
+ 60>>
+ <MAPF <>
+ <FUNCTION (STR)
+ <CHANNEL-OP .CC MAKE-MENU-WINDOW .H 60 0 .CY .STR>
+ <SET CY <+ .CY .H>>>
+ ,MENU-STUFF>
+ <CHANNEL-OP .CC SELECT-MENU-WINDOW>
+ <REPEAT (KIND (CWIND NULL))
+ <COND (<TYPE? <SET EVENT <CHANNEL-OP .CC READ-BYTE-IMMEDIATE>>
+ MOUSE-EVENT>
+ <COND (<==? <SET KIND <ME-KIND .EVENT>>
+ ,ME-ENTER-WINDOW>
+ <COND (<TYPE? <ME-SUBWINDOW .EVENT>
+ MENU-WINDOW>
+ <CHANNEL-OP .CC INVERT-MENU-WINDOW
+ <ME-SUBWINDOW .EVENT>>
+ <SET CWIND
+ <MW-OBJ <ME-SUBWINDOW .EVENT>>>)>)
+ (<==? .KIND ,ME-LEAVE-WINDOW>
+ <COND (<TYPE? <ME-SUBWINDOW .EVENT>
+ MENU-WINDOW>
+ <CHANNEL-OP .CC INVERT-MENU-WINDOW
+ <ME-SUBWINDOW .EVENT>>
+ <SET CWIND <>>)>)
+ (<==? .KIND ,ME-LEFT-RELEASED>
+ <CLOSE .CC>
+ <PRINT .CWIND>
+ <RECYCLE-EVENTS .EVENT>
+ <RETURN>)>)>
+ <RECYCLE-EVENTS .EVENT>>>)
+ (T
+ <RECYCLE-EVENTS .EVENT>)>>>