/* $Id: win.c,v 1.9 2002/03/02 21:02:21 sverrehu Exp $ */ /************************************************************************** * * FILE win.c * MODULE OF Card game. * * WRITTEN BY Sverre H. Huseby * **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "game.h" #include "score.h" #include "board.h" #include "options.h" #include "about.h" #include "highscores.h" #include "readme.h" #include "win.h" /* undo capabilities are not yet written. */ #undef UNDO /* put menu buttons at bottom instead of at top? */ #define BUTTONS_AT_BOTTOM /************************************************************************** * * * P R I V A T E D A T A * * * **************************************************************************/ #define SCORE_STAT_DELAY 30000 #ifdef UNDO static Widget undoWidget; #endif static XtIntervalId timerId; static XtIntervalId scoreTimerId; static int timerRunning = 0; /************************************************************************** * * * P U B L I C D A T A * * * **************************************************************************/ Display *winDisplay; XtAppContext winAppContext; Widget winTopLevel; Widget winMainWindow; Widget boardWidget; Widget timeWidget; Widget aboutButton; Widget highscoresButton; Widget readmeButton; /************************************************************************** * * * P R I V A T E F U N C T I O N S * * * **************************************************************************/ static void winGetAndHandleEvent(void) { XEvent e; XtAppNextEvent(winAppContext, &e); if (e.xany.window == boardWin) boardHandleEvent(&e); else if (e.xany.window == boardPopup) boardHandlePopupEvent(&e); else XtDispatchEvent(&e); } static void callbackQuit(Widget w, XtPointer clientData, XtPointer callData) { gameExit = 1; } static void callbackNewGame(Widget w, XtPointer clientData, XtPointer callData) { gameFinishGame(); gameInitGame(); } static void callbackOptions(Widget w, XtPointer clientData, XtPointer callData) { optionsPopup(); } #ifdef UNDO static void callbackUndo(Widget w, XtPointer clientData, XtPointer callData) { } #endif static void timerProc(XtPointer foo, XtIntervalId *bar) { if (gameRunning && timerRunning) timerId = XtAppAddTimeOut(winAppContext, 1000, timerProc, 0); gameUpdateTime(); } static void scoreTimerProc(XtPointer foo, XtIntervalId *bar) { scoreTimerId = XtAppAddTimeOut(winAppContext, SCORE_STAT_DELAY, scoreTimerProc, 0); scoreStatHighscoreFile(); } static void callbackAbout(Widget w, XtPointer clientData, XtPointer callData) { aboutPopup(); } static void callbackHighscores(Widget w, XtPointer clientData, XtPointer callData) { highscoresPopup(); } static void callbackReadme(Widget w, XtPointer clientData, XtPointer callData) { readmePopup(); } /************************************************************************** * * * P U B L I C F U N C T I O N S * * * **************************************************************************/ void winParseOptions(int *argc, char *argv[]) { static String resources[] = { "*board.background: " BOARD_BACKGROUND_COLOR, "*board.foreground: magenta", "*font: 9x15bold", "*copyright*font: 6x10", "*status*font: 6x10", "*highscores*font: 6x10", "*readme*font: 6x10", NULL }; winTopLevel = XtVaAppInitialize(&winAppContext, "Sol", NULL, 0, argc, argv, resources, NULL); winDisplay = XtDisplay(winTopLevel); } void winInit(void) { Widget quitWidget, newWidget, optWidget; optionsInit(winTopLevel); aboutInit(winTopLevel); highscoresInit(winTopLevel); readmeInit(winTopLevel); winMainWindow = XtVaCreateManagedWidget("mainWindow", formWidgetClass, winTopLevel, NULL); #ifdef BUTTONS_AT_BOTTOM /* otherwise, board is set up last. see below. */ boardWidget = XtVaCreateManagedWidget("board", coreWidgetClass, winMainWindow, XtNwidth, boardWidth, XtNheight, boardHeight, XtNborderWidth, 1, NULL); #endif quitWidget = XtVaCreateManagedWidget("quit", commandWidgetClass, winMainWindow, XtNlabel, "Quit", #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); newWidget = XtVaCreateManagedWidget("new", commandWidgetClass, winMainWindow, XtNlabel, "New game", XtNfromHoriz, quitWidget, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); optWidget = XtVaCreateManagedWidget("options", commandWidgetClass, winMainWindow, XtNlabel, "Options", XtNfromHoriz, newWidget, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); #ifdef UNDO undoWidget = XtVaCreateManagedWidget("undo", commandWidgetClass, winMainWindow, XtNlabel, "Undo", XtNsensitive, 0, XtNfromHoriz, optWidget, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); #endif highscoresButton = XtVaCreateManagedWidget("highscoresButton", commandWidgetClass, winMainWindow, XtNlabel, "Highscores", #ifdef UNDO XtNfromHoriz, undoWidget, #else XtNfromHoriz, optWidget, #endif #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); aboutButton = XtVaCreateManagedWidget("aboutButton", commandWidgetClass, winMainWindow, XtNlabel, "About", XtNfromHoriz, highscoresButton, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); readmeButton = XtVaCreateManagedWidget("readmeButton", commandWidgetClass, winMainWindow, XtNlabel, "Help", XtNfromHoriz, aboutButton, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); timeWidget = XtVaCreateManagedWidget("time", labelWidgetClass, winMainWindow, XtNlabel, "Time: 0:00", XtNfromHoriz, readmeButton, XtNsensitive, 0, #ifdef BUTTONS_AT_BOTTOM XtNfromVert, boardWidget, #endif NULL); #ifndef BUTTONS_AT_BOTTOM /* otherwise, board is set up first. see above. */ boardWidget = XtVaCreateManagedWidget("board", coreWidgetClass, winMainWindow, XtNwidth, boardWidth, XtNheight, boardHeight, XtNfromVert, quitWidget, XtNborderWidth, 1, NULL); #endif XtAddCallback(quitWidget, XtNcallback, callbackQuit, 0); XtAddCallback(newWidget, XtNcallback, callbackNewGame, 0); XtAddCallback(optWidget, XtNcallback, callbackOptions, 0); #ifdef UNDO XtAddCallback(undoWidget, XtNcallback, callbackUndo, 0); #endif XtAddCallback(aboutButton, XtNcallback, callbackAbout, 0); XtAddCallback(highscoresButton, XtNcallback, callbackHighscores, 0); XtAddCallback(readmeButton, XtNcallback, callbackReadme, 0); XtRealizeWidget(winTopLevel); boardWin = XtWindowOfObject(boardWidget); scoreTimerId = XtAppAddTimeOut(winAppContext, SCORE_STAT_DELAY, scoreTimerProc, 0); } void winFinish(void) { readmeFinish(); highscoresFinish(); aboutFinish(); optionsFinish(); } void winInitGame(void) { if (gameDoTiming) XtSetSensitive(timeWidget, 1); winShowTime(); XtRemoveTimeOut(scoreTimerId); scoreTimerId = XtAppAddTimeOut(winAppContext, SCORE_STAT_DELAY, scoreTimerProc, 0); } void winFinishGame(void) { if (timerRunning) { XtRemoveTimeOut(timerId); timerRunning = 0; } #ifdef UNDO XtSetSensitive(undoWidget, 0); #endif XtSetSensitive(timeWidget, 0); } void winMainLoop(void) { while (!gameExit) winGetAndHandleEvent(); } void winFlush(void) { XFlush(winDisplay); } void winShowTime(void) { char text[40]; if (!gameDoTiming) return; sprintf(text, "Time: %6.6s", gameTimeToStr(gameTime)); XtVaSetValues(timeWidget, XtNlabel, text, NULL); winFlush(); } void winStartTiming(void) { if (timerRunning) return; timerId = XtAppAddTimeOut(winAppContext, 1000, timerProc, 0); timerRunning = 1; }