'***************************************************************************
'*  Function: getEvent                                                     *
'*  Purpose:  Obtain keyboard and mouse events and return them.            *
'*  Params:   checkMouse% (IN): If TRUE (non-zero), causes this routine    *
'*            to check the mouse.  If FALSE (zero), this routine will      *
'*            NOT check the mouse for events.                              *
'*            keyCode% (OUT): On return, contains scan code or ASCII code  *
'*            of the key that was pressed on the keyboard.  If the key     *
'*            was a normal character, it returns the ASCII code.  If it    *
'*            was a special key (like a function or arrow key), it returns *
'*            a unique integer.  See QBSCR_3D.BI for these integers.       *
'*            mouseX% (OUT): Current X-coordinate of mouse if mouse event  *
'*            occurred.                                                    *
'*            mouseY% (OUT): Current Y-coordinate of mouse if mouse event  *
'*            occurred.                                                    *
'*  Returns:  A predefined code that identified the type of event that     *
'*            occurred.  They are named constants in the QBSCR_3D.BI file  *
'*            and are also duplicated here:                                *
'*                                                                         *
'*            RETURN CODE          EVENT                                   *
'*            ----------------     --------------------------------------  *
'*            EMmoved              Mouse Moved                             *
'*            EMpressedLeft        Mouse left button pressed               *
'*            EMpressedRight       Mouse right button pressed              *
'*            EMpressedCenter      Mouse center button pressed             *
'*            EMreleasedLeft       Mouse left button released              *
'*            EMreleasedRight      Mouse right button released             *
'*            EMreleasedCenter     Mouse center button released            *
'*            EKpressed            Key pressed on keyboard                 *
'*                                                                         *
'***************************************************************************
FUNCTION getEvent% (checkMouse%, keyCode%, mouseX%, mouseY%)

  ' **
  ' ** Clear all events from all buffers
  ' **
  WHILE (INKEY$ <> "")        ' Clear all keypresses from keyboard buffer.
  WEND
  IF (checkMouse%) THEN
    MouseButtonPressInfo LEFTBUTTON, numLeftPresses%, mx%, my%
    MouseButtonPressInfo RIGHTBUTTON, numRightPresses%, mx%, my%
    MouseButtonPressInfo CENTERBUTTON, numCenterPresses%, mx%, my%
    MouseButtonReleaseInfo LEFTBUTTON, numLeftReleases%, mx%, my%
    MouseButtonReleaseInfo RIGHTBUTTON, numRightReleases%, mx%, my%
    MouseButtonReleaseInfo CENTERBUTTON, numCenterReleases%, mx%, my%
    MousePosition oldMouseX%, oldMouseY%
    numLeftPresses% = 0
    numRightPresses% = 0
    numCenterPresses% = 0
    numLeftReleases% = 0
    numRightReleases% = 0
    numCenterReleases% = 0
    mx% = 0
    my% = 0
  END IF

  ' **
  ' ** Initialize event flag
  ' **
  eventOccurred% = FALSE

  ' **
  ' ** Sit in a loop waiting for an event.  If one occurs, set return value,
  ' ** fill in OUT parameters, and get outta here.
  ' **
  WHILE (eventOccurred% = FALSE)

    ' **
    ' ** If OK to do so, check mouse for events.
    ' **
    IF (checkMouse%) THEN

      ' **
      ' ** First, see if mouse has moved.
      ' **
      MousePosition mx%, my%
      IF (mx% <> oldMouseX%) OR (my% <> oldMouseY%) THEN
        mouseX% = (mx% \ 8) + 1
        mouseY% = (my% \ 8) + 1
        returnValue% = EMmoved
        eventOccurred% = TRUE
      END IF

      ' **
      ' ** If no event so far, check to see if mouse left button was pressed.
      ' **
      IF (eventOccurred% = FALSE) THEN
        MouseButtonPressInfo LEFTBUTTON, numLeftPresses%, mx%, my%
        IF (numLeftPresses% <> 0) THEN
          mouseX% = (mx% \ 8) + 1
          mouseY% = (my% \ 8) + 1
          returnValue% = EMpressedLeft
          eventOccurred% = TRUE
        END IF
      END IF

      ' **
      ' ** If no event so far, check to see if mouse right button was pressed.
      ' **
      IF (eventOccurred% = FALSE) THEN
        MouseButtonPressInfo RIGHTBUTTON, numRightPresses%, mx%, my%
        IF (numRightPresses% <> 0) THEN
          mouseX% = (mx% \ 8) + 1
          mouseY% = (my% \ 8) + 1
          returnValue% = EMpressedRight
          eventOccurred% = TRUE
        END IF
      END IF

      ' **
      ' ** If no event so far, check to see if mouse left button was
      ' ** released.
      ' **
      IF (eventOccurred% = FALSE) THEN
        MouseButtonReleaseInfo LEFTBUTTON, numLeftReleases%, mx%, my%
        IF (numLeftReleases% <> 0) THEN
          mouseX% = (mx% \ 8) + 1
          mouseY% = (my% \ 8) + 1
          returnValue% = EMreleasedLeft
          eventOccurred% = TRUE
        END IF
      END IF

      ' **
      ' ** If no event so far, check to see if mouse right button was
      ' ** released.
      ' **
      IF (eventOccurred% = FALSE) THEN
        MouseButtonReleaseInfo RIGHTBUTTON, numRightReleases%, mx%, my%
        IF (numRightReleases% <> 0) THEN
          mouseX% = (mx% \ 8) + 1
          mouseY% = (my% \ 8) + 1
          returnValue% = EMreleasedRight
          eventOccurred% = TRUE
        END IF
      END IF
    END IF

    ' **
    ' ** If no event so far, check the keyboard for press.
    ' **
    IF (eventOccurred% = FALSE) THEN

      key$ = INKEY$

      IF (key$ <> "") THEN    ' If key was hit then fill in keyCode.
        IF (MID$(key$, 1, 1) = CHR$(0)) THEN
          keyCode% = CVI(LEFT$(key$ + "  ", 2))
        ELSE
          keyCode% = ASC(key$)
        END IF
        returnValue% = EKpressed
        eventOccurred% = TRUE
      END IF

    END IF  ' ** No event has occurred **

  WEND

  getEvent% = returnValue%

END FUNCTION

