If the GACT_FOLLOWMOUSE flag is set for a gadget, the application will
receive mouse movement broadcasts as long as the gadget is active. This
section covers the behavior of proportional, boolean and string gadgets,
although there are major caveats in some cases:
* Unlike IDCMP_GADGETUP and IDCMP_GADGETDOWN IntuiMessages, the
IAddress field of an IDCMP_MOUSEMOVE IntuiMessage does not point to
the gadget. The application must track the active gadget (this
information is readily obtained from the IDCMP_GADGETDOWN message)
instead of using the IAddress field.
Right Wrong
----- -----
imsg=GetMsg(win->UserPort); imsg=GetMsg(win->UserPort);
class=imsg->Class; class=imsg->Class;
code=imsg->Code; code=imsg->Code;
/* OK */ /* ILLEGAL ! */
iaddress=imsg->IAddress; gadid=((struct Gadget *)
imsg->IAddress)->GadgetID;
ReplyMsg(imsg); ReplyMsg(imsg);
Using the code in the left column, it is acceptable to get the
address of a gadget with gadid=((struct Gadget *)iaddress)->GadgetID
but only after you have checked to make sure the message is an
IDCMP_GADGETUP or IDCMP_GADGETDOWN.
* Boolean gadgets only receive mouse messages if both GACT_RELVERIFY
and GACT_FOLLOWMOUSE are set. Those cases described below with
GACT_RELVERIFY cleared do not apply to boolean gadgets.
* In general, IDCMP_MOUSEMOVE messages are sent when the mouse changes
position while the gadget is active. Boolean and proportional
gadgets are active while the mouse button is held down, thus mouse
move messages will be received when the user "drags" with the mouse.
String gadgets are active until terminated by keyboard entry or
another object becomes active (generally by user clicking the other
object). GACT_FOLLOWMOUSE string gadgets will generate mouse moves
the entire time they are active, not just when the mouse button is
held.
The broadcasts received differ according to the gadget's flag settings.
If using the GACT_IMMEDIATE and GACT_RELVERIFY activation flags, the
program gets a gadget down message, receives mouse reports
(IDCMP_MOUSEMOVE) as the mouse moves, and receives a gadget up message
when the mouse button is released. For boolean gadgets, the mouse button
must be released while the pointer is over the gadget. If the button is
not released over the boolean gadget, an IDCMP_MOUSEBUTTONS message with
the SELECTUP qualifier will be sent.
If only using the GACT_IMMEDIATE activation flag, the program gets a
gadget down message and receives mouse reports as the mouse moves. The
mouse reports will stop when the user releases the mouse select button.
This case does not apply to boolean gadgets as GACT_RELVERIFY must be set
for boolean gadgets to receive mouse messages. If only using the
GACT_RELVERIFY activation flag, the program gets mouse reports followed by
an up event for a gadget. For boolean gadgets, the IDCMP_GADGETUP event
will only be received if the button was released while the pointer was
over the gadget. If the button is not released over the boolean gadget, a
IDCMP_MOUSEBUTTONS message with the SELECTUP qualifier will be received if
the program is receiving these events.
If neither the GACT_IMMEDIATE nor the GACT_RELVERIFY activation flags are
set, the program will only receive mouse reports. This case does not
apply to boolean gadgets as GACT_RELVERIFY must be set for boolean
gadgets to receive mouse messages.