|
|
1.1 root 1: /* w_date.c
2: *
3: * Micropolis, Unix Version. This game was released for the Unix platform
4: * in or about 1990 and has been modified for inclusion in the One Laptop
5: * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If
6: * you need assistance with this program, you may contact:
7: * http://wiki.laptop.org/go/Micropolis or email [email protected].
8: *
9: * This program is free software: you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation, either version 3 of the License, or (at
12: * your option) any later version.
13: *
14: * This program is distributed in the hope that it will be useful, but
15: * WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17: * General Public License for more details. You should have received a
18: * copy of the GNU General Public License along with this program. If
19: * not, see <http://www.gnu.org/licenses/>.
20: *
21: * ADDITIONAL TERMS per GNU GPL Section 7
22: *
23: * No trademark or publicity rights are granted. This license does NOT
24: * give you any right, title or interest in the trademark SimCity or any
25: * other Electronic Arts trademark. You may not distribute any
26: * modification of this program using the trademark SimCity or claim any
27: * affliation or association with Electronic Arts Inc. or its employees.
28: *
29: * Any propagation or conveyance of this program must include this
30: * copyright notice and these terms.
31: *
32: * If you convey this program (or any modifications of it) and assume
33: * contractual liability for the program to recipients of it, you agree
34: * to indemnify Electronic Arts for any liability that those contractual
35: * assumptions impose on Electronic Arts.
36: *
37: * You may not misrepresent the origins of this program; modified
38: * versions of the program must be marked as such and not identified as
39: * the original program.
40: *
41: * This disclaimer supplements the one included in the General Public
42: * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
43: * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
44: * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF
45: * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS
46: * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
47: * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
48: * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
49: * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
50: * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST
51: * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
52: * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
53: * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
54: * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
55: * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
56: * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME
57: * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
58: * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
59: * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
60: * NOT APPLY TO YOU.
61: */
62: #include "sim.h"
63:
64:
65: short NewDate = 0;
66: Tcl_HashTable DateCmds;
67: int DateUpdateTime = 200;
68:
69:
70: #define DEF_DATE_FONT "-Adobe-Helvetica-Bold-R-Normal-*-140-*"
71: #define DEF_DATE_BG_COLOR "#b0b0b0"
72: #define DEF_DATE_BG_MONO "#ffffff"
73: #define DEF_DATE_BORDER_WIDTH "2"
74: #define DEF_DATE_PADY "1"
75: #define DEF_DATE_PADX "1"
76: #define DEF_DATE_WIDTH "0"
77: #define DEF_DATE_MONTHTAB "7"
78: #define DEF_DATE_YEARTAB "13"
79:
80: Tk_ConfigSpec DateConfigSpecs[] = {
81: {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
82: DEF_DATE_FONT, Tk_Offset(SimDate, fontPtr), 0},
83: {TK_CONFIG_BORDER, "-background", "background", "Background",
84: DEF_DATE_BG_COLOR, Tk_Offset(SimDate, border),
85: TK_CONFIG_COLOR_ONLY},
86: {TK_CONFIG_BORDER, "-background", "background", "Background",
87: DEF_DATE_BG_MONO, Tk_Offset(SimDate, border),
88: TK_CONFIG_MONO_ONLY},
89: {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
90: DEF_DATE_BORDER_WIDTH, Tk_Offset(SimDate, borderWidth), 0},
91: {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
92: DEF_DATE_PADX, Tk_Offset(SimDate, padX), 0},
93: {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
94: DEF_DATE_PADY, Tk_Offset(SimDate, padY), 0},
95: {TK_CONFIG_INT, "-width", "width", "Width",
96: DEF_DATE_WIDTH, Tk_Offset(SimDate, width), 0},
97: {TK_CONFIG_INT, "-monthtab", "monthtab", "MonthTab",
98: DEF_DATE_MONTHTAB, Tk_Offset(SimDate, monthTab), 0},
99: {TK_CONFIG_INT, "-yeartab", "yeartab", "YearTab",
100: DEF_DATE_YEARTAB, Tk_Offset(SimDate, yearTab), 0},
101: {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
102: (char *) NULL, 0, 0}
103: };
104:
105:
106: XDisplay *FindXDisplay();
107:
108:
109: static void
110: DisplaySimDate(ClientData clientData)
111: {
112: SimDate *date = (SimDate *) clientData;
113: Tk_Window tkwin = date->tkwin;
114: Pixmap pm = None;
115: Drawable d;
116:
117: date->flags &= ~VIEW_REDRAW_PENDING;
118: //fprintf(stderr, "DisplaySimDate cleared VIEW_REDRAW_PENDING\n");
119:
120: assert(date->draw_date_token != 0);
121: if (date->draw_date_token != 0) {
122: // Tk_DeleteTimerHandler(date->draw_date_token);
123: date->draw_date_token = 0;
124: }
125:
126: if (date->visible && (tkwin != NULL) && Tk_IsMapped(tkwin)) {
127: DoUpdateDate(date);
128: }
129: }
130:
131:
132: void
133: DestroySimDate(ClientData clientData)
134: {
135: SimDate *date = (SimDate *) clientData;
136:
137: DestroyDate(date);
138: }
139:
140:
141: EventuallyRedrawDate(SimDate *date)
142: {
143: if (!(date->flags & VIEW_REDRAW_PENDING)) {
144: assert(date->draw_date_token == 0);
145: if (date->draw_date_token == 0) {
146: date->draw_date_token =
147: Tk_CreateTimerHandler(
148: DateUpdateTime,
149: DisplaySimDate,
150: (ClientData) date);
151: date->flags |= VIEW_REDRAW_PENDING;
152: //fprintf(stderr, "EventuallyRedrawDate set VIEW_REDRAW_PENDING\n");
153: }
154: }
155: }
156:
157:
158: void
159: SimDateEventProc(ClientData clientData, XEvent *eventPtr)
160: {
161: SimDate *date = (SimDate *) clientData;
162:
163: if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
164: date->visible = 1;
165: EventuallyRedrawDate(date);
166: } else if (eventPtr->type == MapNotify) {
167: date->visible = 1;
168: } else if (eventPtr->type == UnmapNotify) {
169: date->visible = 0;
170: } else if (eventPtr->type == VisibilityNotify) {
171: if (eventPtr->xvisibility.state == VisibilityFullyObscured)
172: date->visible = 0;
173: else
174: date->visible = 1;
175: } else if (eventPtr->type == ConfigureNotify) {
176: DoResizeDate(date,
177: eventPtr->xconfigure.width,
178: eventPtr->xconfigure.height);
179: EventuallyRedrawDate(date);
180: } else if (eventPtr->type == DestroyNotify) {
181: Tcl_DeleteCommand(date->interp, Tk_PathName(date->tkwin));
182: date->tkwin = NULL;
183: if (date->flags & VIEW_REDRAW_PENDING) {
184: assert(date->draw_date_token != 0);
185: if (date->draw_date_token != 0) {
186: Tk_DeleteTimerHandler(date->draw_date_token);
187: date->draw_date_token = 0;
188: }
189: date->flags &= ~VIEW_REDRAW_PENDING;
190: //fprintf(stderr, "SimDateEventProc cleared VIEW_REDRAW_PENDING\n");
191: }
192: Tk_EventuallyFree((ClientData) date, DestroySimDate);
193: }
194: }
195:
196:
197: static void
198: ComputeDateGeometry(SimDate *date)
199: {
200: XCharStruct bbox;
201: int dummy;
202: unsigned int width, height;
203: int charWidth;
204:
205: XTextExtents(date->fontPtr, "0", 1,
206: &dummy, &dummy, &dummy, &bbox);
207: charWidth = (bbox.lbearing + bbox.rbearing);
208:
209: if (date->width == 0) {
210: char *maxString = "Date: MMM 1000000";
211: int maxStringLength = strlen(maxString);
212:
213: XTextExtents(date->fontPtr, maxString, maxStringLength,
214: &dummy, &dummy, &dummy, &bbox);
215: width = bbox.lbearing + bbox.rbearing;
216: } else {
217: width = date->width * charWidth;
218: }
219:
220: height = date->fontPtr->ascent + date->fontPtr->descent;
221:
222: width += 2 * date->padX;
223: height += 2 * date->padY;
224:
225: Tk_GeometryRequest(
226: date->tkwin,
227: (int) (width + (2 * date->borderWidth) + 2),
228: (int) (height + (2 * date->borderWidth) + 2));
229: Tk_SetInternalBorder(
230: date->tkwin,
231: date->borderWidth);
232:
233: date->yearTabX = date->yearTab * charWidth;
234: date->monthTabX = date->monthTab * charWidth;
235: }
236:
237:
238: int DateCmdconfigure(DATE_ARGS)
239: {
240: int result = TCL_OK;
241:
242: if (argc == 2) {
243: result = Tk_ConfigureInfo(interp, date->tkwin, DateConfigSpecs,
244: (char *) date, (char *) NULL, 0);
245: } else if (argc == 3) {
246: result = Tk_ConfigureInfo(interp, date->tkwin, DateConfigSpecs,
247: (char *) date, argv[2], 0);
248: } else {
249: result = ConfigureSimDate(interp, date, argc-2, argv+2,
250: TK_CONFIG_ARGV_ONLY);
251: }
252: return TCL_OK;
253: }
254:
255:
256: int DateCmdposition(DATE_ARGS)
257: {
258: int result = TCL_OK;
259:
260: if ((argc != 2) && (argc != 4)) {
261: return TCL_ERROR;
262: }
263: if (argc == 4) {
264: if ((Tcl_GetInt(interp, argv[2], &date->w_x) != TCL_OK)
265: || (Tcl_GetInt(interp, argv[3], &date->w_y) != TCL_OK)) {
266: return TCL_ERROR;
267: }
268: }
269: sprintf(interp->result, "%d %d", date->w_x, date->w_y);
270: return TCL_OK;
271: }
272:
273:
274: int DateCmdsize(DATE_ARGS)
275: {
276: if ((argc != 2) && (argc != 4)) {
277: return TCL_ERROR;
278: }
279: if (argc == 4) {
280: int w, h;
281:
282: if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
283: return TCL_ERROR;
284: }
285: if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
286: return TCL_ERROR;
287: }
288: date->w_width = w;
289: date->w_height = h;
290: }
291: sprintf(interp->result, "%d %d", date->w_width, date->w_height);
292: return TCL_OK;
293: }
294:
295:
296: int DateCmdVisible(DATE_ARGS)
297: {
298: int visible;
299:
300: if ((argc != 2) && (argc != 3)) {
301: Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
302: return TCL_ERROR;
303: }
304:
305: if (argc == 3) {
306: if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
307: (visible < 0) || (visible > 1)) {
308: Tcl_AppendResult(interp, " bogus args", (char *) NULL);
309: return TCL_ERROR;
310: }
311:
312: date->visible = visible;
313: }
314:
315: sprintf(interp->result, "%d", date->visible);
316:
317: return TCL_OK;
318: }
319:
320:
321: int DateCmdReset(DATE_ARGS)
322: {
323: int range;
324:
325: if (argc != 2) {
326: Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
327: return TCL_ERROR;
328: }
329:
330: date->reset = 1;
331:
332: // ComputeDateGeometry(date); // ???
333:
334: EventuallyRedrawDate(date);
335:
336: return TCL_OK;
337: }
338:
339:
340: int DateCmdSet(DATE_ARGS)
341: {
342: int range;
343:
344: if (argc != 4) {
345: Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
346: return TCL_ERROR;
347: }
348:
349: if ((Tcl_GetInt(interp, argv[2], &date->month) != TCL_OK) ||
350: (date->month < 0) ||
351: (date->month >= 12)) {
352: Tcl_AppendResult(interp, " bogus args", (char *) NULL);
353: return TCL_ERROR;
354: }
355:
356: if ((Tcl_GetInt(interp, argv[3], &date->year) != TCL_OK) ||
357: (date->year < 0)) {
358: Tcl_AppendResult(interp, " bogus args", (char *) NULL);
359: return TCL_ERROR;
360: }
361:
362: // ComputeDateGeometry(date); // ???
363:
364: EventuallyRedrawDate(date);
365:
366: return TCL_OK;
367: }
368:
369:
370: int
371: DoDateCmd(CLIENT_ARGS)
372: {
373: SimDate *date = (SimDate *) clientData;
374: Tcl_HashEntry *ent;
375: int result = TCL_OK;
376: int (*cmd)();
377:
378: if (argc < 2) {
379: return TCL_ERROR;
380: }
381:
382: if (ent = Tcl_FindHashEntry(&DateCmds, argv[1])) {
383: cmd = (int (*)())ent->clientData;
384: Tk_Preserve((ClientData) date);
385: result = cmd(date, interp, argc, argv);
386: Tk_Release((ClientData) date);
387: } else {
388: Tcl_AppendResult(interp, "unknown command name: \"",
389: argv[0], " ", argv[1], "\".", (char *) NULL);
390: result = TCL_ERROR;
391: }
392: return result;
393: }
394:
395:
396: int
397: DateViewCmd(CLIENT_ARGS)
398: {
399: SimDate *date;
400: Tk_Window tkwin = (Tk_Window) clientData;
401:
402: if (argc < 2) {
403: Tcl_AppendResult(interp, "wrong # args: should be \"",
404: argv[0], " pathName ?options?\"", (char *) NULL);
405: return TCL_ERROR;
406: }
407:
408: tkwin = Tk_CreateWindowFromPath(interp, tkwin,
409: argv[1], (char *) NULL);
410: if (tkwin == NULL) {
411: return TCL_ERROR;
412: }
413:
414: date = (SimDate *)ckalloc(sizeof (SimDate));
415:
416: date->tkwin = tkwin;
417: date->interp = interp;
418: date->flags = 0;
419: date->reset = 1;
420: date->month = 0;
421: date->year = 0;
422: date->lastmonth = 0;
423: date->lastyear = 0;
424:
425: Tk_SetClass(date->tkwin, "DateView");
426: Tk_CreateEventHandler(date->tkwin,
427: VisibilityChangeMask |
428: ExposureMask |
429: StructureNotifyMask,
430: SimDateEventProc, (ClientData) date);
431: Tcl_CreateCommand(interp, Tk_PathName(date->tkwin),
432: DoDateCmd, (ClientData) date, (void (*)()) NULL);
433:
434: /*
435: Tk_MakeWindowExist(date->tkwin);
436: */
437:
438: if (getenv("XSYNCHRONIZE") != NULL) {
439: XSynchronize(Tk_Display(tkwin), 1);
440: }
441:
442: InitNewDate(date);
443: DoNewDate(date);
444:
445: if (ConfigureSimDate(interp, date, argc-2, argv+2, 0) != TCL_OK) {
446: /* XXX: destroy date */
447: Tk_DestroyWindow(date->tkwin);
448: return TCL_ERROR;
449: }
450:
451: interp->result = Tk_PathName(date->tkwin);
452: return TCL_OK;
453: }
454:
455:
456: int
457: ConfigureSimDate(Tcl_Interp *interp, SimDate *date,
458: int argc, char **argv, int flags)
459: {
460: if (Tk_ConfigureWidget(interp, date->tkwin, DateConfigSpecs,
461: argc, argv, (char *) date, flags) != TCL_OK) {
462: return TCL_ERROR;
463: }
464:
465: Tk_SetBackgroundFromBorder(date->tkwin, date->border);
466:
467: ComputeDateGeometry(date);
468:
469: EventuallyRedrawDate(date);
470:
471: return TCL_OK;
472: }
473:
474:
475: date_command_init()
476: {
477: int new;
478:
479: Tcl_CreateCommand(tk_mainInterp, "dateview", DateViewCmd,
480: (ClientData)MainWindow, (void (*)()) NULL);
481:
482: Tcl_InitHashTable(&DateCmds, TCL_STRING_KEYS);
483:
484: #define DATE_CMD(name) HASHED_CMD(Date, name)
485:
486: DATE_CMD(configure);
487: DATE_CMD(position);
488: DATE_CMD(size);
489: DATE_CMD(Visible);
490: DATE_CMD(Reset);
491: DATE_CMD(Set);
492: }
493:
494:
495: InitNewDate(SimDate *date)
496: {
497: int d = 8;
498: struct XDisplay *xd;
499:
500: date->next = NULL;
501:
502: /* This stuff was initialized in our caller (DateCmd) */
503: /* date->tkwin = NULL; */
504: /* date->interp = NULL; */
505: /* date->flags = 0; */
506:
507: date->x = NULL;
508: date->visible = 0;
509: date->w_x = date->w_y = 0;
510: date->w_width = date->w_height = 0;
511: date->pixmap = None;
512: date->pixels = NULL;
513: date->fontPtr = NULL;
514: date->border = NULL;
515: date->borderWidth = 0;
516: date->padX = 0;
517: date->padY = 0;
518: date->width = 0;
519: date->monthTab = 0;
520: date->monthTabX = 0;
521: date->yearTab = 0;
522: date->yearTabX = 0;
523: date->draw_date_token = 0;
524: date->reset = 1;
525: date->year = 0;
526: date->month = 0;
527: date->lastyear = 0;
528: date->lastmonth = 0;
529:
530: date->x = FindXDisplay(date->tkwin);
531: IncRefDisplay(date->x);
532:
533: date->pixels = date->x->pixels;
534: date->fontPtr = NULL;
535:
536: DoResizeDate(date, 16, 16);
537: }
538:
539:
540: DestroyDate(SimDate *date)
541: {
542: SimDate **gp;
543:
544: for (gp = &sim->date;
545: (*gp) != NULL;
546: gp = &((*gp)->next)) {
547: if ((*gp) == date) {
548: (*gp) = date->next;
549: sim->dates--;
550: break;
551: }
552: }
553:
554: if (date->pixmap != None) {
555: XFreePixmap(date->x->dpy, date->pixmap);
556: date->pixmap = None;
557: }
558:
559: DecRefDisplay(date->x);
560:
561: ckfree((char *) date);
562: }
563:
564:
565: DoResizeDate(SimDate *date, int w, int h)
566: {
567: int resize = 0;
568:
569: date->w_width = w; date->w_height = h;
570:
571: if (date->pixmap != None) {
572: XFreePixmap(date->x->dpy, date->pixmap);
573: date->pixmap = None;
574: }
575: date->pixmap = XCreatePixmap(date->x->dpy, date->x->root,
576: w, h, date->x->depth);
577: if (date->pixmap == None) {
578: fprintf(stderr,
579: "Sorry, Micropolis can't create a pixmap on X display \"%s\".\n",
580: date->x->display);
581: sim_exit(1); // Just sets tkMustExit and ExitReturn
582: return;
583: }
584: }
585:
586:
587: DoNewDate(SimDate *date)
588: {
589: sim->dates++; date->next = sim->date; sim->date = date;
590:
591: NewDate = 1;
592: }
593:
594:
595: #define BORDER 1
596:
597: DoUpdateDate(SimDate *date)
598: {
599: Display *dpy;
600: GC gc;
601: Pixmap pm;
602: int *pix;
603: int w, h, i, j, x, y;
604: int tx, ty;
605: float sx, sy;
606:
607: if (!date->visible) {
608: return;
609: }
610:
611: dpy = date->x->dpy;
612: gc = date->x->gc;
613: pm = date->pixmap;
614: pix = date->pixels;
615:
616: w = date->w_width;
617: h = date->w_height;
618:
619: XSetFont(date->x->dpy, date->x->gc, date->fontPtr->fid);
620:
621: #if 0
622: if (date->x->color) {
623: XSetForeground(dpy, gc, pix[COLOR_LIGHTGRAY]);
624: } else {
625: XSetForeground(dpy, gc, pix[COLOR_WHITE]);
626: }
627: #else
628: XSetForeground(dpy, gc, Tk_3DBorderColor(date->border)->pixel);
629: #endif
630:
631: XFillRectangle(dpy, pm, gc, 0, 0, w, h);
632:
633: tx = BORDER; ty = BORDER;
634:
635: if ((w -= (2 * BORDER)) < 1) w = 1;
636: if ((h -= (2 * BORDER)) < 1) h = 1;
637:
638: x = date->borderWidth + date->padX + 1;
639: y = date->borderWidth + date->padY + date->fontPtr->ascent;
640:
641: if (date->reset) {
642: date->reset = 0;
643: date->lastyear = date->year;
644: date->lastmonth = date->month;
645: }
646:
647: {
648: char *dateString = "Date:";
649: char yearString[256];
650: int month = date->month;
651: int year = date->year;
652: int lastmonth = date->lastmonth;
653: int lastyear = date->lastyear;
654: int yearsPassed;
655: int monthsPassed;
656: yearsPassed =
657: (year - lastyear);
658: if (yearsPassed < 0) yearsPassed = 1;
659: if (yearsPassed > 9) yearsPassed = 9;
660: monthsPassed =
661: (month - lastmonth) +
662: (12 * yearsPassed);
663:
664: if (monthsPassed > 11) monthsPassed = 11;
665: if (monthsPassed == 1) monthsPassed = 0;
666: if (monthsPassed) {
667: int m = lastmonth;
668: int i;
669:
670: XSetForeground(dpy, gc, pix[COLOR_DARKGRAY]);
671:
672: for (i = 0; i < monthsPassed; i++) {
673:
674: XDrawString(date->x->dpy, pm, date->x->gc,
675: x + date->monthTabX, y,
676: dateStr[m],
677: strlen(dateStr[date->month]));
678:
679: m++;
680: if (m == 12) m = 0;
681: }
682:
683: if (year != lastyear) {
684: int yy = lastyear;
685: if ((year - yy) > 10) {
686: yy = year - 10;
687: }
688:
689: for (i = yy; i < year; i++) {
690: sprintf(
691: yearString,
692: "%d",
693: i);
694:
695: XDrawString(date->x->dpy, pm, date->x->gc,
696: x + date->yearTabX, y,
697: yearString,
698: strlen(yearString));
699: }
700: }
701:
702: EventuallyRedrawDate(date);
703: }
704:
705: date->lastmonth = month;
706: date->lastyear = year;
707:
708: XSetForeground(dpy, gc, pix[COLOR_BLACK]);
709:
710: XDrawString(date->x->dpy, pm, date->x->gc,
711: x, y,
712: dateString,
713: strlen(dateString));
714:
715: XDrawString(date->x->dpy, pm, date->x->gc,
716: x + date->monthTabX, y,
717: dateStr[date->month],
718: strlen(dateStr[date->month]));
719:
720: sprintf(
721: yearString,
722: "%d",
723: year);
724:
725: XDrawString(date->x->dpy, pm, date->x->gc,
726: x + date->yearTabX, y,
727: yearString,
728: strlen(yearString));
729: }
730:
731: XCopyArea(date->x->dpy, date->pixmap,
732: Tk_WindowId(date->tkwin), date->x->gc,
733: 0, 0, date->w_width, date->w_height, 0, 0);
734: }
735:
736:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.