sjs@spectral.ctt.bellcore.com (Stan Switzer) (03/28/89)
Ok, so the last thing anyone needs is yet another NeWS clock, right?
Like Bret Thaeler's clock, this one has no client-side code. It uses
a different trick to figure out a base reference time, though.
Basically, I "forkunix" a shell command which executes "date" and
stuffs it back into NeWS using "sendevent" in "psh." Deviant, eh? Of
course, this technique can be used to capture the results of any UNIX
command for further NeWS processing
Try it, maybe you'll like it.
Stan Switzer sjs@ctt.bellcore.com
------------
#!/usr/NeWS/bin/psh
%
% nclock: a clock in NeWS alone
%
% Copyright (C) 1989 by Stan Switzer. All rights reserved.
% This program is provided for unrestricted use, provided that this
% copyright message is preserved. There is no warranty, and no author
% or distributer accepts responsibility for any damage caused by this
% program.
%
systemdict /Midnight known not {
/GetDate { % - -> (str) true -or- false
{ 25 dict begin % fork (to keep events from being confused)
/Interest createevent dup begin
/Name [ /TimeOut /Date ] def
end dup expressinterest def
/Timer Interest createevent copy dup begin
/Name /TimeOut def
/TimeStamp currenttime .25 add def
end dup sendevent def
(echo "createevent dup begin)
( /Name /Date def /Action (`date`)) append
( def end sendevent" | psh) append forkunix
awaitevent dup /Name get /TimeOut eq {
pop [ false ]
} {
Timer recallevent
/Action get [ exch true ]
} ifelse
end } fork waitprocess aload pop
} def
/GetHHMMSS { % - -> hh mm ss true -or- false
GetDate {
3 { ( ) search pop pop pop } repeat
( ) search 4 2 roll pop pop pop
2 { (:) search pop exch pop cvi exch } repeat cvi
true
} {
false
} ifelse
} def
systemdict /Midnight currenttime GetHHMMSS pop
3 -1 roll 60 mul 3 -1 roll add exch 60 div add sub put
} if
/ClockWin DefaultWindow dictbegin
/TickProc null def
dictend classbegin
ColorDisplay? {
/FrameFillColor ColorDict /Firebrick get def
} {
/FrameFillColor 0 def
/KeyFocusColor 1 def
} ifelse
/ClockShape { % X Y W H -> -
4 2 roll translate scale
newpath
DrawClock
DrawHands
} def
/ShapeFrameCanvas {
gsave
ParentCanvas setcanvas
FrameX FrameY FrameWidth FrameHeight ClockShape
FrameCanvas reshapecanvas
grestore
} def
/PaintFrame {
FrameFillColor fillcanvas
} def
/ShapeIconCanvas {
gsave
ParentCanvas setcanvas
0 0 IconWidth IconHeight ClockShape
IconCanvas reshapecanvas
grestore
} def
/PaintIcon {
IconBorderColor fillcanvas
} def
/PaintFocus {
gsave FrameCanvas setcanvas .5 .5 translate
KeyFocus? { KeyFocusColor } { FrameFillColor } ifelse setshade
0 0 .5 0 360 arc 0 0 .49 360 0 arcn fill
grestore
} def
/CreateClientCanvas nullproc def
/DrawHand { % deg lng wid -> -
matrix currentmatrix 4 1 roll .5 .5 translate 3 -1 roll rotate 2 div
dup neg dup moveto 0 1 index -.5 mul lineto
dup neg lineto 0 exch lineto closepath
setmatrix
} def
/DrawClock {
matrix currentmatrix .5 .5 translate
12 { -30 rotate
0 0 .45 117 93 arcn 0 .40 lineto
} repeat
closepath
0 0 .5 0 360 arc
setmatrix
} def
/DrawHands {
currenttime Midnight sub cvi
dup 3600 mod 60 div -30 mul .28 .10 DrawHand
60 mod -6 mul .40 .08 DrawHand
} def
/TimerLoop {
createevent dup begin
/Name /Timer def
/Action /Tick def
end dup expressinterest
createevent copy dup begin
/TimeStamp currenttime dup Midnight sub dup cvi sub 1 exch sub add def
end sendevent
{
awaitevent dup begin
/TimeStamp TimeStamp 1 add def
end sendevent
ShapeFrameCanvas
} loop
} def
/on-off { % bool -> -
{
TickProc null eq {
/TickProc { TimerLoop } fork def
} if
} {
TickProc null ne {
TickProc killprocess
/TickProc null def
} if
} ifelse
} def
classend def
{ reshapefromuser map true on-off } framebuffer /new ClockWin send send