Hey, way cool! I believe you may have a small bug in your code, tho. In order for it to display properly on my machine, I needed to change: $hands[0]{ang} = $secs_today / 21600 * $pi2; to: $hands[0]{ang} = $secs_today / -21600 * $pi2; in order to make the hours hand appear in the correct place. Not sure why ... only spent a minute or two looking at the code. :-) Thanks! -- Mark >#!perl -w > >use Mac::Events; >use Mac::Windows; >use Mac::QuickDraw; >use Mac::Menus; >use Time::Local; > >@divs = (.4, .75, .90); >$showtext = 1; >$showtitle = 1; >$pi = 3.14159; >$pi2 = $pi * 2; >$wrect = new Rect (100, 100, 300, 250); > >$lgray = new RGBColor ((50000) x 3); >$dgray = new RGBColor ((10000) x 3); >$black = new RGBColor ((0) x 3); >$white = new RGBColor ((65535) x 3); > >sub InitWin { > my ($rect, $title) = @_; > > $win->dispose if $win; > $win = new MacColorWindow ( > $rect, > 'Clock', > 1, > $title ? documentProc : plainDBox, > 1, # Anybody know how to write a round WDEF? > ); > > $win->sethook(layout => sub { > my $wRect = $win->window->contRgn->rgnBBox; > SetPort($win->window); > my $sPt = GlobalToLocal(new Point ($wRect->right, $wRect->bottom)); > > $midh = $sPt->h * .50; > $midv = ($sPt->v - ($showtext ? 20 : 0)) * .50; > $mdv = $midv - 10; > $mdh = $mdv; > if ($mdh > $sPt->h / 2 - 10) { > $mdh = $sPt->h / 2 - 10; > $mdv = $mdh; > } > $tpos = $sPt->v - 10; > > for (0..2) { > $hands[$_]{len}[0] = $mdh * $divs[$_]; > $hands[$_]{len}[1] = $mdv * $divs[$_]; > $hands[$_]{ang} = rand() * $pi; > $hands[$_]{begin} = [0, 0]; > $hands[$_]{end} = [0, 0]; > } > # Indices are $hands[ which hand ]{ len, tip }[ x or y coord ]. > > calc_hands(); > InvalRect new Rect (0, 0, $sPt->h, $sPt->v); > }); > $win->layout; > $win->sethook(drawgrowicon => sub {}); > > RGBBackColor($lgray); > $win->sethook(redraw => sub { > RGBForeColor($white); > FrameOval(new Rect($midh - $mdh + 1, $midv - $mdv + 1, $midh + $mdh + 1, >$midv + $mdv + 1)); > RGBForeColor($dgray); > FrameOval(new Rect($midh - $mdh, $midv - $mdv, $midh + $mdh, $midv + >$mdv)); > RGBForeColor($black); > foreach (@hands) { > MoveTo($midh, $midv); > LineTo(@{$_->{tip}}); > } > if ($showtext) { > MoveTo($midh - StringWidth($tstr) / 2, $tpos); > DrawString $tstr; > } > }); > > $win->sethook(click => sub { > if ($Mac::Events::CurrentEvent->modifiers & controlKey) { > my ($mw, $pt) = @_; > $m->insert; > my $mp = LocalToGlobal(GetMouse); > PopUpMenuSelect $m->{menu}, $mp->v, $mp->h, 1; > $m->delete; > } else { > DragWindow($win->window, $Mac::Events::CurrentEvent->where); > } > }); >} >InitWin($wrect, $showtitle); > >sub calc_hands { > foreach (@hands) { > $_->{tip}[0] = sin($_->{ang})*$_->{len}[0]+$midh; > $_->{tip}[1] = -cos($_->{ang})*$_->{len}[1]+$midv; > @box = map {($$_[0] < $$_[1]) ? $_ : [$$_[1], $$_[0]]} ([$_->{tip}[0], >$midh], [$_->{tip}[1], $midv]); > $_->{begin} = [$box[0][0], $box[1][0]]; > $_->{end} = [$box[0][1], $box[1][1]]; > } >} > >$m = new MacHierMenu 2000, '', ( > ['Text Time' => sub { > $showtext = !$showtext; > $win->layout; > SetItemMark $m->{menu}, 1, $showtext ? "\cR" : ''; > }], > ['Title Bar' => sub { > $showtitle = !$showtitle; > InitWin($win->window->contRgn->rgnBBox, $showtitle); > SetItemMark $m->{menu}, 2, $showtitle ? "\cR" : ''; > }], >); >SetItemMark $m->{menu}, 1, $showtext ? "\cR" : ''; >SetItemMark $m->{menu}, 2, $showtitle ? "\cR" : ''; > >$t = $tt = 0; >while ($win->window) { > if ($t != ($tt = time) and $t = $tt) { > SetPort($win->window); > foreach (@hands) { > InvalRect new Rect (@{$_->{begin}}, map $_+1, @{$_->{end}}); > } > #($sec, $min, $hr) = localtime; > #$hands[0]{ang} = $hr % 12 / 12 * $pi2; > #$hands[1]{ang} = $min / 60 * $pi2; > #$hands[2]{ang} = $sec / 60 * $pi2; > > $tstr = scalar localtime; > $secs_today = timegm(localtime) % 86400; > $hands[0]{ang} = $secs_today / 21600 * $pi2; > $hands[1]{ang} = $secs_today / 3600 * $pi2; > $hands[2]{ang} = $secs_today / 60 * $pi2; > > calc_hands(); > foreach (@hands) { > InvalRect new Rect (@{$_->{begin}}, map $_+1, @{$_->{end}}); > } > InvalRect new Rect ($midh - StringWidth($tstr) / 2, $tpos - 10, $midh + >StringWidth($tstr) / 2, $tpos + 10) > if $showtext; > } > WaitNextEvent; >} > >END {$win->dispose} > >__END__ > >-- > Kevin Reid. | Macintosh. > "I'm me." | Think different. > >***** Want to unsubscribe from this list? >***** Send mail with body "unsubscribe" to mac-perl-request@iis.ee.ethz.ch ________________________________________________________________ Mark de Jong <mdj@intervu.net> InterVU Inc. Software Engineer http://www.intervu.net ***** Want to unsubscribe from this list? ***** Send mail with body "unsubscribe" to mac-perl-request@iis.ee.ethz.ch