The example uses the FLI to find the position of the cursor using the Windows function GetCursorPos
, which has the following C prototype:
BOOL GetCursorPos( LPPOINT )
The LPPOINT
argument is a pointer to the POINT
structure, which has the following C definition:
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT;
First we use the fli:define-c-typedef
macro to define a number of basic types which are needed to pass data to and from the Windows function.
(fli:define-c-typedef bool (:boolean :int))
(fli:define-c-typedef long :long)
This defines two types, BOOL
and LONG
, which are used to associate a Lisp boolean value ( t
or nil
) with a C boolean of type int
, and a Lisp bignum
with a C long
. These are required because the Windows function GetCursorPos
returns a boolean to indicate if it has executed successfully, and the cursor's x and y positions are specified in a long
format in the POINT
structure.
Next, we need to define a structure for the FLI which is used to get the coordinates of the cursor. These coordinates will consist of an x and a y position. We use the fli:define-c-struct
macro for this, and the resulting Lisp FLI code has obvious parallels with the C tagPOINT
structure.
(fli:define-c-struct tagpoint
(x long)
(y long))
The tagPOINT
structure for the FLI, corresponding to the C structure of the same name, has been defined. This now needs to be further defined as a type for the FLI, using fli:define-c-typedef
.
(fli:define-c-typedef point (:struct tagpoint))
Finally, a pointer type to point to the structure is required. It is this FLI pointer which will be passed to the Windows function GetCursorPos
, so that GetCursorPos
can change the x
and y
values of the structure pointed to.
(fli:define-c-typedef lppoint (:pointer point))
All the required FLI types have now been defined. Although it may seem that there is a level of duplicity in the definitions of the structures, pointers and types in this section, this was necessary to match the data structures of the C functions to which the FLI will interface. We can now move on to the definition of FLI functions to perform the interfacing.