MAG Disk (Jun 1990) : source / InputHandler.c

#include "PopUpMenu.h"

#define QUALIFIERS (IEQUALIFIER_LSHIFT   | IEQUALIFIER_RSHIFT    | \
		    IEQUALIFIER_CONTROL  | IEQUALIFIER_LALT	 | \
		    IEQUALIFIER_RALT	 | IEQUALIFIER_LCOMMAND  | \
		    IEQUALIFIER_RCOMMAND | IEQUALIFIER_MIDBUTTON | \
		    IEQUALIFIER_LEFTBUTTON)
IMPORT struct IntuitionBase *IntuitionBase;

/*++++++++++++++++++++++++++++++++++++++++++++++++
+  MyHandler(Events, MySignals)
+    Look for MenuDown & MenuUp events and signal our task
+
+  INPUTS
+    Events    - List of events (from input.device)
+    MySignals - PopUpMenuTask & MenuUp, MenuDown Signals
+
+  OUTPUT
+    Eventlist without MenuDown messgaes
+++++++++++++++++++++++++++++++++++++++++++++++++++*/
struct InputEvent *PopUpHandler(Events, MySignals)
  struct InputEvent *Events;
  struct SignalData *MySignals;
{

  struct InputEvent *Event;
  struct InputEvent *LastEvent;

  if (MySignals->Down)
    /* tell the task we are living */
    Signal(MySignals->PopUpMenuTask, MySignals->MouseMovedSig);

  for (Event = Events, LastEvent = NULL; Event != NULL; Event = Event->ie_NextEvent) {
    if (Event->ie_Class == IECLASS_RAWMOUSE) {
      if (NOT(MySignals->Down)) {
	union {
	  struct Window *ActiveWindow;
	  struct Screen *ActiveScreen;
	} Temp;
	/* Do not signal my task if
	   1) Any qualifierkey is pressed.
	   2) Mouse in menubar
	   3) No window is active.
	   4) A requester is blocking the window.
	   5) Window has no menues
	   6) Window has RMBTRAP set */

	if ((Event->ie_Code == MENUDOWN) AND
	    !(Event->ie_Qualifier & QUALIFIERS) AND
	    (Temp.ActiveScreen = IntuitionBase->ActiveScreen) AND
	    (Temp.ActiveScreen->MouseY >= Temp.ActiveScreen->BarHeight) AND
	    (Temp.ActiveWindow = IntuitionBase->ActiveWindow) AND
	    (Temp.ActiveWindow->ReqCount == 0) AND
	    (Temp.ActiveWindow->MenuStrip) AND
	    !(Temp.ActiveWindow->Flags & RMBTRAP)) {
	  Signal (MySignals->PopUpMenuTask, MySignals->MenuDownSig);
	  MySignals->Down = TRUE;
	}
	else
	  goto GetOutOfHere;  /* oops! */
      } /* if NOT Down */
      else  /* Down */
	switch (Event->ie_Code) {
	  case SELECTDOWN:
	    Signal(MySignals->PopUpMenuTask, MySignals->SelectDownSig);
	  case SELECTUP:
	    break;
	  case MENUUP:
	    Signal (MySignals->PopUpMenuTask, MySignals->MenuUpSig);
	    MySignals->Down = FALSE;
	    break;
	  default:
	    goto GetOutOfHere;	/* oops! */
	} /* case */
      /* Take event from chain */
      if (LastEvent == NULL)
	Events = Event->ie_NextEvent;
      else
	LastEvent->ie_NextEvent = Event->ie_NextEvent;
      continue;
    } /* if RAWMOUSE */

GetOutOfHere:
    LastEvent = Event;
  }
  return(Events);
}