|
|
1.1 root 1: #include <jerq.h>
2: #undef min
3: short stip_bits[]={
4: 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444,
5: 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444,
6: };
7: Texture stip;
8:
9: #define atoi2(p) ((*(p)-'0')*10 + *((p)+1)-'0')
10: #define itoa2(n, s) { (*(s) = (n)/10 + '0'); (*((s)+1) = n % 10 + '0'); }
11: #define NOALARM "no alarm"
12: Point ctr, p, cur;
13: int dx, dy;
14: int h, m, s; /* hour, min, sec */
15: int rh, rm, rs; /* radius of ... */
16: int ah, am, as; /* angle */
17: int rad;
18: int olds;
19: char alarmstr[10] = NOALARM;
20: char alarmlen;
21: int alarmset;
22:
23: main(argc, argv)
24: char *argv[];
25: {
26: char date[40], *p;
27: register long oldtime, newtime;
28: int stat, c, ds;
29: int first = 1;
30:
31: request(KBD|ALARM);
32: initdisplay(argc,argv);
33: stip = ToTexture(stip_bits);
34: rectf(&display, Drect, F_XOR);
35: if(argc!=2){
36: string(&defont,"Usage: clock \"`date`\"",
37: &display,Drect.origin,F_XOR);
38: sleep(600);
39: exit();
40: }
41: initface();
42: strcpy(date, argv[1]);
43: h = atoi2(date+11);
44: m = atoi2(date+14);
45: s = atoi2(date+17);
46:
47: oldtime=realtime();
48: for ( ds = 0;; ) {
49: while ((newtime = realtime()) <= oldtime) {
50: if(own()&(KBD|ALARM))
51: checkalarm();
52: sleep(60);
53: }
54: ds += newtime-oldtime;
55: oldtime=newtime;
56: s += ds / 60;
57: ds %= 60;
58: if (olds == s)
59: continue;
60: while (s >= 60) {
61: s -= 60;
62: m++;
63: }
64: olds = s;
65: while (m >= 60) {
66: m -= 60;
67: h++;
68: if (h >= 24)
69: h = 0;
70: }
71:
72: if (!first) { /* zap previous rays */
73: ray(rs, as);
74: if (am != as)
75: ray(rm, am);
76: if (ah != am && ah != as)
77: ray(rh, ah);
78: }
79: ah = (30 * (h%12) + 30 * m / 60);
80: am = 6 * m;
81: as = 6 * s;
82:
83: if (P->state & RESHAPED) {
84: initface();
85: first=1;
86: P->state &= ~RESHAPED;
87: }
88: if (!first)
89: string(&defont,date,&display,Drect.origin,F_XOR);
90: sprintf(date, "00:00:00");
91: itoa2(h, date);
92: itoa2(m, date+3);
93: itoa2(s, date+6);
94: string(&defont,date,&display,Drect.origin,first?F_STORE:F_XOR);
95: first = 0;
96: ray(rs, as); /* longest */
97: if (am != as)
98: ray(rm, am);
99: if (ah != as && ah != am)
100: ray(rh, ah);
101: }
102: }
103:
104: initface() /* set up clock circle in window */
105: {
106: rectf(&display, Drect, F_CLR);
107: texture(&display, display.rect, &stip, F_STORE);
108: ctr.x = (Drect.corner.x + Drect.origin.x) / 2;
109: ctr.y = (Drect.corner.y + Drect.origin.y) / 2;
110: rad = Drect.corner.x - Drect.origin.x;
111: if (rad > Drect.corner.y - Drect.origin.y)
112: rad = Drect.corner.y - Drect.origin.y;
113: rad = rad/2 - 2;
114: rh = 6 * rad / 10;
115: rm = 9 * rad / 10;
116: rs = rad - 1;
117: circle(&display, ctr, rad, F_XOR);
118: /*****
119: circle(&display, ctr, rad-1, F_XOR);
120: ***/
121: disc(&display, ctr, rad, F_STORE);
122: string(&defont,alarmstr,&display,
123: Pt(Drect.origin.x,Drect.corner.y-fontheight(&defont)),F_STORE);
124: }
125:
126: ray(r, ang) /* draw ray r at angle ang */
127: int r, ang;
128: {
129: int dx, dy;
130:
131: dx = muldiv(r, sin(ang), 1024);
132: dy = muldiv(-r, cos(ang), 1024);
133: segment(&display, ctr, add(ctr, Pt(dx,dy)), F_XOR);
134: }
135:
136: checkalarm()
137: {
138: int c;
139: if(alarmset && (own()&ALARM)) {
140: ringbell();
141: if(--alarmset<=0)
142: noalarm();
143: }
144: if(own()&KBD) {
145: while((c=kbdchar())!=-1) {
146: if(c=='\r')
147: alarmlen = 0;
148: else if(c=='\b') {
149: if(alarmlen>0) {
150: alarmstring();
151: alarmstr[--alarmlen] = 0;
152: alarmstring();
153: }
154: } else if(alarmlen<8 && (c==':'||c>='0'&&c<='9')) {
155: alarmstring();
156: alarmstr[alarmlen++] = c;
157: alarmstr[alarmlen] = 0;
158: alarmstring();
159: }
160: }
161: setalarm();
162: }
163: }
164:
165: setalarm()
166: {
167: extern char *strchr();
168: char *p = alarmstr;
169: int hr = atoi(p);
170: int min = 0;
171: int sec = 0;
172: int dt;
173: if((p=strchr(p,':'))!=0)
174: min = atoi(++p);
175: if(p && (p=strchr(p,':'))!=0)
176: sec = atoi(++p);
177: dt = sec-s + 60*(min-m + 60*(hr-h));
178: while(dt<0)
179: dt += 24*60*60;
180: alarm(dt*60);
181: alarmset = 10;
182: }
183:
184: noalarm()
185: {
186: alarmset = alarmlen = 0;
187: P->state &= ~ALARM;
188: alarmstring();
189: strcpy(alarmstr, NOALARM);
190: alarmstring();
191: }
192:
193: alarmstring()
194: {
195: string(&defont,alarmstr,&display,
196: Pt(Drect.origin.x,Drect.corner.y-fontheight(&defont)),F_XOR);
197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.