Annotation of micropolis/src/sim/w_date.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.