gpm: Handling Functions
4.1 Handling Functions
======================
A mouse handler is a function which registers itself within the library,
and is called whenever a mouse event is reported to the application. It
is passed two arguments and returns an integer value, according to the
following typedef:
'typedef int Gpm_Handler(Gpm_Event *EVENT, void *CLIENTDATA);'
The EVENT is used to instantiate the mouse event just received, and
the CLIENTDATA pointer is needed to implement some higher level
functionality. An handler will be typically invoked by 'Gpm_Getc', or
by the high-level library, and the following discussion assumes the
invoking function is 'Gpm_Getc' (the high-level library only runs on
behalf of 'Gpm_Getc').
Handling functions can do whatever they want to, and return to the
caller an integer value, which can be used to generate a keyboard event.
This feature is useful in that often the mouse is a shortcut for
something which could be made by means of the keyboard.
The application main loop can detect if the keyboard event is a
physical or generated one by looking at the global variable 'gpm_hflag',
which is not zero only for handler-generated events.
An handling function can generate more than one key in response of a
single mouse event. If it sets the global variable 'gpm_morekeys' to a
non-zero variable before returning, it will be invoked again without
waiting for mouse events. You can use 'gpm_morekeys' as a counter of
how many times you want to be called again - the client library only
compares it to zero.
The return value from an handler is used as follows:
'EOF'
This value is used to signal a fatal error, and will cause
'Gpm_Getc' to return the same value to the caller, after setting
'gpm_hflag' to 1.
'0'
A zero return value means that 'Gpm_Getc' should go on as before,
without returning to the caller. The event has been eaten by the
handler and no key-press is simulated.
'ANYTHING-ELSE'
Any other value is considered a simulated character, and is
returned to the caller after setting 'gpm_hflag'. This allows a
quick way to implement yes/no boxes and simple menus without
interfering with the main body of an existing application.
Moreover, if return values greater than 255 are used a single
switch loop can parse both keyboard and mouse events.
A mouse handler is passed as second argument the content of the
'gpm_data' variable, i.e. the current clientdata. The clientdata is
almost unuseful unless you use the high-level library, because it holds
a static value. Delivering the clientdata however allows the high-level
management of mouse events to be a superset of the low-level code,
rather than an incompatible alternative.