cunniff@hpfcdc.HP.COM (Ross Cunniff) (01/24/89)
I've been fiddling around with detecting double-clicking of the select
button in an application I'm writing. The method I've come up with follows
(it has been typed in from memory; don't flame me for minor typos...).
It works OK, except that a single click without excessive mouse motion
following takes a noticble amount of time to get processed. In addition,
the double click loop is hard on the multitasking O/S. (I just realized
that I could use Intuition timer events; any caveats?) Does anybody
have a better way of doing this?
A second, only slightly releated question is: How does one safely close
windows with shared IDCMP ports? The AutoDocs give a passing mention
to a routine named CloseWindowSafely(), and claim that it is documented
in one of the early issues of AmigaMail. I don't seem to have that issue.
At any rate, here is the double click loop:
Wait( 1 << Win->UserPort->mp_SigBit );
while( Msg = GetMsg( Win->UserPort ) ) {
/* Copy Code, Class, etc. fields from Msg; deleted for space */
ReplyMsg( Msg );
if( (Class == MOUSEBUTTONS) && (Code == SELECTDOWN) ) {
/* Mouse click; Save current parameters */
OldS = CurrS; OldU = CurrU;
OldX = MouseX; OldY = MouseY;
/* Etc... */
Done = NOT_DONE;
while( Done == NOT_DONE ) {
Msg = GetMsg( Win->UserPort );
if( Msg ) {
/* Copy fields from Msg; deleted for space */
ReplyMsg( Msg );
if( (Class == MOUSEBUTTONS) && (Code == SELECTDOWN) ) {
if( DoubleClick( OldS, OldU, CurrS, CurrU ) ) {
/* Aha! a double click */
Done = DOUBLE_CLICK;
}
else {
/* Oops! Two discrete mouse clicks */
Done = TWO_EVENTS;
}
}
else if( Class == MOUSEMOVE ) {
if( (ABS( OldX - MouseX ) > MAX_XDLTA) ||
(ABS( OldY - MouseY ) > MAX_YDLTA) )
{
/* We moved the mouse too far */
Done = TWO_EVENTS;
}
}
else {
/* Another event (gadgetclick? RAWKEY?) came in */
Done = TWO_EVENTS;
}
}
else {
/* No event pending; see if we've timed out */
CurrentTime( &CurrS, &CurrU );
if( DoubleClick( OldS, OldU, CurrS, CurrU ) ) {
/* We timed out; go away */
Done = TIMEOUT;
}
}
} /* end while( Done == NOT_DONE ) */
/* OK, something happened; process it */
switch( Done ) {
case DOUBLE_CLICK :
/* Do double click stuff */
break;
case TWO_EVENTS :
/* Do stuff for first event */
/* Do stuff for second event */
break;
case TIMEOUT :
/* Do stuff for first event */
break;
}
} /* end if( select click ) */
else {
/* Do stuff for other events */
}
} /* end while( Msg ) */
Ross Cunniff
...{ucbvax,hplabs}!hpfcrt!cunniff
cunniff%hpfcrt@hplabs.HP.COMshimoda@infohh.rmi.de (Markus Schmidt) (01/27/89)
Hi!
Four doubleclicks I use this logic:
while (1) {
imsg= GetMsg ( ...
if (imsg->Class= /* endevent */)
break;
if (imsg->Class==SELECTDOWN)
{
static Seconds= 0,
Micros= 0;
if ((Seconds!=0 || Micros!=0) &&
DoubleClick(Seconds,Micros,
imsg->Seconds, imsg->Micros)) {
/* Your Stuff ... */
Seconds= Micros= 0;
}
else {
Seconds= imsg->Seconds; Micros= imsg->Micros;
}
}
}
Please notice that ReplyMsg is not handled. I just hacked that down
online.
.-----------------------------------------------------------------.
| shimoda@rmi.de `---' The last remaining adventure |
| shimoda@gopnbg.UUCP |O o| since there are no more tigers: |
| ==Y== Doublebuffered async. I/O _ |
|----------------------- `U' ------------------------------ _ // |
| Good terminalpackages begin with A: AmigaCall, A-Ta.. \// |
`-----------------------------------------------------------------'atheybey@PTT.LCS.MIT.EDU (01/30/89)
shimoda@infohh.rmi.de (Markus Schmidt) writes:
%Four doubleclicks I use this logic:
%
%while (1) {
%
% imsg= GetMsg ( ...
% if (imsg->Class= /* endevent */)
% break;
%
%
% if (imsg->Class==SELECTDOWN)
% {
% static Seconds= 0,
% Micros= 0;
%
% if ((Seconds!=0 || Micros!=0) &&
% DoubleClick(Seconds,Micros,
% imsg->Seconds, imsg->Micros)) {
%
% /* Your Stuff ... */
%
% Seconds= Micros= 0;
% }
% else {
% Seconds= imsg->Seconds; Micros= imsg->Micros;
% }
% }
%
%}
%
%Please notice that ReplyMsg is not handled. I just hacked that down
%online.
%
%.-----------------------------------------------------------------.
%| shimoda@rmi.de `---' The last remaining adventure |
%| shimoda@gopnbg.UUCP |O o| since there are no more tigers: |
Please correct me if I am wrong, but doesn't this code fragment
contain two Bad Things? No Guru has yet responded, so I thought I
would take a shot at sticking my foot in my mouth.
It busy-waits. There is no call to Wait(), or WaitPort() before the
GetMsg(). Even if you are busy-waiting only while looking for double
clicks, you shouldn't.
GetMsg() will return NULL if no message has yet arrived. With the
various 'if (imsg-> ... )' tests, you are then indirecting through
address 0, which while not necessarily fatal, is sloppy and will quite
likely break on any system with memory protection (unless it's a VAX :-).
Even if you do call Wait(), you should not depend on GetMsg()
returning something non-NULL.
---------------------------------------------------------------------------
Andrew Heybey, atheybey@ptt.lcs.mit.edu Room 509, 545 Technology Square
Advanced Network Architecture Group Cambridge, MA 02139
MIT Laboratory for Computer Science (617) 253-6011
---------------------------------------------------------------------------shimoda@infohh.rmi.de (Markus Schmidt) (02/04/89)
)% )%| shimoda@rmi.de `---' The last remaining adventure | )%| shimoda@gopnbg.UUCP |O o| since there are no more tigers: | ) )Please correct me if I am wrong, but doesn't this code fragment )contain two Bad Things? No Guru has yet responded, so I thought I )would take a shot at sticking my foot in my mouth. ) )It busy-waits. There is no call to Wait(), or WaitPort() before the )GetMsg(). Even if you are busy-waiting only while looking for double )clicks, you shouldn't. ) )GetMsg() will return NULL if no message has yet arrived. With the )various 'if (imsg-> ... )' tests, you are then indirecting through )address 0, which while not necessarily fatal, is sloppy and will quite )likely break on any system with memory protection (unless it's a VAX :-). )Even if you do call Wait(), you should not depend on GetMsg() )returning something non-NULL. ) )Andrew Heybey, atheybey@ptt.lcs.mit.edu Room 509, 545 Technology Square .-----------------------------------------------------------------. Of course you are right both times. As I said, it was hacked down online so forgive me if this caused any trouble. Next time I will be more reliable. I just left out anything except the DoubleClick-stuff. Thank you anyway. | shimoda@rmi.de `---' The last remaining adventure | | shimoda@gopnbg.UUCP |O o| since there are no more tigers: | | ==Y== Doublebuffered async. I/O _ | |----------------------- `U' ------------------------------ _ // | | Good terminalpackages begin with A: AmigaCall, A-Ta.. \// | `-----------------------------------------------------------------'