/*\r
* WinBoard.c -- Windows NT front end to XBoard\r
- * $Id: winboard.c,v 2.3 2003/11/25 05:25:20 mann Exp $\r
*\r
* Copyright 1991 by Digital Equipment Corporation, Maynard,\r
- * Massachusetts. Enhancements Copyright\r
- * 1992-2001,2002,2003,2004,2005,2006,2007,2008,2009 Free Software\r
- * Foundation, Inc.\r
+ * Massachusetts. \r
+ *\r
+ * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
+ * 2007, 2008, 2009 Free Software Foundation, Inc.\r
+ *\r
+ * Enhancements Copyright 2005 Alessandro Scotti\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
#include "woptions.h"\r
#include "wsockerr.h"\r
#include "defaults.h"\r
-\r
+#include "help.h"\r
#include "wsnap.h"\r
\r
//void InitEngineUCI( const char * iniDir, ChessProgramState * cps );\r
int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,\r
/*char*/int promoChar));\r
void AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames);\r
-\r
+void DisplayMove P((int moveNumber));\r
+Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen));\r
typedef struct {\r
ChessSquare piece; \r
POINT pos; /* window coordinates of current pos */\r
\r
/* Title bar text */\r
char szTitle[] = "WinBoard";\r
-char szConsoleTitle[] = "ICS Interaction";\r
+char szConsoleTitle[] = "I C S Interaction";\r
\r
char *programName;\r
char *settingsFileName;\r
};\r
\r
int tinyLayout = 0, smallLayout = 0;\r
-#define MENU_BAR_ITEMS 6\r
+#define MENU_BAR_ITEMS 7\r
char *menuBarText[2][MENU_BAR_ITEMS+1] = {\r
{ "&File", "&Mode", "&Action", "&Step", "&Options", "&Help", NULL },\r
{ "&F", "&M", "&A", "&S", "&O", "&H", NULL },\r
BOOL EngineOutputIsUp();\r
VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
\r
+VOID EngineOptionsPopup(); // [HGM] settings\r
+\r
VOID GothicPopUp(char *title, VariantClass variant);\r
/*\r
* Setting "frozen" should disable all user input other than deleting\r
DrawMenuBar(hwndMain);\r
}\r
\r
+static int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS can use them\r
+\r
+/* JAWS preparation patch (WinBoard for the sight impaired). Define required insertions as empty */\r
+#ifdef JAWS\r
+#include "jaws.c"\r
+#else\r
+#define JAWS_INIT\r
+#define JAWS_ALT_INTERCEPT\r
+#define JAWS_KB_NAVIGATION\r
+#define JAWS_MENU_ITEMS\r
+#define JAWS_SILENCE\r
+#define JAWS_REPLAY\r
+#define JAWS_ACCEL\r
+#define JAWS_COPYRIGHT\r
+#define JAWS_DELETE(X) X\r
+#define SAYMACHINEMOVE()\r
+#define SAY(X)\r
+#endif\r
+\r
/*---------------------------------------------------------------------------*\\r
*\r
* WinMain\r
return (FALSE);\r
}\r
\r
+ JAWS_INIT\r
+\r
// InitCommonControlsEx(&ex);\r
InitCommonControls();\r
\r
0, /* lowest message to examine */\r
0)) /* highest message to examine */\r
{\r
+\r
+ if(msg.message == WM_CHAR && msg.wParam == '\t') {\r
+ // [HGM] navigate: switch between all windows with tab\r
+ HWND e1 = NULL, e2 = NULL, mh = NULL, hInput = NULL, hText = NULL;\r
+ int i, currentElement = 0;\r
+\r
+ // first determine what element of the chain we come from (if any)\r
+ if(appData.icsActive) {\r
+ hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
+ hText = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
+ }\r
+ if(engineOutputDialog && EngineOutputIsUp()) {\r
+ e1 = GetDlgItem(engineOutputDialog, IDC_EngineMemo1);\r
+ e2 = GetDlgItem(engineOutputDialog, IDC_EngineMemo2);\r
+ }\r
+ if(moveHistoryDialog && MoveHistoryIsUp()) {\r
+ mh = GetDlgItem(moveHistoryDialog, IDC_MoveHistory);\r
+ }\r
+ if(msg.hwnd == hwndMain) currentElement = 7 ; else\r
+ if(msg.hwnd == engineOutputDialog) currentElement = 2; else\r
+ if(msg.hwnd == e1) currentElement = 2; else\r
+ if(msg.hwnd == e2) currentElement = 3; else\r
+ if(msg.hwnd == moveHistoryDialog) currentElement = 4; else\r
+ if(msg.hwnd == mh) currentElement = 4; else\r
+ if(msg.hwnd == evalGraphDialog) currentElement = 7; else\r
+ if(msg.hwnd == hText) currentElement = 5; else\r
+ if(msg.hwnd == hInput) currentElement = 6; else\r
+ for (i = 0; i < N_BUTTONS; i++) {\r
+ if (buttonDesc[i].hwnd == msg.hwnd) { currentElement = 1; break; }\r
+ }\r
+\r
+ // determine where to go to\r
+ if(currentElement) { HWND h = NULL; int direction = GetKeyState(VK_SHIFT) < 0 ? -1 : 1;\r
+ do {\r
+ currentElement = (currentElement + direction) % 7;\r
+ switch(currentElement) {\r
+ case 0:\r
+ h = hwndMain; break; // passing this case always makes the loop exit\r
+ case 1:\r
+ h = buttonDesc[0].hwnd; break; // could be NULL\r
+ case 2:\r
+ if(!EngineOutputIsUp()) continue; // skip closed auxiliary windows\r
+ h = e1; break;\r
+ case 3:\r
+ if(!EngineOutputIsUp()) continue;\r
+ h = e2; break;\r
+ case 4:\r
+ if(!MoveHistoryIsUp()) continue;\r
+ h = mh; break;\r
+// case 5: // input to eval graph does not seem to get here!\r
+// if(!EvalGraphIsUp()) continue;\r
+// h = evalGraphDialog; break;\r
+ case 5:\r
+ if(!appData.icsActive) continue;\r
+ SAY("display");\r
+ h = hText; break;\r
+ case 6:\r
+ if(!appData.icsActive) continue;\r
+ SAY("input");\r
+ h = hInput; break;\r
+ }\r
+ } while(h == 0);\r
+\r
+ if(currentElement > 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
+ if(currentElement < 5 && IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); // all open together\r
+ SetFocus(h);\r
+\r
+ continue; // this message now has been processed\r
+ }\r
+ }\r
+\r
if (!(commentDialog && IsDialogMessage(commentDialog, &msg)) &&\r
!(moveHistoryDialog && IsDialogMessage(moveHistoryDialog, &msg)) &&\r
!(evalGraphDialog && IsDialogMessage(evalGraphDialog, &msg)) &&\r
!(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) &&\r
!(gameListDialog && IsDialogMessage(gameListDialog, &msg)) &&\r
!(errorDialog && IsDialogMessage(errorDialog, &msg)) &&\r
- !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) &&\r
+ !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL\r
!(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoICS, &msg)) &&\r
!(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) {\r
TranslateMessage(&msg); /* Translates virtual key codes */\r
wp.rcNormalPosition.bottom = boardY + winHeight;\r
SetWindowPlacement(hwndMain, &wp);\r
\r
- SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
+ if(!appData.noGUI) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
\r
if (hwndConsole) {\r
#endif\r
ShowWindow(hwndConsole, nCmdShow);\r
}\r
- UpdateWindow(hwnd);\r
+ if(!appData.noGUI) UpdateWindow(hwnd); else ShowWindow(hwnd, SW_MINIMIZE);\r
\r
return TRUE;\r
\r
return;\r
}\r
fprintf(f, ";\n");\r
- fprintf(f, "; %s %s.%s Save Settings file\n", PRODUCT, VERSION, PATCHLEVEL);\r
+ fprintf(f, "; %s Save Settings file\n", PACKAGE_STRING);\r
fprintf(f, ";\n");\r
fprintf(f, "; You can edit the values of options that are already set in this file,\n");\r
fprintf(f, "; but if you add other options, the next Save Settings will not save them.\n");\r
}\r
}\r
\r
-static int fromX = -1, fromY = -1, toX, toY;\r
-\r
/* Event handler for mouse messages */\r
VOID\r
MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
) {\r
/* Downclick on different square. */\r
/* [HGM] if on holdings file, should count as new first click ! */\r
- { /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
+ /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
toX = x;\r
toY = y;\r
/* [HGM] <popupFix> UserMoveEvent requires two calls now,\r
break; \r
} else \r
if(moveType != ImpossibleMove) {\r
+ if(moveType == IllegalMove) {\r
+ ;\r
+ } else\r
/* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
If promotion to Q is legal, all are legal! */\r
if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)\r
{ ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
- // kludge to temporarily execute move on display, wthout promotng yet\r
+ // kludge to temporarily execute move on display, without promotng yet\r
promotionChoice = TRUE;\r
boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
boards[currentMove][toY][toX] = p;\r
ClearHighlights();\r
}\r
FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
- fromX = fromY = -1;\r
if (appData.animate && !appData.highlightLastMove) {\r
ClearHighlights();\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
}\r
}\r
- break;\r
+ fromX = fromY = -1;\r
+ break;\r
}\r
if (gotPremove) {\r
- /* [HGM] it seemed that braces were missing here */\r
- SetPremoveHighlights(fromX, fromY, toX, toY);\r
- fromX = fromY = -1;\r
- break;\r
- }\r
- }\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
+ SetPremoveHighlights(fromX, fromY, toX, toY);\r
+ DrawPosition(forceFullRepaint || FALSE, NULL);\r
+ } else ClearHighlights();\r
+ fromX = fromY = -1;\r
+ DrawPosition(forceFullRepaint || FALSE, NULL);\r
}\r
/* First downclick, or restart on a square with same color piece */\r
if (!frozen && OKToStartUserMove(x, y)) {\r
fromX = fromY = -1; \r
ClearHighlights();\r
DrawPosition(FALSE, boards[currentMove]);\r
+ appData.animate = saveAnimate;\r
break; \r
} else \r
if(moveType != ImpossibleMove) {\r
DrawPosition(FALSE, boards[currentMove]);\r
boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
boards[currentMove][toY][toX] = q;\r
+ appData.animate = saveAnimate;\r
break;\r
} else\r
PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
case '\r':\r
SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(buttonDesc[i].id, 0), 0);\r
return TRUE;\r
- case '\t':\r
- if (appData.icsActive) {\r
- if (GetKeyState(VK_SHIFT) < 0) {\r
- /* shifted */\r
- HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
- if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
- SetFocus(h);\r
- } else {\r
- /* unshifted */\r
- HWND h = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
- if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
- SetFocus(h);\r
- }\r
- return TRUE;\r
- }\r
- break;\r
default:\r
- if (appData.icsActive) {\r
+ if (appData.icsActive && (isalpha((char)wParam) || wParam == '0')) {\r
+ // [HGM] movenum: only letters or leading zero should go to ICS input\r
HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
SetFocus(h);\r
MouseEvent(hwnd, message, wParam, lParam);\r
break;\r
\r
+ JAWS_KB_NAVIGATION\r
+\r
case WM_CHAR:\r
\r
- if (appData.icsActive) {\r
- if (wParam == '\t') {\r
- if (GetKeyState(VK_SHIFT) < 0) {\r
- /* shifted */\r
- HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
- if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
- SetFocus(h);\r
- } else {\r
- /* unshifted */\r
- HWND h = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
- if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
- SetFocus(h);\r
- }\r
- } else {\r
+ JAWS_ALT_INTERCEPT\r
+\r
+ if (appData.icsActive && (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9')) { \r
+ // [HGM] movenum: for non-zero digits we always do type-in dialog\r
HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
SetFocus(h);\r
SendMessage(h, message, wParam, lParam);\r
- }\r
- } else if (isalpha((char)wParam) || isdigit((char)wParam)) {\r
- PopUpMoveDialog((char)wParam);\r
+ } else if(lParam != KF_REPEAT) {\r
+ if (isalpha((char)wParam) || isdigit((char)wParam)) {\r
+ PopUpMoveDialog((char)wParam);\r
+ } else if((char)wParam == 003) CopyGameToClipboard();\r
+ else if((char)wParam == 026) PasteGameOrFENFromClipboard();\r
}\r
+\r
break;\r
\r
case WM_PALETTECHANGED:\r
case IDM_NewGame:\r
ResetGameEvent();\r
AnalysisPopDown();\r
+ SAY("new game enter a move to play against the computer with white");\r
break;\r
\r
case IDM_NewGameFRC:\r
}\r
else {\r
EvalGraphPopUp();\r
+ SetFocus(hwndMain);\r
}\r
break;\r
\r
TagsPopUp(tags, CmailMsg());\r
free(tags);\r
}\r
+ SAY("computer starts playing white");\r
break;\r
\r
case IDM_MachineBlack:\r
TagsPopUp(tags, CmailMsg());\r
free(tags);\r
}\r
+ SAY("computer starts playing black");\r
break;\r
\r
case IDM_TwoMachines:\r
TagsPopUp(tags, CmailMsg());\r
free(tags);\r
}\r
+ SAY("programs start playing each other");\r
break;\r
\r
case IDM_AnalysisMode:\r
sprintf(buf, "%s does not support analysis", first.tidy);\r
DisplayError(buf, 0);\r
} else {\r
+ SAY("analyzing current position");\r
/* [DM] icsEngineAnlyze [HGM] Why is this front-end??? */\r
if (appData.icsActive) {\r
if (gameMode != IcsObserving) {\r
\r
case IDM_EditGame:\r
EditGameEvent();\r
+ SAY("edit game");\r
break;\r
\r
case IDM_EditPosition:\r
EditPositionEvent();\r
+ SAY("to set up a position type a FEN");\r
break;\r
\r
case IDM_Training:\r
SetFocus(hwndMain);\r
break;\r
\r
+ JAWS_MENU_ITEMS\r
+\r
case IDM_Forward:\r
ForwardEvent();\r
SetFocus(hwndMain);\r
EnginePlayOptionsPopup(hwnd);\r
break;\r
\r
+ case IDM_Engine1Options:\r
+ EngineOptionsPopup(hwnd, &first);\r
+ break;\r
+\r
+ case IDM_Engine2Options:\r
+ EngineOptionsPopup(hwnd, &second);\r
+ break;\r
+\r
case IDM_OptionsUCI:\r
UciOptionsPopup(hwnd);\r
break;\r
break;\r
\r
case IDM_HELPCONTENTS:\r
- if (!WinHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) {\r
- MessageBox (GetFocus(),\r
+ if (!MyHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS") &&\r
+ !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) {\r
+ MessageBox (GetFocus(),\r
"Unable to activate help",\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
}\r
break;\r
\r
case IDM_HELPSEARCH:\r
- if (!WinHelp(hwnd, "winboard.hlp", HELP_PARTIALKEY, (DWORD)(LPSTR)"")) {\r
+ if (!MyHelp (hwnd, "winboard.hlp", HELP_PARTIALKEY, (DWORD)(LPSTR)"") &&\r
+ !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) {\r
MessageBox (GetFocus(),\r
"Unable to activate help",\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
MyPlaySound(MySound *ms)\r
{\r
BOOLEAN ok = FALSE;\r
+\r
switch (ms->name[0]) {\r
case NULLCHAR:\r
+ if(appData.debugMode) fprintf(debugFP, "silence\n");\r
/* Silence */\r
ok = TRUE;\r
break;\r
/* Center the dialog over the application window */\r
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
SetDlgItemText(hDlg, ABOUTBOX_Version, programVersion);\r
+ JAWS_COPYRIGHT\r
return (TRUE);\r
\r
case WM_COMMAND: /* message: received a command */\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
case IDOK:\r
+ GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
+ { int n; Board board;\r
+ // [HGM] FENedit\r
+ if(gameMode == EditPosition && ParseFEN(board, &n, move) ) {\r
+ EditPositionPasteFEN(move);\r
+ EndDialog(hDlg, TRUE);\r
+ return TRUE;\r
+ }\r
+ // [HGM] movenum: allow move number to be typed in any mode\r
+ if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
+ currentMove = 2*n-1;\r
+ if(currentMove > forwardMostMove) currentMove = forwardMostMove;\r
+ if(currentMove < backwardMostMove) currentMove = backwardMostMove;\r
+ EndDialog(hDlg, TRUE);\r
+ DrawPosition(TRUE, boards[currentMove]);\r
+ if(currentMove > backwardMostMove) DisplayMove(currentMove - 1);\r
+ else DisplayMessage("", "");\r
+ return TRUE;\r
+ }\r
+ }\r
if (gameMode != EditGame && currentMove != forwardMostMove && \r
gameMode != Training) {\r
DisplayMoveError("Displayed move is not current");\r
} else {\r
- GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
- if (ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
+// GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream\r
+ int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
+ &moveType, &fromX, &fromY, &toX, &toY, &promoChar);\r
+ if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized\r
+ if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
&moveType, &fromX, &fromY, &toX, &toY, &promoChar)) {\r
if (gameMode != Training)\r
forwardMostMove = currentMove;\r
gameMode == AnalyzeMode || gameMode == EditGame || \r
gameMode == EditPosition || gameMode == IcsExamining ||\r
gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||\r
+ isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes\r
+ ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile ||\r
+ gameMode == IcsObserving || gameMode == TwoMachinesPlay ) ||\r
gameMode == Training) {\r
lpProc = MakeProcInstance((FARPROC)TypeInMoveDialog, hInst);\r
DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInMove),\r
}\r
break;\r
case WM_CHAR:\r
+ if(wParam != '\022') {\r
if (wParam == '\t') {\r
if (GetKeyState(VK_SHIFT) < 0) {\r
/* shifted */\r
}\r
} else {\r
hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
- SetFocus(hInput);\r
+ JAWS_DELETE( SetFocus(hInput); )\r
SendMessage(hInput, message, wParam, lParam);\r
}\r
return 0;\r
+ } // [HGM] navigate: for Ctrl+R, flow into nex case (moved up here) to summon up menu\r
+ case WM_RBUTTONUP:\r
+ if (GetKeyState(VK_SHIFT) & ~1) {\r
+ SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
+ WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0);\r
+ } else {\r
+ POINT pt;\r
+ HMENU hmenu = LoadIcsTextMenu(icsTextMenuEntry);\r
+ SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
+ if (sel.cpMin == sel.cpMax) {\r
+ EnableMenuItem(hmenu, IDM_Copy, MF_BYCOMMAND|MF_GRAYED);\r
+ EnableMenuItem(hmenu, IDM_QuickPaste, MF_BYCOMMAND|MF_GRAYED);\r
+ }\r
+ if (!IsClipboardFormatAvailable(CF_TEXT)) {\r
+ EnableMenuItem(hmenu, IDM_Paste, MF_BYCOMMAND|MF_GRAYED);\r
+ }\r
+ pt.x = LOWORD(lParam);\r
+ pt.y = HIWORD(lParam);\r
+ MenuPopup(hwnd, pt, hmenu, -1);\r
+ }\r
+ return 0;\r
case WM_PASTE:\r
hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
SetFocus(hInput);\r
SendMessage(hwnd, EM_HIDESELECTION, FALSE, FALSE);\r
}\r
return 0;\r
- case WM_RBUTTONUP:\r
- if (GetKeyState(VK_SHIFT) & ~1) {\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
- WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0);\r
- } else {\r
- POINT pt;\r
- HMENU hmenu = LoadIcsTextMenu(icsTextMenuEntry);\r
- SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
- if (sel.cpMin == sel.cpMax) {\r
- EnableMenuItem(hmenu, IDM_Copy, MF_BYCOMMAND|MF_GRAYED);\r
- EnableMenuItem(hmenu, IDM_QuickPaste, MF_BYCOMMAND|MF_GRAYED);\r
- }\r
- if (!IsClipboardFormatAvailable(CF_TEXT)) {\r
- EnableMenuItem(hmenu, IDM_Paste, MF_BYCOMMAND|MF_GRAYED);\r
- }\r
- pt.x = LOWORD(lParam);\r
- pt.y = HIWORD(lParam);\r
- MenuPopup(hwnd, pt, hmenu, -1);\r
- }\r
- return 0;\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
case IDM_QuickPaste:\r
case '\021': /* Ctrl+Q */\r
quoteNextChar = TRUE;\r
return 0;\r
+ JAWS_REPLAY\r
default:\r
break;\r
}\r
wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height;\r
SetWindowPlacement(hDlg, &wp);\r
}\r
-#if 0 \r
+#if 1\r
// [HGM] Chessknight's change 2004-07-13\r
else { /* Determine Defaults */\r
WINDOWPLACEMENT wp;\r
wpConsole.x = winWidth + 1;\r
wpConsole.y = boardY;\r
- wpConsoleW = screenWidth - winWidth;\r
- wpConsoleH = winHeight;\r
+ wpConsole.width = screenWidth - winWidth;\r
+ wpConsole.height = winHeight;\r
EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0);\r
wp.length = sizeof(WINDOWPLACEMENT);\r
wp.flags = 0;\r
}\r
oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf);\r
\r
+ JAWS_SILENCE\r
+\r
ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN,\r
rect->top, ETO_CLIPPED|ETO_OPAQUE,\r
rect, str, strlen(str), NULL);\r
if(logoHeight > 0 && appData.clockMode) {\r
RECT r;\r
- sprintf(buf, "%s %s", TimeString(timeRemaining), flagFell);\r
+ sprintf(buf, "%s %s", buf+7, flagFell);\r
r.top = rect->top + logoHeight/2;\r
r.left = rect->left;\r
r.right = rect->right;\r
messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR;\r
\r
if (hwndMain == NULL || IsIconic(hwndMain)) return;\r
+\r
+ SAYMACHINEMOVE();\r
+\r
hdc = GetDC(hwndMain);\r
oldFont = SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf);\r
ExtTextOut(hdc, messageRect.left, messageRect.top, ETO_CLIPPED|ETO_OPAQUE,\r