home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Carousel Volume 2 #1
/
carousel.iso
/
mactosh
/
lang
/
tml_doub.src
< prev
next >
Wrap
Internet Message Format
|
1986-03-11
|
4KB
Return-Path: <oster%ucblapis@BERKELEY.EDU>
Received: from ucbvax.berkeley.edu by SUMEX-AIM.ARPA with TCP; Mon 10 Mar 86 00:45:05-PST
Received: by ucbvax.berkeley.edu (5.45/1.9)
id AA19777; Mon, 10 Mar 86 00:10:49 PST
Received: from ucblapis.Berkeley.Edu (ucblapis.ARPA)
by ucbjade.Berkeley.Edu (4.19/4.41.3)
id AA00206; Sun, 9 Mar 86 23:18:45 pst
Received: by ucblapis.Berkeley.Edu (4.19/4.41)
id AA09220; Sun, 9 Mar 86 17:13:31 pst
Date: Sun, 9 Mar 86 17:13:31 pst
From: oster%ucblapis@BERKELEY.EDU (David Phillip Oster)
Message-Id: <8603100113.AA09220@ucblapis.Berkeley.Edu>
To: info-mac@sumex-aim.arpa
Subject: How to tell a double click.
Here is the T.M.L. Pascal procedure I've written to tell if a given
mouseDown eventrecord is actually the first click of a double click.
There are a couple of tricky points:
1.) The user gets to set the DoubleClick time threshold from the control
panel. It is up to us to respect it.
2.) You must arrange to return as soon as you know that a given
eventRecord is NOT the first click of a double click - if you always
wait for the doubleClick time to expire, the application will seem sluggish.
3.) You have to allow for the mouse to move a little while the user is
doubleClicking (but not too much.)
{ --- Cut Here --- }
{ ******************************************************************************* }
{+++
Wrap a toolbox procedure in a layer to make it
a function returning a useful value: LocalToGlobal
Convert a point from the current window's coordinates to screen coordinates.
Author: David Phillip Oster
Date: 1/6/86
+++}
FUNCTION LocToGlob(p : Point) : Point;
BEGIN
LocalToGlobal(p);
LocToGlob := p;
END;
{ ******************************************************************************* }
{+++
Wrap a toolbox procedure in a layer to make it
a function returning a useful value: GetMouse
return the mouse's position in local coordinates
Author: David Phillip Oster
Date: 1/6/86
+++}
FUNCTION MousePt : Point;
VAR p : Point;
BEGIN
GetMouse(p);
MousePt := p;
END;
{ ******************************************************************************* }
{+++ Calaculates on rectangles and points
CenterRectPt takes a rectangle and a pt and centers the rect
with respect to the pt
Author: David Phillip Oster
Date: 1/6/86
+++}
FUNCTION CenterRectPt(theRect : Rect; thePt : Point ) : Rect;
VAR newCorn : Point;
i : VHSelect;
BEGIN
FOR i := v TO h DO
newCorn.vh[i] := thePt.vh[i] -
((theRect.botRight.vh[i] - theRect.topleft.vh[i]) div 2);
OffsetRect(theRect, newCorn.h, newCorn.v);
CenterRectPt := theRect;
END;
{ ******************************************************************************* }
{+++ WasDoubleClick - call with the event record from a mouseDown event.
check for a second mouse down within DblTime time, and within
8 pixels. If such an event exists, remove it and
return true otherwise, return false
Author: David Phillip Oster
Date: 1/6/86
+++}
FUNCTION WasDoubleClick(VAR myEvent : EventRecord) : Boolean;
TYPE
LongPtr = ^ LongInt;
VAR
DblTime : LongPtr;
clickRect : Rect;
dnTime : LongInt;
dnEvent : EventRecord;
dontCare : Boolean;
BEGIN
WasDoubleClick := FALSE;
DblTime := LongPtr(POINTER($2F0)); { get the user's doubletime threshold }
dnTime := myEvent.when + DblTime^; { only wait until dnTime for second event }
SetRect(clickRect, 0,0,12,12);
clickRect := CenterRectPt(clickRect, myEvent.where);
{ +++ wait for the second event, leave loop as soon as we can +++ }
WHILE (TickCount < dnTime) AND
PtInRect(LocToGlob(MousePt), clickRect) AND
NOT EventAvail(mDownMask,dnEvent) DO
{ nothing } ;
{ +++ waited long enough, is there a second mouse down? +++ }
IF EventAvail(mDownMask,dnEvent) THEN BEGIN
IF PtInRect(dnEvent.where, clickRect) THEN BEGIN
{ +++ we know GetNextEvent will return true +++ }
WasDoubleClick := GetNextEvent(mDownMask,dnEvent);
END;
END;
END;
{ --- Cut Here --- }
This code would be much more elegant in C, because I could return 0; as
soon as I knew that this particular event wasn't a doubleCLick, but it is
okay in Pascal.
I hope this helps. (I also do a much nicer double-click on title-bar of
window goes to full screen and back than the new Mac Roms do.)
---David Phillip Oster
--------------------- ``What do you look like when you aren't visualizing?''
Arpa: oster@lapis.berkeley.edu
Uucp: ucbvax!ucblapis!oster