%
%   $Id$
%   This file is part of the FPC documentation.
%   Copyright (C) 1997, by Michael Van Canneyt
%
%   The FPC documentation is free text; you can redistribute it and/or
%   modify it under the terms of the GNU Library General Public License as
%   published by the Free Software Foundation; either version 2 of the
%   License, or (at your option) any later version.
%
%   The FPC Documentation is distributed in the hope that it will be useful,
%   but WITHOUT ANY WARRANTY; without even the implied warranty of
%   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%   Library General Public License for more details.
%
%   You should have received a copy of the GNU Library General Public
%   License along with the FPC documentation; see the file COPYING.LIB.  If not,
%   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
%   Boston, MA 02111-1307, USA.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The Mouse unit
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{The MOUSE unit}
\FPCexampledir{mousex}
The \var{Mouse} unit implements a platform independent mouse handling 
interface. It is implemented identically on all platforms supported by 
\fpc{} and can be enhanced with custom drivers, should this be needed.

\section{Constants, Types and Variables}
\subsection{Constants}	
The following constants can be used when mouse drivers need to report 
errors:
\begin{verbatim}
const
  { We have an errorcode base of 1030 }
  errMouseBase                    = 1030;
  errMouseInitError               = errMouseBase + 0;
  errMouseNotImplemented          = errMouseBase + 1;
\end{verbatim}
The following constants describe which action a mouse event describes
\begin{verbatim}
const
  MouseActionDown = $0001;  { Mouse down event }
  MouseActionUp   = $0002;  { Mouse up event }
  MouseActionMove = $0004;  { Mouse move event }
\end{verbatim}
The following constants describe the used buttons in a mouse event:
\begin{verbatim}
  MouseLeftButton   = $01;  { Left mouse button }
  MouseRightButton  = $02;  { Right mouse button }
  MouseMiddleButton = $04;  { Middle mouse button }
\end{verbatim}
The mouse unit has a mechanism to buffer mouse events. The following
constant defines the size of the event buffer:
\begin{verbatim}
MouseEventBufSize = 16;
\end{verbatim}
\subsection{Types}
The \var{TMouseEvent} is the central type of the mouse unit, it is used
to describe the mouse events:
\begin{verbatim}
PMouseEvent=^TMouseEvent;
TMouseEvent=packed record { 8 bytes }
  buttons : word;
  x,y     : word;
  Action  : word;
end;
\end{verbatim}
The \var{Buttons} field describes which buttons were down when the event
occurred. The \var{x,y} fields describe where the event occurred on the
screen. The \var{Action} describes what action was going on when the event
occurred. The \var{Buttons} and \var{Action} field can be examined using the
above constants.

The following record is used to implement a mouse driver in the
\seep{SetMouseDriver} function:
\begin{verbatim}
TMouseDriver = Record 
  UseDefaultQueue : Boolean;
  InitDriver : Procedure;
  DoneDriver : Procedure;
  DetectMouse : Function : Byte;
  ShowMouse : Procedure;
  HideMouse : Procedure;
  GetMouseX : Function : Word;
  GetMouseY : Function : Word;
  GetMouseButtons : Function : Word;
  SetMouseXY : procedure (x,y:word);
  GetMouseEvent : procedure (var MouseEvent:TMouseEvent);
  PollMouseEvent : function (var MouseEvent: TMouseEvent):boolean;
  PutMouseEvent : procedure (Const MouseEvent:TMouseEvent); 
end;
\end{verbatim}
Its fields will be explained in the section on writing a custom driver.

\subsection{Variables}
The following variables are used to keep the current position and state of
the mouse.
\begin{verbatim}
MouseIntFlag : Byte;  { Mouse in int flag }
MouseButtons : Byte;  { Mouse button state }
MouseWhereX,
MouseWhereY  : Word;  { Mouse position }
\end{verbatim}

\section{Functions and procedures}

\begin{function}{DetectMouse}
\Declaration
Function DetectMouse:byte;
\Description
 { Detect if a mouse is present, returns the amount of buttons or 0  if no mouse is found }
\Errors
\SeeAlso
\end{function}

\begin{procedure}{DoneMouse}
\Declaration
Procedure DoneMouse;
\Description
 { Deinitialize the mouse interface }
\Errors
\SeeAlso
\end{procedure}

\begin{function}{GetMouseButtons}
\Declaration
Function GetMouseButtons:word;
\Description
 { Return the current button state of the mouse }
\Errors
\SeeAlso
\end{function}

\begin{procedure}{GetMouseDriver}
\Declaration
Procedure GetMouseDriver(Var Driver : TMouseDriver);
\Description
\Errors
\SeeAlso
\end{procedure}

\begin{procedure}{GetMouseEvent}
\Declaration
Procedure GetMouseEvent(var MouseEvent:TMouseEvent);
\Description
 { Returns the last Mouseevent, and waits for one if not available }
\Errors
\SeeAlso
\end{procedure}

\begin{function}{GetMouseX}
\Declaration
Function GetMouseX:word;
\Description
 { Return the current X position of the mouse }
\Errors
\SeeAlso
\end{function}

\begin{function}{GetMouseY}
\Declaration
Function GetMouseY:word; 
\Description
{ Return the current Y position of the mouse }
\Errors
\SeeAlso
\end{function}

\begin{procedure}{HideMouse}
\Declaration
Procedure HideMouse;
\Description
 { Hide the mouse cursor }
\Errors
\SeeAlso
\end{procedure}

\begin{procedure}{InitMouse}
\Declaration
Procedure InitMouse;
\Description
 { Initialize the mouse interface }
\Errors
\SeeAlso
\end{procedure}

\begin{function}{PollMouseEvent}
\Declaration
Function PollMouseEvent(var MouseEvent: TMouseEvent):boolean; 
\Description
{ Checks if a Mouseevent is available, and returns it if one is found. If no   event is pending, it returns 0 }
\Errors
\SeeAlso
\end{function}

\begin{procedure}{PutMouseEvent}
\Declaration
Procedure PutMouseEvent(const MouseEvent: TMouseEvent);
\Description
 { Adds the given MouseEvent to the input queue. Please note that depending on  the implementation this can hold only one value (NO FIFOs etc) }
\Errors
\SeeAlso
\end{procedure}

\begin{procedure}{SetMouseDriver}
\Declaration
Procedure SetMouseDriver(Const Driver : TMouseDriver);
\Description
 { Sets the mouse driver. }
\Errors
\SeeAlso
\end{procedure}

\begin{procedure}{SetMouseXY}
\Declaration
Procedure SetMouseXY(x,y:word); 
\Description
{ Place the mouse cursor on x,y }
\Errors
\SeeAlso
\end{procedure}

\begin{procedure}{ShowMouse}
\Declaration
Procedure ShowMouse; 
\Description
{ Show the mouse cursor }
\Errors
\SeeAlso
\end{procedure}
