/* * clock.c - simple clock in a window Desk Accessory * * Note: When NOT_A_DA is defined the program is built as a true program, * but if optimising some unused assignments will be reported. */ #include #include #include #include "rclock.h" #include "rclock.c" #ifndef NOT_A_DA #include STACK(1024); // hopefully plenty #endif #define W_TYPE (NAME | MOVER | CLOSER) int new_window(OBJECT *tree, const char *title) { int wh; GRECT p; // compute required size for window given object tree wind_calc(WC_BORDER, W_TYPE, PTRS((GRECT *)&tree[ROOT].ob_x), &p.g_x, &p.g_y, &p.g_w, &p.g_h); wh = wind_create(W_TYPE, ELTS(p)); if (wh >= 0) { wind_title(wh, title); wind_open(wh, ELTS(p)); } return wh; } int redraw(int wh,GRECT *p) { objc_draw(rclock,ROOT,MAX_DEPTH,PTRS(p)); return 1; } #ifdef NOT_A_DA int #else void #endif main(void) { int id, wh = -1; GRECT full; id = appl_init(); rsrc_init(); wind_get(DESK, WF_WXYWH, &full.g_x, &full.g_y, &full.g_w, &full.g_h); rc_constrain(&full, (GRECT *)&rclock[ROOT].ob_x); #ifndef NOT_A_DA menu_register(id, clock_menu); // register as a DA #else wh = new_window(rclock, clock_title); #endif for (;;) { short msg[8], junk; int which; which = evnt_multi(MU_TIMER | MU_MESAG, 0, 0, 0, // mouses 0, 0, 0, 0, 0, // rectangle 1 0, 0, 0, 0, 0, // rectangle 2 msg, // message buffer 2000, 0, // respond every 2s &junk, &junk, &junk, &junk, &junk, &junk); if (which & MU_MESAG) switch (msg[0]) { #ifndef NOT_A_DA case AC_OPEN: if (wh < 0) wh = new_window(rclock, clock_title); else wind_set(wh, WF_TOP, wh); break; case AC_CLOSE: wh = -1; break; #endif case WM_TOPPED: wind_set(msg[3], WF_TOP, msg[3]); break; case WM_CLOSED: wind_close(wh); wind_delete(wh); wh = -1; break; case WM_REDRAW: wind_redraw(msg[3], (GRECT *)&msg[4], redraw); break; case WM_MOVED: wind_set(wh, WF_CXYWH, PTRS((GRECT *)&msg[4])); wind_calc(WC_WORK, W_TYPE, PTRS((GRECT *)&msg[4]), &rclock[ROOT].ob_x, &rclock[ROOT].ob_y, &rclock[ROOT].ob_width, &rclock[ROOT].ob_height); break; } if (which & MU_TIMER) { short top; wind_get(DESK, WF_TOP, &top, &junk, &junk, &junk); if (top == wh) { // may only safely call GEMDOS if on top time_t t; struct tm *tm; time(&t); tm = localtime(&t); sprintf(rclock[TIME].ob_spec,"%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); *(GRECT *)&msg[4] = *(GRECT *)&rclock[ROOT].ob_x; wind_redraw(msg[3], (GRECT *)&msg[4], redraw); } } #ifdef NOT_A_DA if (wh < 0) break; #endif } #ifdef NOT_A_DA appl_exit(); return 0; #endif }