### Hi David,
### better use "sprintf" in two places, which stands
### for *s*tring *print* with *f*ormat, OSTLT.
### And maybe it is better to mathematically _add_ those
### seconds and microseconds rather than _concatenating_
### their strings.
###
### ;) My best result in quick typing was 0.008 seconds.
###
### Regards, Detlef
### David's report on typed keys:
#!perl
use Mac::Events;
use Mac::Events qw(@Event $CurrentEvent);
use Mac::LowMem;
if($] > 5.006) { require Time::HiRes }
$Event[keyDown] = \&keyDown_Handler;
$Event[keyUp] = \&keyUp_Handler;
LMSetSysEvtMask(LMGetSysEvtMask() | keyUpMask);
print "Hold down one or more keys. (Press cmd \".\" to quit)\n\n";
while (! $flag) {
WaitNextEvent }
print "\nDONE!\n";
exit;
sub keyDown_Handler {
&getEvent;
if (($CurrentEvent->modifiers & 256) == 256 && $key eq ".") { $flag = 1 }
$k{$key} = $sec;
printf(" \'$key\' = down ASCII = %3d\n",$ascii); }
sub keyUp_Handler {
&getEvent;
if ($k{$key}) {
$dif = $sec - $k{$key};
# $elapsed = substr($dif,0,index($dif,'.') + 4); ## better do this:
$elapsed = sprintf("%4.3f", $dif);
printf(" \'$key\' = up ASCII = %3d (down for $elapsed seconds)\n",$ascii);
$k{$key} = ""; }
else {
printf(" \'$key\' = up ASCII = %3d (wasn\'t down",$ascii);
if ($k{"\u$key"}) {
print " but \'\u$key\' was)\n";
$k{"\u$key"} = ""; }
elsif ($k{"\l$key"}) {
print " but \'\l$key\' was)\n";
$k{"\l$key"} = ""; }
else { print "... What key was down?)\n" } } }
sub getEvent {
if($] > 5.006) {
($seconds, $microseconds) = Time::HiRes::gettimeofday();
$sec = "$seconds.".sprintf("%06s", $microseconds); } ## use sprintf here
else { $sec = time }
my($ev) = @_;
$ascii = $ev->character;
$key = chr($ascii); }
__END__