Fix Duck Chess
[xboard.git] / winboard / jaws.c
index d5b5b27..b6e125b 100644 (file)
@@ -5,7 +5,8 @@
  * Massachusetts.\r
  *\r
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\r
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free\r
+ * Software Foundation, Inc.\r
  *\r
  * XBoard borrows its colors and the bitmaps.xchess bitmap set from XChess,\r
  * which was written and is copyrighted by Wayne Christopher.\r
@@ -85,40 +86,27 @@ extern long whiteTimeRemaining, blackTimeRemaining, timeControl, timeIncrement;
 \r
 // from moves.c, added WinBoard_F piece types and ranks / files\r
 \r
-char *squareToChar[] = { "ay", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" };\r
-\r
-char *squareToNum[] = {"naught", "1", "2", "3", "4", "5", "6", "7", "8", "9" };\r
-\r
-char *ordinals[] = {"zeroth", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth"};\r
-\r
-char *pieceToName[] = {\r
-               "White Pawn", "White Knight", "White Bishop", "White Rook", "White Queen",\r
-               "White Guard", "White Elephant", "White Arch Bishop", "White Chancellor",\r
-               "White General", "White Man", "White Cannon", "White Night Rider",\r
-               "White Crowned Bishop", "White Crowned Rook", "White Grass Hopper", "White Veteran",\r
-               "White Falcon", "White Amazon", "White Snake", "White Unicorn",\r
-               "White King",\r
-               "Black Pawn", "Black Knight", "Black Bishop", "Black Rook", "Black Queen",\r
-               "Black Guard", "Black Elephant", "Black Arch Bishop", "Black Chancellor",\r
-               "Black General", "Black Man", "Black Cannon", "Black Night Rider",\r
-               "Black Crowned Bishop", "Black Crowned Rook", "Black Grass Hopper", "Black Veteran",\r
-               "Black Falcon", "Black Amazon", "Black Snake", "Black Unicorn",\r
-               "Black King",\r
-               "Empty"\r
-       };\r
+char *squareToChar[] = { "ay", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t" };\r
+\r
+char *squareToNum[] = {"naught", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };\r
+\r
+char *ordinals[] = {"zeroth", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth", "tenth", "eleventh", "twelfth", "thriteenth", "fourteenth", "fifteenth", "sixteenth" };\r
 \r
 char *pieceTypeName[] = {\r
                "Pawn", "Knight", "Bishop", "Rook", "Queen",\r
                "Guard", "Elephant", "Arch Bishop", "Chancellor",\r
                "General", "Man", "Cannon", "Night Rider",\r
                "Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran",\r
-               "Falcon", "Amazon", "Snake", "Unicorn",\r
-               "King",\r
-               "Pawn", "Knight", "Bishop", "Rook", "Queen",\r
-               "Guard", "Elephant", "Arch Bishop", "Chancellor",\r
-               "General", "Man", "Cannon", "Night Rider",\r
-               "Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran",\r
-               "Falcon", "Amazon", "Snake", "Unicorn",\r
+               "Falcon", "Lance", "Snake", "Unicorn", "Lion",\r
+               "Sword", "Zebra", "Camel", "Tower", "Wolf",\r
+               "Hat", "Duck", "Amazon", "Dragon", "Wildebeest", "Lion",\r
+               "Shield", "Pegasus", "Wizard", "Champion", "Helmet",\r
+               "Viking", "Flag", "Axe", "Dolphin", "Leopard", "Tiger",\r
+               "Wheel", "Butterfly", "Promo Bishop", "Promo Rook",\r
+               "Sleeping Beauty", "Reverse Shield", "Prince", "Promo Queen",\r
+               "Promo Lion", "Drunk Elephant", "Reverse Wheel", \r
+               "Tokin", "Promo Knight", "Promo Horse", "Promo Dragon", "Promo Lance",\r
+               "Promo Silver", "Dagger", "Promo Sword", "Promo Dagger", "Princess",\r
                "King",\r
                "Empty"\r
        };\r
@@ -135,20 +123,24 @@ char* PieceToName(p, i)
        ChessSquare p;\r
        int i;\r
 {\r
-       if(i) return pieceToName[(int) p];\r
-               return pieceTypeName[(int) p];\r
+       static char buf[MSG_SIZ];\r
+        int black = (p >= BlackPawn);\r
+        if(black) p -= BlackPawn;\r
+        sprintf(buf, i ? black ? "Black " : "White " : "");\r
+        sprintf(buf + strlen(buf), "%s", pieceTypeName[(int) p]);\r
+               return T_(buf);\r
 }\r
 \r
 char* SquareToChar(x)\r
                        int x;\r
 {\r
-               return squareToChar[x - BOARD_LEFT];\r
+               return T_(squareToChar[x - BOARD_LEFT]);\r
 }\r
 \r
 char* SquareToNum(y)\r
                        int y;\r
 {\r
-               return squareToNum[y + (gameInfo.boardHeight < 10)];\r
+               return T_(squareToNum[y + (gameInfo.boardHeight != 10)]);\r
 }\r
 \r
 \r
@@ -166,7 +158,7 @@ VOID SayString(char *mess, BOOL flag)
         int l = strlen(buf);\r
        if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess);\r
         if(l) buf[l++] = ' '; // separate by space from previous\r
-       safeStrCpy(buf+l, _(mess), 8000-1-l); // buffer\r
+       safeStrCpy(buf+l, T_(mess), 8000-1-l); // buffer\r
         if(!flag) return; // wait for flush\r
        if(p = StrCaseStr(buf, "Xboard adjudication:")) {\r
                int i;\r
@@ -184,6 +176,7 @@ static int timeflag;
 static int suppressClocks = 0;\r
 static int suppressOneKey = 0;\r
 static HANDLE hAccelJAWS;\r
+extern int jawsClock;\r
 \r
 typedef struct { char *name; int code; } MenuItemDesc;\r
 \r
@@ -248,16 +241,43 @@ AdaptMenu()
        DrawMenuBar(hwndMain);\r
 }\r
 \r
+#ifdef NVDA\r
+\r
+#   define S2(X) #X\r
+#   define STRINGIFY(X) S2(X)\r
+#   include STRINGIFY(NVDA/nvdaController.h)\r
+\r
+    void\r
+    SayNVDA(char *text, BOOL interrupt)\r
+    {\r
+       static wchar_t buf[8000];\r
+        if(interrupt) nvdaController_cancelSpeech();\r
+       MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, buf, 8000);\r
+        nvdaController_speakText(buf);\r
+    }\r
+\r
+\r
+#   undef UNICODE\r
+\r
+#endif\r
+\r
 BOOL\r
 InitJAWS()\r
 {      // to be called at beginning of WinMain, after InitApplication and InitInstance\r
-       HINSTANCE hApi = LoadLibrary("jfwapi32.dll");\r
-       if(!hApi) {\r
+#ifdef NVDA\r
+       RealSayString = (PSAYSTRING) &SayNVDA; // assume NVDA\r
+       if(nvdaController_testIfRunning()) {   // no NVDA; try JAWS\r
+#else\r
+       {\r
+#endif\r
+           HINSTANCE hApi = LoadLibrary("jfwapi32.dll");\r
+           if(!hApi) { // no interface to JAWS either\r
                DisplayInformation("Missing jfwapi32.dll");\r
                return (FALSE);\r
+           }\r
+           RealSayString = (PSAYSTRING)GetProcAddress(hApi, "JFWSayString");\r
        }\r
 \r
-       RealSayString = (PSAYSTRING)GetProcAddress(hApi, "JFWSayString");\r
        if(!RealSayString) {\r
                DisplayInformation("SayString returned a null pointer");\r
                return (FALSE);\r
@@ -270,7 +290,7 @@ InitJAWS()
 \r
                AdaptMenu();\r
                menuBarText[0][8] = menuBarText[0][7]; menuBarText[0][7] = "&JAWS";\r
-               for(i=0; i<9; i++) menuBarText[1][i] = menuBarText[0][i];\r
+               for(i=0; i<9; i++) menuBarText[2][i] = menuBarText[1][i] = menuBarText[0][i];\r
        }\r
 \r
        hAccelJAWS = CreateAcceleratorTable(acceleratorsJAWS, 14);\r
@@ -303,6 +323,12 @@ KeyboardEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        if(fromX == -1 || fromY == -1) {\r
                fromX = BOARD_LEFT; fromY = 0;\r
         }\r
+       if(flipView) switch(wParam) {\r
+       case VK_LEFT:  wParam = VK_RIGHT; break;\r
+       case VK_RIGHT: wParam = VK_LEFT;  break;\r
+       case VK_UP:    wParam = VK_DOWN;  break;\r
+       case VK_DOWN:  wParam = VK_UP;    break;\r
+        }\r
        switch(wParam) {\r
        case VK_LEFT:\r
                if(fromX == BOARD_RGHT+1) fromX -= 2; else\r
@@ -442,7 +468,7 @@ PossibleAttackMove()
        swapColor = piece <  (int)BlackPawn && !WhiteOnMove(currentMove) ||\r
                    piece >= (int)BlackPawn &&  WhiteOnMove(currentMove);\r
        cl.count = 0; cl.rf = fromY; cl.ff = fromX; cl.rt = cl.ft = -1;\r
-       GenLegal(boards[currentMove], PosFlags(currentMove + swapColor), ReadCallback, (VOIDSTAR) &cl);\r
+       GenLegal(boards[currentMove], PosFlags(currentMove + swapColor), ReadCallback, (VOIDSTAR) &cl, EmptySquare);\r
        if(cl.count == 0) SayString("None", FALSE);\r
        SayString("", TRUE); // flush\r
        boards[currentMove][fromY][fromX] = victim; // repair\r
@@ -470,14 +496,14 @@ PossibleAttacked()
        victim = boards[currentMove][fromY][fromX]; // put dummy piece on target square, to activate Pawn captures\r
        boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen;\r
        cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1;\r
-       GenLegal(boards[currentMove], PosFlags(currentMove+1), ReadCallback, (VOIDSTAR) &cl);\r
+       GenLegal(boards[currentMove], PosFlags(currentMove+1), ReadCallback, (VOIDSTAR) &cl, EmptySquare);\r
        if(cl.count == 0) SayString("None", FALSE);\r
 \r
        SayString("You are defended by", FALSE);\r
 \r
        boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? BlackQueen : WhiteQueen;\r
        cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1;\r
-       GenLegal(boards[currentMove], PosFlags(currentMove), ReadCallback, (VOIDSTAR) &cl);\r
+       GenLegal(boards[currentMove], PosFlags(currentMove), ReadCallback, (VOIDSTAR) &cl, EmptySquare);\r
        if(cl.count == 0) SayString("None", FALSE);\r
        SayString("", TRUE); // flush\r
        boards[currentMove][fromY][fromX] = victim; // put back original occupant\r
@@ -544,20 +570,26 @@ ReadColumn()
        SayString("", TRUE); // flush\r
 }\r
 \r
+int\r
+OnBoard(int x, int y)\r
+{\r
+       return x >= BOARD_LEFT && x < BOARD_RGHT && y >= 0 && y < BOARD_HEIGHT;\r
+}\r
+\r
 VOID\r
 SayUpperDiagnols()\r
 {\r
        ChessSquare currentpiece;\r
        char *piece, *xchar, *ynum ;\r
-       int yPos, xPos;\r
+       int yPos, xPos, dir = (flipView ? -1 : 1);\r
 \r
        if(fromX < 0 || fromY < 0) return;\r
 \r
-       if(fromX < BOARD_RGHT-1 && fromY < BOARD_HEIGHT-1) {\r
+       if(OnBoard(fromX+dir, fromY+dir)) {\r
                SayString("The diagnol squares to your upper right contain", FALSE);\r
-               yPos = fromY+1;\r
-               xPos = fromX+1;\r
-               while(yPos<BOARD_HEIGHT && xPos<BOARD_RGHT) {\r
+               yPos = fromY+dir;\r
+               xPos = fromX+dir;\r
+               while(OnBoard(xPos, yPos)) {\r
                        currentpiece = boards[currentMove][yPos][xPos];\r
                        piece = PieceToName(currentpiece,1);\r
                        xchar = SquareToChar(xPos);\r
@@ -565,17 +597,17 @@ SayUpperDiagnols()
                        SayString(xchar , FALSE);\r
                        SayString(ynum, FALSE);\r
                        SayString(piece, FALSE);\r
-                       yPos++;\r
-                       xPos++;\r
+                       yPos+=dir;\r
+                       xPos+=dir;\r
                }\r
        }\r
        else SayString("There is no squares to your upper right", FALSE);\r
 \r
-       if(fromX > BOARD_LEFT && fromY < BOARD_HEIGHT-1) {\r
+       if(OnBoard(fromX-dir, fromY+dir)) {\r
                SayString("The diagnol squares to your upper left contain", FALSE);\r
-               yPos = fromY+1;\r
-               xPos = fromX-1;\r
-               while(yPos<BOARD_HEIGHT && xPos>=BOARD_LEFT) {\r
+               yPos = fromY+dir;\r
+               xPos = fromX-dir;\r
+               while(OnBoard(xPos, yPos)) {\r
                        currentpiece = boards[currentMove][yPos][xPos];\r
                        piece = PieceToName(currentpiece,1);\r
                        xchar = SquareToChar(xPos);\r
@@ -583,8 +615,8 @@ SayUpperDiagnols()
                        SayString(xchar , FALSE);\r
                        SayString(ynum, FALSE);\r
                        SayString(piece, FALSE);\r
-                       yPos++;\r
-                       xPos--;\r
+                       yPos+=dir;\r
+                       xPos-=dir;\r
                }\r
        }\r
        else SayString("There is no squares to your upper left", FALSE);\r
@@ -596,15 +628,15 @@ SayLowerDiagnols()
 {\r
        ChessSquare currentpiece;\r
        char *piece, *xchar, *ynum ;\r
-       int yPos, xPos;\r
+       int yPos, xPos, dir = (flipView ? -1 : 1);\r
 \r
        if(fromX < 0 || fromY < 0) return;\r
 \r
-       if(fromX < BOARD_RGHT-1 && fromY > 0) {\r
+       if(OnBoard(fromX+dir, fromY-dir)) {\r
                SayString("The diagnol squares to your lower right contain", FALSE);\r
-               yPos = fromY-1;\r
-               xPos = fromX+1;\r
-               while(yPos>=0 && xPos<BOARD_RGHT) {\r
+               yPos = fromY-dir;\r
+               xPos = fromX+dir;\r
+               while(OnBoard(xPos, yPos)) {\r
                        currentpiece = boards[currentMove][yPos][xPos];\r
                        piece = PieceToName(currentpiece,1);\r
                        xchar = SquareToChar(xPos);\r
@@ -612,17 +644,17 @@ SayLowerDiagnols()
                        SayString(xchar , FALSE);\r
                        SayString(ynum, FALSE);\r
                        SayString(piece, FALSE);\r
-                       yPos--;\r
-                       xPos++;\r
+                       yPos-=dir;\r
+                       xPos+=dir;\r
                }\r
        }\r
        else SayString("There is no squares to your lower right", FALSE);\r
 \r
-       if(fromX > BOARD_LEFT && fromY > 0) {\r
+       if(OnBoard(fromX-dir, fromY-dir)) {\r
                SayString("The diagnol squares to your lower left contain", FALSE);\r
-               yPos = fromY-1;\r
-               xPos = fromX-1;\r
-               while(yPos>=0 && xPos>=BOARD_LEFT) {\r
+               yPos = fromY-dir;\r
+               xPos = fromX-dir;\r
+               while(OnBoard(xPos, yPos)) {\r
                        currentpiece = boards[currentMove][yPos][xPos];\r
                        piece = PieceToName(currentpiece,1);\r
                        xchar = SquareToChar(xPos);\r
@@ -630,8 +662,8 @@ SayLowerDiagnols()
                        SayString(xchar , FALSE);\r
                        SayString(ynum, FALSE);\r
                        SayString(piece, FALSE);\r
-                       yPos--;\r
-                       xPos--;\r
+                       yPos-=dir;\r
+                       xPos-=dir;\r
                }\r
        }\r
        else SayString("There is no squares to your lower left", FALSE);\r
@@ -813,6 +845,36 @@ SayPieces(ChessSquare p)
 }\r
 \r
 VOID\r
+DelayedSpeak()\r
+{\r
+#ifdef NVDA\r
+       nvdaController_cancelSpeech();\r
+#endif\r
+       SayString("", TRUE);\r
+}\r
+\r
+VOID\r
+SayPieceType(char id)\r
+{\r
+       int f, r, nr = 0;\r
+       ChessSquare piece = CharToPiece(id);\r
+       if(piece == EmptySquare) {\r
+               SayString("That is not a valid piece", FALSE);\r
+       } else {\r
+           for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) {\r
+               if(boards[currentMove][r][f] != piece) continue;\r
+               if(!nr++) SayString(PieceToName(piece, 1), FALSE), SayString("on ", FALSE);\r
+               else SayString("and", FALSE);\r
+               SayString(SquareToChar(f), FALSE);\r
+               SayString(SquareToNum(r), FALSE);\r
+           }\r
+           if(!nr) SayString("There is no", FALSE), SayString(PieceToName(piece, 1), FALSE), SayString("on the board", FALSE);\r
+        }\r
+       ScheduleDelayedEvent(DelayedSpeak, 50); // immediate flush is interrupted by reading title bar parent window\r
+//     SayString("", TRUE); // flush\r
+}\r
+\r
+VOID\r
 SayCurrentPos()\r
 {\r
        ChessSquare currentpiece;\r
@@ -905,6 +967,7 @@ SayAllBoard()
                                    Xpos--;\r
                                }\r
                                SayString("empty", FALSE);\r
+\r
                        }\r
                }\r
        }\r
@@ -1087,15 +1150,21 @@ SayMachineMove(int evenIfDuplicate)
 }\r
 \r
 VOID\r
-SayClockTime()\r
+SayClockTime(int warning)\r
 {\r
        char buf1[50], buf2[50];\r
        char *str1, *str2;\r
        static long int lastWhiteTime, lastBlackTime;\r
 \r
-       suppressClocks = 1; // if user is using alt+T command, no reason to display them\r
+    if(!warning) {\r
+       suppressClocks = jawsClock = 1; // if user is using alt+T command, no reason to display them\r
        if(abs(lastWhiteTime - whiteTimeRemaining) < 1000 && abs(lastBlackTime - blackTimeRemaining) < 1000)\r
                suppressClocks = 0; // back on after two requests in rapid succession\r
+       else if(gameMode == EditGame || gameMode == BeginningOfGame) {\r
+               appData.clockMode = TRUE;\r
+               if(!pausing) StartClocks();\r
+       }\r
+    }\r
        snprintf(buf1, sizeof(buf1)/sizeof(buf1[0]),"%s", TimeString(whiteTimeRemaining));\r
        str1 = buf1;\r
        SayString("White clock", FALSE);\r
@@ -1106,6 +1175,7 @@ SayClockTime()
        SayString(str2, FALSE);\r
        lastWhiteTime = whiteTimeRemaining;\r
        lastBlackTime = blackTimeRemaining;\r
+       if(pausing) SayString("neither clock is running", FALSE);\r
        SayString("", TRUE); // flush\r
 }\r
 \r
@@ -1150,7 +1220,7 @@ KeyboardMove(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                        click-click move is possible */\r
                        char promoChoice = NULLCHAR;\r
 \r
-                       if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice)) {\r
+                       if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice, FALSE)) {\r
                                if (appData.alwaysPromoteToQueen) {\r
                                        UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q');\r
                                }\r
@@ -1208,12 +1278,32 @@ NiceTime(int x)
        return (x%3000 == 0);\r
 }\r
 \r
+VOID\r
+TimeWarning()\r
+{\r
+  int ta, t = (whiteTimeRemaining < blackTimeRemaining ? whiteTimeRemaining: blackTimeRemaining);\r
+  char *p = appData.alarmTimes;\r
+  static int last_t;\r
+  t = (t + 1000)/2000;\r
+  if(t > last_t) last_t = 0;\r
+  while((ta = atoi(p))) {\r
+    if(t == ta/2 && t != last_t) {\r
+      last_t = t;\r
+      if(sounds[(int)SoundAlarm].name[0] == NULLCHAR) SayString("time warning", FALSE), SayClockTime(1);\r
+      else PlayAlarmSound();\r
+    }\r
+    p = strchr(p, ','); if(p == NULL) break;\r
+    p++;\r
+  }\r
+}\r
+\r
 #define JAWS_ARGS \\r
   { "beepOffBoard", ArgInt, (LPVOID) beeps, TRUE, (ArgIniType) 1 },\\r
   { "beepEmpty", ArgInt, (LPVOID) (beeps+1), TRUE, (ArgIniType) 0 },\\r
   { "beepWhite", ArgInt, (LPVOID) (beeps+2), TRUE, (ArgIniType) 0 },\\r
   { "beepBlack", ArgInt, (LPVOID) (beeps+3), TRUE, (ArgIniType) 0 },\\r
   { "beepHoldings", ArgInt, (LPVOID) (beeps+4), TRUE, (ArgIniType) 0 },\\r
+  { "alarmTimes", ArgString, (LPVOID) &appData.alarmTimes, TRUE, (ArgIniType) "" },\\r
 \r
 #define JAWS_ALT_INTERCEPT \\r
            if(suppressOneKey) {\\r
@@ -1240,9 +1330,8 @@ NiceTime(int x)
       }\\r
       return 0;\\r
 \r
-#define JAWS_KB_NAVIGATION \\r
+#define JAWS_KBDOWN_NAVIGATION \\r
 \\r
-       case WM_KEYDOWN:\\r
 \\r
                if(GetKeyState(VK_MENU) < 0 && GetKeyState(VK_CONTROL) < 0) {\\r
                    /* Control + Alt + letter used for speaking piece positions */\\r
@@ -1279,14 +1368,13 @@ NiceTime(int x)
                        KeyboardMove(hwnd, message, wParam, lParam);\\r
                        break;\\r
                }\\r
-               break;\\r
-       case WM_KEYUP:\\r
+\r
+#define JAWS_KBUP_NAVIGATION \\r
                switch (wParam) {\\r
                case VK_SPACE:\\r
                        KeyboardMove(hwnd, message, wParam, lParam);\\r
                        break;\\r
                }\\r
-               break;\\r
 \r
 #define JAWS_MENU_ITEMS \\r
                case IDM_PossibleAttackMove:  /*What can I possible attack from here */\\r
@@ -1335,7 +1423,7 @@ NiceTime(int x)
                        break;\\r
 \\r
                case IDM_SayClockTime:  /*Say the clock time */\\r
-                       SayClockTime();\\r
+                       SayClockTime(0);\\r
                        break;\\r
 \\r
                case IDM_SayWhosTurn:   /* Say whos turn it its */\\r
@@ -1388,7 +1476,7 @@ NiceTime(int x)
 \r
 #define JAWS_DELETE(X)\r
 \r
-#define JAWS_SILENCE if(suppressClocks) return;\r
+#define JAWS_SILENCE TimeWarning(); if(suppressClocks) return;\r
 \r
 #define JAWS_COPYRIGHT \\r
        SetDlgItemText(hDlg, OPT_MESS, "Auditory/Keyboard Enhancements  By:  Ed Rodriguez (sort of)");\r