/* $Id: options.c,v 1.3 2002/03/02 21:02:21 sverrehu Exp $ */ /************************************************************************** * * FILE options.c * MODULE OF Card game. * * WRITTEN BY Sverre H. Huseby * **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "win.h" #include "board.h" #include "game.h" #include "options.h" /************************************************************************** * * * P R I V A T E D A T A * * * **************************************************************************/ static Widget optionsWidget, optionsParent, bgWidget, bgPrev, bgNext; static Widget tglHighscore, tglTiming, tglDraw1, tglDraw3; static int bgPicNum; static int isPoppedUp = 0; /************************************************************************** * * * P R I V A T E F U N C T I O N S * * * **************************************************************************/ static void tglSetState(Widget w, int state) { XtVaSetValues(w, XtNstate, state, NULL); } static int tglGetState(Widget w) { Boolean state; XtVaGetValues(w, XtNstate, &state, NULL); return state; } static void popDown(void) { XtPopdown(optionsWidget); isPoppedUp = 0; winFlush(); } static void callbackOk(Widget w, XtPointer clientData, XtPointer callData) { int q, tmp, newGame = 0; tmp = tglGetState(tglDraw1) ? 1 : 3; if (tmp != gameNumCardsToDraw) { gameNumCardsToDraw = tmp; newGame = 1; } tmp = tglGetState(tglTiming); if (tmp != gameDoTiming) { gameDoTiming = tmp; newGame = 1; /* no cheating! */ } gameIncludeInHighscoreList = tglGetState(tglHighscore); if (bgPicNum != boardCardBackground) { boardCardBackground = bgPicNum; for (q = 0; q < NUM_PILES; q++) boardUpdatePileCache(pile[q]); XClearArea(winDisplay, boardWin, 0, 0, 0, 0, 1); } popDown(); if (newGame) { gameFinishGame(); gameInitGame(); } } static void callbackCancel(Widget w, XtPointer clientData, XtPointer callData) { popDown(); } static void callbackBack(Widget w, XtPointer clientData, XtPointer callData) { int update = 0; if (w == bgPrev) { if (bgPicNum > 0) { --bgPicNum; update = 1; XtSetSensitive(bgNext, 1); XtSetSensitive(bgPrev, (bgPicNum > 0)); } } else { if (bgPicNum < CARD_NUM_BACKS - 1) { ++bgPicNum; update = 1; XtSetSensitive(bgPrev, 1); XtSetSensitive(bgNext, (bgPicNum < CARD_NUM_BACKS - 1)); } } if (update) cardDraw(XtWindowOfObject(bgWidget), 0, 0, CARD_BACKGROUND, bgPicNum); } static void showCard(Widget w, XtPointer clientData, XEvent *evt, Boolean *cont) { cardDraw(XtWindowOfObject(w), 0, 0, CARD_BACKGROUND, bgPicNum); } /************************************************************************** * * * P U B L I C F U N C T I O N S * * * **************************************************************************/ void optionsInit(Widget parent) { Widget form, form2, ok, cancel, drawText, hsText, timingText; optionsParent = parent; optionsWidget = XtVaCreatePopupShell("optionsWindow", transientShellWidgetClass, parent, XtNtitle, "Sol Options", NULL); form = XtVaCreateManagedWidget("options", formWidgetClass, optionsWidget, NULL); form2 = XtVaCreateManagedWidget("options2", formWidgetClass, form, NULL); bgWidget = XtVaCreateManagedWidget("bgPix", coreWidgetClass, form2, XtNborderWidth, 0, XtNwidth, CARD_WIDTH, XtNheight, CARD_HEIGHT, NULL); bgPrev = XtVaCreateManagedWidget("prev", commandWidgetClass, form2, XtNlabel, "<-", XtNfromVert, bgWidget, NULL); bgNext = XtVaCreateManagedWidget("next", commandWidgetClass, form2, XtNlabel, "->", XtNfromVert, bgWidget, XtNfromHoriz, bgPrev, NULL); drawText = XtVaCreateManagedWidget("drawText", labelWidgetClass, form2, XtNlabel, "Number of cards to draw", XtNborderWidth, 0, XtNfromHoriz, bgWidget, NULL); tglDraw1 = XtVaCreateManagedWidget("draw1", toggleWidgetClass, form2, XtNlabel, "1", XtNfromHoriz, drawText, NULL); tglDraw3 = XtVaCreateManagedWidget("draw3", toggleWidgetClass, form2, XtNradioGroup, tglDraw1, XtNlabel, "3", XtNfromHoriz, tglDraw1, NULL); timingText = XtVaCreateManagedWidget("timintText", labelWidgetClass, form2, XtNlabel, "Timing", XtNborderWidth, 0, XtNfromVert, drawText, XtNfromHoriz, bgWidget, NULL); tglTiming = XtVaCreateManagedWidget("includeHighscore", toggleWidgetClass, form2, XtNlabel, " ", XtNfromHoriz, timingText, XtNfromVert, drawText, NULL); hsText = XtVaCreateManagedWidget("includeHighscoreText", labelWidgetClass, form2, XtNlabel, "Include in highscore list", XtNborderWidth, 0, XtNfromVert, timingText, XtNfromHoriz, bgWidget, NULL); tglHighscore = XtVaCreateManagedWidget("includeHighscore", toggleWidgetClass, form2, XtNlabel, " ", XtNfromHoriz, hsText, XtNfromVert, timingText, NULL); ok = XtVaCreateManagedWidget("ok", commandWidgetClass, form, XtNlabel, "OK", XtNfromVert, form2, NULL); cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, form, XtNlabel, "Cancel", XtNfromHoriz, ok, XtNfromVert, form2, NULL); XtAddCallback(ok, XtNcallback, callbackOk, 0); XtAddCallback(cancel, XtNcallback, callbackCancel, 0); XtAddEventHandler(bgWidget, ExposureMask, 0, showCard, NULL); XtAddCallback(bgPrev, XtNcallback, callbackBack, 0); XtAddCallback(bgNext, XtNcallback, callbackBack, 0); } void optionsFinish(void) { } void optionsPopup(void) { Dimension popWidth, popHeight, parWidth, parHeight; Position x, y; if (isPoppedUp) return; isPoppedUp = 1; /* initiate controls from state variables */ tglSetState(tglDraw1, (gameNumCardsToDraw == 1)); tglSetState(tglDraw3, (gameNumCardsToDraw == 3)); tglSetState(tglTiming, (gameDoTiming != 0)); tglSetState(tglHighscore, (gameIncludeInHighscoreList != 0)); bgPicNum = boardCardBackground; XtSetSensitive(bgPrev, (bgPicNum > 0)); XtSetSensitive(bgNext, (bgPicNum < CARD_NUM_BACKS - 1)); /* must temporarily realize the widget to be able to get it's size */ XtRealizeWidget(optionsWidget); XtUnrealizeWidget(optionsWidget); XtVaGetValues(optionsWidget, XtNwidth, &popWidth, XtNheight, &popHeight, NULL); XtVaGetValues(optionsParent, XtNwidth, &parWidth, XtNheight, &parHeight, NULL); XtTranslateCoords(optionsParent, (Position) (parWidth - popWidth) / 2, (Position) (parHeight - popHeight) / 2, &x, &y); XtVaSetValues(optionsWidget, XtNx, x, XtNy, y, NULL); XtPopup(optionsWidget, XtGrabExclusive); }