home *** CD-ROM | disk | FTP | other *** search
- opt l+,c+,d+,y+
- opt ow1+,ow2+,ow3+,ow4+,ow5+,ow6+
- INCDIR ":Pspråk/asm/include/"
- INCLUDE "exec/types.i"
- INCLUDE "PopUpMenu.i"
-
- QUALIFIERS EQU IEQUALIFIER_LSHIFT+IEQUALIFIER_RSHIFT+IEQUALIFIER_CONTROL+IEQUALIFIER_LALT+IEQUALIFIER_RALT+IEQUALIFIER_LCOMMAND+IEQUALIFIER_RCOMMAND
- HOTKEYQUAL EQU IEQUALIFIER_CONTROL+IEQUALIFIER_LALT
-
- xref _IBase * Intuitionbase in BSS segent
-
- xdef @PopUpHandler
-
- section text,code
-
- @PopUpHandler: MOVEM.L D2/A2-A6,-(SP)
- MOVEA.L A0,A3 * A3 = Events
- MOVEA.L A1,A2 * A2 = MySignals
- MOVEA.L A3,A4 * A4 = Event
- SUB.L A5,A5 * A5 = LastEvent
- MOVEA.L (AbsExecBase).W,A6
-
- * ------------ Be sure that data does not change while we are processing inputs
- LEA sd_Semaphore(A2),A0
- JSR _LVOObtainSemaphore(A6)
-
- MOVE.W sd_Down(A2),D2
- BEQ.B NoMoveSignal
-
- * ------------ Tell the task we are living.
- MOVEA.L (A2),A1 * sd_PopUpMenuTask
- MOVE.L sd_MouseMovedSig(A2),D0
- JSR _LVOSignal(A6)
-
- * ------------ No more events ?
- NoMoveSignal:
- MoreEvents: MOVE.L A4,D0
- BEQ.W Done
-
- * ------------ Mouseevent ?
- MOVEQ.L #IECLASS_RAWMOUSE,D0
- CMP.B ie_Class(A4),D0
- BNE.W CheckHotKey
-
- MOVE.W ie_Code(A4),D1
-
- * ------------ Is menubutton already pressed.
- TST.W D2
- BNE.W MouseIsDown * Yes
-
- * ------------ Menubutton pressed ?
- CMPI.W #MENUDOWN,D1
- BNE.W KeepEvent * No
-
- * ------------ Is any other mousebutton pressed
- MOVE.W ie_Qualifier(A4),D1
- MOVE.W #IEQUALIFIER_MIDBUTTON+IEQUALIFIER_LEFTBUTTON,D0
- AND.W D1,D0
- BNE.W KeepEvent * Yes
-
- * ------------ Qualifier pressed ?
- MOVE.W #QUALIFIERS,D0
- AND.W D1,D0
- BEQ.B 1$ * No
-
- * ------------ pop-up the menues with qualifier ?
- BTST #POPUPWITHQUAL,sd_Options(A2)
- BEQ.W KeepEvent * No
- BRA.B MenuButtonOk
-
- * ------------ Pop-up the menues without qualifier
- 1$ BTST #POPUPNOQUAL,sd_Options(A2)
- BEQ.W KeepEvent * No
-
- * ------------ Is any screen active ?
- MenuButtonOk: MOVEA.L _IBase,A1
- MOVEA.L ib_ActiveScreen(A1),A0
- MOVE.L A0,D0
- BEQ.W KeepEvent * No
-
- * ------------ Is the mouse in the titlebar ?
- MOVE.B sc_BarHeight(A0),D0
- EXT.W D0
- CMP.W sc_MouseY(A0),D0
- BGT.W KeepEvent * Yes
-
- * ------------ Is any window active ?
- MOVEA.L ib_ActiveWindow(A1),A0
- MOVE.L A0,D0
- BEQ.W KeepEvent * No
-
- * ------------ Is any requester blocking the window ?
- TST.W wd_ReqCount(A0)
- BNE.W KeepEvent * Yes
-
- * ------------ Does the window have menues ?
- TST.L wd_MenuStrip(A0)
- BEQ.W KeepEvent * No
-
- * ------------ Is the RMBTRAP flag set ?
- MOVEQ.L #1,D0
- AND.W wd_Flags(A0),D0
- BNE.W KeepEvent * Yes
-
- * ------------ Is a string gadget active ? [New 4.2]
- MOVE.L wd_FirstGadget(A0),A0
-
- 02$ MOVE.L A0,D0
- BEQ.B 08$
-
- CMPI.W #STRGADGET,gg_GadgetType(A0)
- BNE.B 05$
-
- BTST #7,gg_Flags+1(A0)
- BNE.W KeepEvent * A string gadget is active
-
- 05$ MOVE.L (A0),A0 * gg_NextGadget
- BRA.B 02$
-
- * ------------ Everything OK
- 08$ MOVEQ.L #1,D2
-
- * ------------ ClickMenues ?
- BTST #CLICKMENUES,sd_Options(A2)
- BEQ.B 1$ * No
-
- * ------------ Menubutton must be released twice
- MOVEQ.L #3,D2
-
- * ------------ Tell task to popup the menues.
- 1$ MOVE.L sd_MenuDownSig(A2),D0
- BRA.B SigAndRemove
-
- * ------------ Check out if the user has selected something.
- * ------------ Is menubutton released ?
- MouseIsDown: CMPI.W #MENUUP,D1
- BNE.B 1$ * No
-
- * ------------ (--Down) == 0 ?
- 05$ SUBQ.W #1,D2
- BNE.B RemoveEvent * No
-
- * ------------ Tell our task.
- MOVE.L sd_MenuUpSig(A2),D0
- BRA.B SigAndRemoveQ
-
- * ------------ Is menubutton pressed again (Can only happen if CLICKMENUES)
- 1$ CMPI.W #MENUDOWN,D1
- BEQ.B 05$
-
- * ------------ Multiple select ?
- CMPI.W #SELECTDOWN,D1
- BNE.B CheckSelUp * No
-
- MOVE.L sd_SelectDownSig(A2),D0
-
- SigAndRemoveQ: MOVE.W ie_Qualifier(A4),sd_EndQualifier(A2) * Save qualifier
- SigAndRemove: MOVEA.L (A2),A1 * sd_PopUpMenuTask(A2)
- JSR _LVOSignal(A6)
- BRA.B RemoveEvent
-
- * ------------ SELECTUP isn't used but remove the event anyway
- * ------------ Intuition may be confused since no SELECTDOWN is sent.
- CheckSelUp: CMPI.W #SELECTUP,D1
- BNE.B KeepEvent * No
-
- * ------------ Remove the event from the list.
- RemoveEvent: MOVE.L A5,D0 * First event in list ?
- BNE.B 1$ * No
- MOVEA.L (A4),A3 * ie_NextEvent(A4)
- BRA.B NextEvent
- 1$: MOVE.L (A4),(A5) * ie_NextEvent(A4),ie_NextEvent(A5)
- BRA.B NextEvent
-
- * ------------ Hot-key while menu down ? [ not allowed ]
- CheckHotKey: TST.W D2
- BNE.B KeepEvent * Yes
-
- * ------------ Key event ?
- MOVEQ.L #IECLASS_RAWKEY,D0
- CMP.B ie_Class(A4),D0
- BNE.B KeepEvent * No
-
- * ------------ Qualifiers pressed ?
- MOVE.W #QUALIFIERS,D0
- AND.W ie_Qualifier(A4),D0
- CMP.W #HOTKEYQUAL,D0
- BNE.B KeepEvent * No
-
- * ------------ Hot-key ?
- MOVE.W ie_Code(A4),D0
- CMP.B sd_HotKey(A2),D0
- BNE.B KeepEvent
-
- * ------------ Tell task Hot-Key pressed
- MOVE.L sd_HotKeySig(A2),D0
- BRA.B SigAndRemove
-
- * ------------ Keep this message.
- KeepEvent: MOVE.L A4,A5
-
- * ------------ Check out the next event.
- NextEvent: MOVE.L (A4),A4 * ie_NextEvent(A4)
- BRA.W MoreEvents
-
- Done: MOVE.W D2,sd_Down(A2)
-
- * ------------ Release semaphore
- LEA sd_Semaphore(A2),A0
- JSR _LVOReleaseSemaphore(A6)
-
- * ------------ return Events
- MOVE.L A3,D0
-
- MOVEM.L (SP)+,D2/A2-A6
- RTS
-
- END
-
-