Some code refactoring and cleanup; one small bug fix
authorH.G. Muller <h.g.muller@hccnet.nl>
Thu, 5 Nov 2009 06:57:30 +0000 (22:57 -0800)
committerArun Persaud <arun@nubati.net>
Thu, 5 Nov 2009 06:57:30 +0000 (22:57 -0800)
Some code refactoring, mainly to bring definitions of routines and variables
shared between winboard.c and one of the auxiliary-windows files
whistory.c, wevalgraph.c, wgamelist.c, wengineo.c somewere in a header file
(winboard.h). Unfortunately this made winboard.h dependent on data types
defined in frontend.h, so that the #include order had to be changed in many
other .c files.

The operation revealed one potentially bad bug: engineOutputDialogUp was
written as int in engineo.c, but declared as char in winboard.c.

I also changed the storage mechanism of the the comment and tags window
positions to use WindowPlacement structs rather than simple variables,
so that in the future they can be docked, like the others.

I also removed some remnants of the Analysis window.

The wgamelist.h and wedittags.h header files contained only 3 lines, and
I absorbed them in winboard.h, rather than creating other such nearly empty
headers engineo.h, whistory.h and wevalgraph.h. This affects the make files.

17 files changed:
backend.h
common.h
winboard/makefile.gcc
winboard/makefile.ms
winboard/wchat.c
winboard/wclipbrd.c
winboard/wedittags.c
winboard/wedittags.h [deleted file]
winboard/wengineo.c
winboard/wevalgraph.c
winboard/wgamelist.c
winboard/wgamelist.h [deleted file]
winboard/whistory.c
winboard/winboard.c
winboard/winboard.h
winboard/wlayout.c
winboard/woptions.c

index b44c45a..362e58c 100644 (file)
--- a/backend.h
+++ b/backend.h
@@ -347,13 +347,6 @@ typedef struct _CPS {
 
 extern ChessProgramState first, second;
 
-/* [AS] Search stats from chessprogram, for the played move */
-typedef struct {
-    int score;  /* Centipawns */
-    int depth;  /* Plies */
-    int time;   /* Milliseconds */
-} ChessProgramStats_Move;
-
 /* Search stats from chessprogram */
 typedef struct {
   char movelist[2*MSG_SIZ]; /* Last PV we were sent */
@@ -374,5 +367,6 @@ typedef struct {
 extern ChessProgramStats_Move pvInfoList[MAX_MOVES];
 extern int shuffleOpenings;
 extern ChessProgramStats programStats;
+extern int opponentKibitzes; // used by wengineo.c
 
 #endif /* _BACKEND */
index 72e66ba..b184aec 100644 (file)
--- a/common.h
+++ b/common.h
@@ -655,6 +655,13 @@ typedef struct {
     int holdingsWidth; /* number of files left and right of board, 0 or 2   */
 } GameInfo;
 
+/* [AS] Search stats from chessprogram, for the played move */
+typedef struct {
+    int score;  /* Centipawns */
+    int depth;  /* Plies */
+    int time;   /* Milliseconds */
+} ChessProgramStats_Move;
+
 // [HGM] chat  
 #define MAX_CHAT 3
 extern int chatCount;
index e8a7e99..429ed4e 100644 (file)
@@ -86,8 +86,8 @@ $(PROJ).exe: $(OBJS) $(PROJ).hlp
 \r
 \r
 winboard.o: winboard.c config.h winboard.h ../common.h ../frontend.h ../backend.h \\r
-       ../moves.h wgamelist.h defaults.h resource.h wclipbrd.h \\r
-       wedittags.h wsockerr.h woptions.h wsnap.h ../lists.h help.h\r
+       ../moves.h defaults.h resource.h wclipbrd.h \\r
+       wsockerr.h woptions.h wsnap.h ../lists.h help.h\r
        $(call compile, $<)\r
 \r
 backend.o: ../backend.c config.h ../common.h ../frontend.h ../backend.h \\r
@@ -114,11 +114,11 @@ wclipbrd.o: wclipbrd.c config.h ../common.h ../frontend.h ../backend.h \
        $(call compile, $<)\r
 \r
 wedittags.o: wedittags.c config.h ../common.h winboard.h resource.h ../frontend.h \\r
-       ../backend.h ../lists.h wedittags.h\r
+       ../backend.h ../lists.h\r
        $(call compile, $<)\r
 \r
 wgamelist.o: wgamelist.c config.h. ../common.h winboard.h resource.h ../frontend.h \\r
-       ../backend.h wgamelist.h ../lists.h\r
+       ../backend.h ../lists.h\r
        $(call compile, $<)\r
 \r
 woptions.o: woptions.c config.h ../common.h ../frontend.h ../backend.h ../lists.h \\r
@@ -137,7 +137,7 @@ wevalgraph.o: wevalgraph.c config.h ../common.h ../frontend.h ../backend.h \
        ../lists.h winboard.h resource.h wsnap.h\r
        $(call compile, $<)\r
 \r
-wlayout.o: wlayout.c config.h ../common.h winboard.h resource.h\r
+wlayout.o: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h\r
        $(call compile, $<)\r
 \r
 wsockerr.o: wsockerr.c wsockerr.h\r
index 10c95fd..6c12cfd 100644 (file)
@@ -122,11 +122,11 @@ wclipbrd.obj: wclipbrd.c config.h ../common.h ../frontend.h ../backend.h \
         $(CC) $(CFLAGS) wclipbrd.c\r
 \r
 wedittags.obj: wedittags.c config.h ../common.h winboard.h resource.h ../frontend.h \\r
-        ../backend.h ../lists.h wedittags.h\r
+        ../backend.h ../lists.h\r
         $(CC) $(CFLAGS) wedittags.c\r
 \r
 wgamelist.obj: wgamelist.c config.h. ../common.h winboard.h resource.h ../frontend.h \\r
-        ../backend.h wgamelist.h ../lists.h\r
+        ../backend.h ../lists.h\r
         $(CC) $(CFLAGS) wgamelist.c\r
 \r
 woptions.obj: woptions.c config.h ../common.h ../frontend.h ../backend.h \\r
@@ -145,7 +145,7 @@ wevalgraph.obj: wevalgraph.c config.h ../common.h ../frontend.h ../backend.h \
        ../lists.h winboard.h resource.h wsnap.h\r
         $(CC) $(CFLAGS) wevalgraph.c\r
 \r
-wlayout.obj: wlayout.c config.h ../common.h winboard.h resource.h\r
+wlayout.obj: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h\r
         $(CC) $(CFLAGS) wlayout.c\r
 \r
 wsockerr.obj: wsockerr.c wsockerr.h\r
index a2b0825..4b7edbc 100644 (file)
@@ -32,8 +32,8 @@
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
+#include "winboard.h"\r
 #include "backend.h"\r
 \r
 #include "wsnap.h"\r
index 6f546a4..111bcf9 100644 (file)
@@ -32,9 +32,9 @@
 #include <sys/stat.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 #include "wclipbrd.h"\r
 \r
 /* Imports from winboard.c */\r
index 3039f4c..965e723 100644 (file)
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
-#include "wedittags.h"\r
+#include "winboard.h"\r
 \r
 /* Module globals */\r
 static char *editTagsText;\r
-HWND editTagsDialog = NULL;\r
 BOOL editTagsUp = FALSE;\r
 BOOL canEditTags = FALSE;\r
-int editTagsX, editTagsY, editTagsW, editTagsH;\r
 \r
 /* Imports from winboard.c */\r
 extern HINSTANCE hInst;\r
@@ -86,18 +83,18 @@ EditTagsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       GetClientRect(hDlg, &rect);\r
       sizeX = rect.right;\r
       sizeY = rect.bottom;\r
-      if (editTagsX != CW_USEDEFAULT && editTagsY != CW_USEDEFAULT &&\r
-         editTagsW != CW_USEDEFAULT && editTagsH != CW_USEDEFAULT) {\r
+      if (wpTags.x != CW_USEDEFAULT && wpTags.y != CW_USEDEFAULT &&\r
+         wpTags.width != CW_USEDEFAULT && wpTags.height != CW_USEDEFAULT) {\r
        WINDOWPLACEMENT wp;\r
-       EnsureOnScreen(&editTagsX, &editTagsY, 0, 0);\r
+       EnsureOnScreen(&wpTags.x, &wpTags.y, 0, 0);\r
        wp.length = sizeof(WINDOWPLACEMENT);\r
        wp.flags = 0;\r
        wp.showCmd = SW_SHOW;\r
        wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-       wp.rcNormalPosition.left = editTagsX;\r
-       wp.rcNormalPosition.right = editTagsX + editTagsW;\r
-       wp.rcNormalPosition.top = editTagsY;\r
-       wp.rcNormalPosition.bottom = editTagsY + editTagsH;\r
+       wp.rcNormalPosition.left = wpTags.x;\r
+       wp.rcNormalPosition.right = wpTags.x + wpTags.width;\r
+       wp.rcNormalPosition.top = wpTags.y;\r
+       wp.rcNormalPosition.bottom = wpTags.y + wpTags.height;\r
        SetWindowPlacement(hDlg, &wp);\r
 \r
        GetClientRect(hDlg, &rect);\r
diff --git a/winboard/wedittags.h b/winboard/wedittags.h
deleted file mode 100644 (file)
index e27a338..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*\r
- * wedittags.h -- EditTags window for WinBoard\r
- *\r
- * Copyright 1995,2009 Free Software Foundation, Inc.\r
- *\r
- * Enhancements Copyright 2005 Alessandro Scotti\r
- *\r
- * ------------------------------------------------------------------------\r
- *\r
- * GNU XBoard is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License, or (at\r
- * your option) any later version.\r
- *\r
- * GNU XBoard is distributed in the hope that it will be useful, but\r
- * WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see http://www.gnu.org/licenses/.  *\r
- *\r
- *------------------------------------------------------------------------\r
- ** See the file ChangeLog for a revision history.  */\r
-\r
-VOID EditTagsProc(void);\r
-extern HWND editTagsDialog;\r
-extern int editTagsX, editTagsY, editTagsW, editTagsH;\r
-\r
index 1c3238f..4876a70 100644 (file)
@@ -34,9 +34,9 @@
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 \r
 #include "wsnap.h"\r
 \r
@@ -61,27 +61,8 @@ HICON icons[8]; // [HGM] this front-end array translates back-end icon indicator
 \r
 HWND outputField[2][7]; // [HGM] front-end array to translate output field to window handle\r
 \r
-void EngineOutputPopUp();\r
-void EngineOutputPopDown();\r
-int  EngineOutputIsUp();\r
-\r
 #define SHOW_PONDERING\r
 \r
-/* Imports from backend.c */\r
-char * SavePart(char *str);\r
-extern int opponentKibitzes;\r
-\r
-/* Imports from winboard.c */\r
-extern HWND engineOutputDialog;\r
-extern int     engineOutputDialogUp;\r
-\r
-extern HINSTANCE hInst;\r
-extern HWND hwndMain;\r
-\r
-extern WindowPlacement wpEngineOutput;\r
-\r
-extern BoardSize boardSize;\r
-\r
 /* Module variables */\r
 #define H_MARGIN            2\r
 #define V_MARGIN            2\r
@@ -97,12 +78,11 @@ extern BoardSize boardSize;
 #define STATE_ANALYZING  3\r
 \r
 static int  windowMode = 1;\r
-\r
 static int  needInit = TRUE;\r
-\r
 static int  lastDepth[2] = { -1, -1 };\r
 static int  lastForwardMostMove[2] = { -1, -1 };\r
 static int  engineState[2] = { -1, -1 };\r
+static BOOLEAN engineOutputDialogUp = FALSE;\r
 \r
 typedef struct {\r
 //    HWND hColorIcon; // [HGM] the output-control handles are no loger passed,\r
index be51991..21fd1e4 100644 (file)
@@ -37,9 +37,6 @@
 #include "frontend.h"\r
 #include "backend.h"\r
 \r
-/* Imports from winboard.c */\r
-extern BOOLEAN evalGraphDialogUp; // should be back-end variable, and defined here\r
-\r
 /* Module globals */ // used to communicate between back-end and front-end part\r
 static ChessProgramStats_Move * currPvInfo;\r
 static int currFirst = 0;\r
@@ -347,11 +344,6 @@ void PaintEvalGraph( void )
     DrawHistograms();\r
 }\r
 \r
-Boolean EvalGraphIsUp()\r
-{\r
-    return evalGraphDialogUp;\r
-}\r
-\r
 // ------------------------------------------ front-end starts here ----------------------------------------------\r
 \r
 #include <commdlg.h>\r
@@ -362,18 +354,12 @@ Boolean EvalGraphIsUp()
 \r
 #define WM_REFRESH_GRAPH    (WM_USER + 1)\r
 \r
-void EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-void EvalGraphPopUp();\r
-void EvalGraphPopDown();\r
-Boolean EvalGraphIsUp();\r
-\r
 // calls of front-end part into back-end part\r
 extern int GetMoveIndexFromPoint( int x, int y );\r
 extern void PaintEvalGraph( void );\r
 \r
 /* Imports from winboard.c */\r
-extern HWND evalGraphDialog;\r
-extern BOOLEAN evalGraphDialogUp; // should be back-end, really\r
+static BOOLEAN evalGraphDialogUp; // should be back-end, really\r
 \r
 extern HINSTANCE hInst;\r
 extern HWND hwndMain;\r
@@ -388,6 +374,11 @@ static HBITMAP hbmPB = NULL;
 static HPEN pens[6]; // [HGM] put all pens in one array\r
 static HBRUSH hbrHist[3] = { NULL, NULL, NULL };\r
 \r
+Boolean EvalGraphIsUp()\r
+{\r
+    return evalGraphDialogUp;\r
+}\r
+\r
 // [HGM] front-end, added as wrapper to avoid use of LineTo and MoveToEx in other routines (so they can be back-end) \r
 static void DrawSegment( int x, int y, int *lastX, int *lastY, int penType )\r
 {\r
index 26c843b..31d36ff 100644 (file)
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 \r
 #include "wsnap.h"\r
-#include "wgamelist.h"\r
-\r
-extern BoardSize boardSize;\r
 \r
 /* Module globals */\r
-HWND gameListDialog = NULL;\r
-BOOLEAN gameListUp = FALSE;\r
-FILE* gameFile;\r
-char* gameFileName = NULL;\r
-\r
-/* Imports from winboard.c */\r
-extern HINSTANCE hInst;\r
-extern HWND hwndMain;\r
-extern WindowPlacement wpGameList;\r
+static BOOLEAN gameListUp = FALSE;\r
+static FILE* gameFile;\r
+static char* gameFileName = NULL;\r
 \r
 struct GameListStats\r
 {\r
@@ -265,7 +256,9 @@ GameListDialog(HWND hDlg, UINT message,     WPARAM wParam, LPARAM lParam)
                              newSizeX, newSizeY);\r
        sizeX = newSizeX;\r
        sizeY = newSizeY;\r
-      }\r
+      } \r
+   else \r
+     GetActualPlacement( gameListDialog, &wpGameList );\r
 \r
       GameListUpdateTitle( hDlg, szDlgTitle, count, ((ListGame *) gameList.tailPred)->number, &stats );\r
     }\r
diff --git a/winboard/wgamelist.h b/winboard/wgamelist.h
deleted file mode 100644 (file)
index aa554f9..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*\r
- * wgamelist.h -- Game list window for WinBoard\r
- *\r
- * Copyright 1995,2009 Free Software Foundation, Inc.\r
- *\r
- * Enhancements Copyright 2005 Alessandro Scotti\r
- *\r
- * ------------------------------------------------------------------------\r
- *\r
- * GNU XBoard is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License, or (at\r
- * your option) any later version.\r
- *\r
- * GNU XBoard is distributed in the hope that it will be useful, but\r
- * WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see http://www.gnu.org/licenses/.  *\r
- *\r
- *------------------------------------------------------------------------\r
- ** See the file ChangeLog for a revision history.  */\r
-\r
-VOID ShowGameListProc(void);\r
-extern HWND gameListDialog;\r
-extern int gameListX, gameListY, gameListW, gameListH;\r
index 73ae025..933359c 100644 (file)
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 \r
 #include "wsnap.h"\r
 \r
-VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-VOID MoveHistoryPopUp();\r
-VOID MoveHistoryPopDown();\r
-BOOL MoveHistoryIsUp();\r
-\r
-/* Imports from backend.c */\r
-char * SavePart(char *str);\r
-\r
-/* Imports from winboard.c */\r
-extern HWND moveHistoryDialog;\r
-extern BOOLEAN moveHistoryDialogUp;\r
-\r
-extern HINSTANCE hInst;\r
-extern HWND hwndMain;\r
-\r
-extern WindowPlacement wpMoveHistory;\r
-\r
-extern BoardSize boardSize;\r
-\r
 /* Module globals */\r
 typedef char MoveHistoryString[ MOVE_LEN*2 ];\r
+static BOOLEAN moveHistoryDialogUp = FALSE;\r
 \r
 static int lastFirst = 0;\r
 static int lastLast = 0;\r
index 5a8df2b..3870fc8 100644 (file)
 #endif\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 #include "moves.h"\r
 #include "wclipbrd.h"\r
-#include "wgamelist.h"\r
-#include "wedittags.h"\r
 #include "woptions.h"\r
 #include "wsockerr.h"\r
 #include "defaults.h"\r
@@ -158,10 +156,10 @@ char installDir[MSG_SIZ];
 \r
 BoardSize boardSize;\r
 BOOLEAN chessProgram;\r
-static int boardX, boardY;\r
+//static int boardX, boardY;\r
 int  minX, minY; // [HGM] placement: volatile limits on upper-left corner\r
 static int squareSize, lineGap, minorSize;\r
-static int winWidth, winHeight, winW, winH;\r
+static int winW, winH;\r
 static RECT messageRect, whiteRect, blackRect, leftLogoRect, rightLogoRect; // [HGM] logo\r
 static int logoHeight = 0;\r
 static char messageText[MESSAGE_TEXT_MAX];\r
@@ -181,8 +179,6 @@ char *secondChessProgramNames;
 #define PALETTESIZE 256\r
 \r
 HINSTANCE hInst;          /* current instance */\r
-HWND hwndMain = NULL;        /* root window*/\r
-HWND hwndConsole = NULL;\r
 BOOLEAN alwaysOnTop = FALSE;\r
 RECT boardRect;\r
 COLORREF lightSquareColor, darkSquareColor, whitePieceColor, \r
@@ -346,15 +342,7 @@ static char *commentTitle;
 static char *commentText;\r
 static int commentIndex;\r
 static Boolean editComment = FALSE;\r
-HWND commentDialog = NULL;\r
-int commentUp = FALSE;\r
-static int commentX, commentY, commentH, commentW;\r
 \r
-static char *analysisTitle;\r
-static char *analysisText;\r
-HWND analysisDialog = NULL;\r
-BOOLEAN analysisDialogUp = FALSE;\r
-static int analysisX, analysisY, analysisH, analysisW;\r
 \r
 char errorTitle[MSG_SIZ];\r
 char errorMessage[2*MSG_SIZ];\r
@@ -424,37 +412,27 @@ VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);
 int NewGameFRC();\r
 int GameListOptions();\r
 \r
-HWND moveHistoryDialog = NULL;\r
-BOOLEAN moveHistoryDialogUp = FALSE;\r
-\r
-WindowPlacement wpMoveHistory;\r
+int dummy; // [HGM] for obsolete args\r
 \r
+HWND hwndMain = NULL;        /* root window*/\r
+HWND hwndConsole = NULL;\r
+HWND commentDialog = NULL;\r
+HWND moveHistoryDialog = NULL;\r
 HWND evalGraphDialog = NULL;\r
-BOOLEAN evalGraphDialogUp = FALSE;\r
-\r
-WindowPlacement wpEvalGraph;\r
-\r
 HWND engineOutputDialog = NULL;\r
-BOOLEAN engineOutputDialogUp = FALSE;\r
+HWND gameListDialog = NULL;\r
+HWND editTagsDialog = NULL;\r
+\r
+int commentUp = FALSE;\r
 \r
+WindowPlacement wpMain;\r
+WindowPlacement wpConsole;\r
+WindowPlacement wpComment;\r
+WindowPlacement wpMoveHistory;\r
+WindowPlacement wpEvalGraph;\r
 WindowPlacement wpEngineOutput;\r
 WindowPlacement wpGameList;\r
-WindowPlacement wpConsole;\r
-\r
-VOID MoveHistoryPopUp();\r
-VOID MoveHistoryPopDown();\r
-VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-BOOL MoveHistoryIsUp();\r
-\r
-VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-VOID EvalGraphPopUp();\r
-VOID EvalGraphPopDown();\r
-BOOL EvalGraphIsUp();\r
-\r
-VOID EngineOutputPopUp();\r
-VOID EngineOutputPopDown();\r
-BOOL EngineOutputIsUp();\r
-VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
+WindowPlacement wpTags;\r
 \r
 VOID EngineOptionsPopup(); // [HGM] settings\r
 \r
@@ -861,15 +839,15 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
   InitBackEnd2();\r
 \r
   /* Make the window visible; update its client area; and return "success" */\r
-  EnsureOnScreen(&boardX, &boardY, minX, minY);\r
+  EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY);\r
   wp.length = sizeof(WINDOWPLACEMENT);\r
   wp.flags = 0;\r
   wp.showCmd = nCmdShow;\r
   wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-  wp.rcNormalPosition.left = boardX;\r
-  wp.rcNormalPosition.right = boardX + winWidth;\r
-  wp.rcNormalPosition.top = boardY;\r
-  wp.rcNormalPosition.bottom = boardY + winHeight;\r
+  wp.rcNormalPosition.left = wpMain.x;\r
+  wp.rcNormalPosition.right = wpMain.x + wpMain.width;\r
+  wp.rcNormalPosition.top = wpMain.y;\r
+  wp.rcNormalPosition.bottom = wpMain.y + wpMain.height;\r
   SetWindowPlacement(hwndMain, &wp);\r
 \r
   if(!appData.noGUI) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
@@ -1399,26 +1377,26 @@ ArgDescriptor argDescriptors[] = {
   // [HGM] placement: put all window layouts last in ini file, but man X,Y before all others\r
   { "minX", ArgZ, (LPVOID) &minX, FALSE }, // [HGM] placement: to make suer auxialary windows can be placed\r
   { "minY", ArgZ, (LPVOID) &minY, FALSE },\r
-  { "winWidth",  ArgInt, (LPVOID) &winWidth,  TRUE }, // [HGM] placement: dummies to remember right & bottom\r
-  { "winHeight", ArgInt, (LPVOID) &winHeight, TRUE }, //       for attaching auxiliary windows to them\r
-  { "x", ArgInt, (LPVOID) &boardX, TRUE },\r
-  { "y", ArgInt, (LPVOID) &boardY, TRUE },\r
+  { "winWidth",  ArgInt, (LPVOID) &wpMain.width,  TRUE }, // [HGM] placement: dummies to remember right & bottom\r
+  { "winHeight", ArgInt, (LPVOID) &wpMain.height, TRUE }, //       for attaching auxiliary windows to them\r
+  { "x", ArgInt, (LPVOID) &wpMain.x, TRUE },\r
+  { "y", ArgInt, (LPVOID) &wpMain.y, TRUE },\r
   { "icsX", ArgX,   (LPVOID) &wpConsole.x, TRUE },\r
   { "icsY", ArgY,   (LPVOID) &wpConsole.y, TRUE },\r
   { "icsW", ArgInt, (LPVOID) &wpConsole.width, TRUE },\r
   { "icsH", ArgInt, (LPVOID) &wpConsole.height, TRUE },\r
-  { "analysisX", ArgX,   (LPVOID) &analysisX, FALSE }, // [HGM] placement: analysis window no longer exists\r
-  { "analysisY", ArgY,   (LPVOID) &analysisY, FALSE }, //       provided for compatibility with old ini files\r
-  { "analysisW", ArgInt, (LPVOID) &analysisW, FALSE },\r
-  { "analysisH", ArgInt, (LPVOID) &analysisH, FALSE },\r
-  { "commentX", ArgX,   (LPVOID) &commentX, TRUE },\r
-  { "commentY", ArgY,   (LPVOID) &commentY, TRUE },\r
-  { "commentW", ArgInt, (LPVOID) &commentW, TRUE },\r
-  { "commentH", ArgInt, (LPVOID) &commentH, TRUE },\r
-  { "tagsX", ArgX,   (LPVOID) &editTagsX, TRUE },\r
-  { "tagsY", ArgY,   (LPVOID) &editTagsY, TRUE },\r
-  { "tagsW", ArgInt, (LPVOID) &editTagsW, TRUE },\r
-  { "tagsH", ArgInt, (LPVOID) &editTagsH, TRUE },\r
+  { "analysisX", ArgX,   (LPVOID) &dummy, FALSE }, // [HGM] placement: analysis window no longer exists\r
+  { "analysisY", ArgY,   (LPVOID) &dummy, FALSE }, //       provided for compatibility with old ini files\r
+  { "analysisW", ArgInt, (LPVOID) &dummy, FALSE },\r
+  { "analysisH", ArgInt, (LPVOID) &dummy, FALSE },\r
+  { "commentX", ArgX,   (LPVOID) &wpComment.x, TRUE },\r
+  { "commentY", ArgY,   (LPVOID) &wpComment.y, TRUE },\r
+  { "commentW", ArgInt, (LPVOID) &wpComment.width, TRUE },\r
+  { "commentH", ArgInt, (LPVOID) &wpComment.height, TRUE },\r
+  { "tagsX", ArgX,   (LPVOID) &wpTags.x, TRUE },\r
+  { "tagsY", ArgY,   (LPVOID) &wpTags.y, TRUE },\r
+  { "tagsW", ArgInt, (LPVOID) &wpTags.width, TRUE },\r
+  { "tagsH", ArgInt, (LPVOID) &wpTags.height, TRUE },\r
   { "gameListX", ArgX,   (LPVOID) &wpGameList.x, TRUE },\r
   { "gameListY", ArgY,   (LPVOID) &wpGameList.y, TRUE },\r
   { "gameListW", ArgInt, (LPVOID) &wpGameList.width, TRUE },\r
@@ -1777,16 +1755,16 @@ ParseArgs(GetFunc get, void *cl)
       break;\r
 \r
     case ArgX:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
+      *(int *) ad->argLoc = atoi(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute \r
       break;\r
 \r
     case ArgY:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
+      *(int *) ad->argLoc = atoi(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...)\r
       break;\r
 \r
     case ArgZ:\r
       *(int *) ad->argLoc = atoi(argValue);\r
-      EnsureOnScreen(&boardX, &boardY, minX, minY); \r
+      EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); \r
       break;\r
 \r
     case ArgFloat:\r
@@ -2050,20 +2028,16 @@ InitAppData(LPSTR lpCmdLine)
   dcb.StopBits = ONESTOPBIT;\r
   settingsFileName = SETTINGS_FILE;\r
   saveSettingsOnExit = TRUE;\r
-  boardX = CW_USEDEFAULT;\r
-  boardY = CW_USEDEFAULT;\r
-  analysisX = CW_USEDEFAULT; \r
-  analysisY = CW_USEDEFAULT; \r
-  analysisW = CW_USEDEFAULT;\r
-  analysisH = CW_USEDEFAULT;\r
-  commentX = CW_USEDEFAULT; \r
-  commentY = CW_USEDEFAULT; \r
-  commentW = CW_USEDEFAULT;\r
-  commentH = CW_USEDEFAULT;\r
-  editTagsX = CW_USEDEFAULT; \r
-  editTagsY = CW_USEDEFAULT; \r
-  editTagsW = CW_USEDEFAULT;\r
-  editTagsH = CW_USEDEFAULT;\r
+  wpMain.x = CW_USEDEFAULT;\r
+  wpMain.y = CW_USEDEFAULT;\r
+  wpComment.x = CW_USEDEFAULT; \r
+  wpComment.y = CW_USEDEFAULT; \r
+  wpComment.width = CW_USEDEFAULT;\r
+  wpComment.height = CW_USEDEFAULT;\r
+  wpTags.x = CW_USEDEFAULT; \r
+  wpTags.y = CW_USEDEFAULT; \r
+  wpTags.width = CW_USEDEFAULT;\r
+  wpTags.height = CW_USEDEFAULT;\r
   icsTextMenuString = ICS_TEXT_MENU_DEFAULT;\r
   icsNames = ICS_NAMES;\r
   firstChessProgramNames = FCP_NAMES;\r
@@ -2304,16 +2278,49 @@ InitMenuChecks()
                                     MF_CHECKED : MF_UNCHECKED));\r
 }\r
 \r
+// [HGM] args: these two cases taken out to stay in front-end\r
+      void SaveFontArg(FILE *f, ArgDescriptor *ad)\r
+      {\r
+        int bs;\r
+       for (bs=0; bs<NUM_SIZES; bs++) {\r
+         MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
+          fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
+         fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n",\r
+           ad->argName, mfp->faceName, mfp->pointSize,\r
+            mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
+           mfp->bold ? "b" : "",\r
+           mfp->italic ? "i" : "",\r
+           mfp->underline ? "u" : "",\r
+           mfp->strikeout ? "s" : "",\r
+            (int)mfp->charset);\r
+       }\r
+      }\r
+\r
+      void SaveAttribsArg(FILE *f, ArgDescriptor *ad)\r
+      {\r
+       MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
+       fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
+          (ta->effects & CFE_BOLD) ? "b" : "",\r
+          (ta->effects & CFE_ITALIC) ? "i" : "",\r
+          (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
+          (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
+          (ta->effects) ? " " : "",\r
+         ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
+      }\r
+\r
+int MainWindowUp()\r
+{ // [HGM] args: allows testing if main window is realized from back-end\r
+  return hwndMain != NULL;\r
+}\r
 \r
 VOID\r
 SaveSettings(char* name)\r
 {\r
   FILE *f;\r
   ArgDescriptor *ad;\r
-  WINDOWPLACEMENT wp;\r
   char dir[MSG_SIZ];\r
 \r
-  if (!hwndMain) return;\r
+  if (!MainWindowUp()) return;\r
 \r
   GetCurrentDirectory(MSG_SIZ, dir);\r
   SetCurrentDirectory(installDir);\r
@@ -2331,83 +2338,23 @@ SaveSettings(char* name)
   fprintf(f, "; Use a shortcut, an @indirection file, or a .bat file instead.\n");\r
   fprintf(f, ";\n");\r
 \r
-  wp.length = sizeof(WINDOWPLACEMENT);\r
-  GetWindowPlacement(hwndMain, &wp);\r
-  boardX = wp.rcNormalPosition.left;\r
-  boardY = wp.rcNormalPosition.top;\r
-\r
-  if (hwndConsole) {\r
-    GetWindowPlacement(hwndConsole, &wp);\r
-    wpConsole.x = wp.rcNormalPosition.left;\r
-    wpConsole.y = wp.rcNormalPosition.top;\r
-    wpConsole.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpConsole.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (analysisDialog) {\r
-    GetWindowPlacement(analysisDialog, &wp);\r
-    analysisX = wp.rcNormalPosition.left;\r
-    analysisY = wp.rcNormalPosition.top;\r
-    analysisW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    analysisH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (commentDialog) {\r
-    GetWindowPlacement(commentDialog, &wp);\r
-    commentX = wp.rcNormalPosition.left;\r
-    commentY = wp.rcNormalPosition.top;\r
-    commentW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    commentH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (editTagsDialog) {\r
-    GetWindowPlacement(editTagsDialog, &wp);\r
-    editTagsX = wp.rcNormalPosition.left;\r
-    editTagsY = wp.rcNormalPosition.top;\r
-    editTagsW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    editTagsH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (gameListDialog) {\r
-    GetWindowPlacement(gameListDialog, &wp);\r
-    wpGameList.x = wp.rcNormalPosition.left;\r
-    wpGameList.y = wp.rcNormalPosition.top;\r
-    wpGameList.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpGameList.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(hwndMain, &wpMain);\r
+  GetActualPlacement(hwndConsole, &wpConsole);\r
+  GetActualPlacement(commentDialog, &wpComment);\r
+  GetActualPlacement(editTagsDialog, &wpTags);\r
+  GetActualPlacement(gameListDialog, &wpGameList);\r
 \r
   /* [AS] Move history */\r
   wpMoveHistory.visible = MoveHistoryIsUp();\r
-  \r
-  if( moveHistoryDialog ) {\r
-    GetWindowPlacement(moveHistoryDialog, &wp);\r
-    wpMoveHistory.x = wp.rcNormalPosition.left;\r
-    wpMoveHistory.y = wp.rcNormalPosition.top;\r
-    wpMoveHistory.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpMoveHistory.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(moveHistoryDialog, &wpMoveHistory);\r
 \r
   /* [AS] Eval graph */\r
   wpEvalGraph.visible = EvalGraphIsUp();\r
-\r
-  if( evalGraphDialog ) {\r
-    GetWindowPlacement(evalGraphDialog, &wp);\r
-    wpEvalGraph.x = wp.rcNormalPosition.left;\r
-    wpEvalGraph.y = wp.rcNormalPosition.top;\r
-    wpEvalGraph.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpEvalGraph.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(evalGraphDialog, &wpEvalGraph);\r
 \r
   /* [AS] Engine output */\r
   wpEngineOutput.visible = EngineOutputIsUp();\r
-\r
-  if( engineOutputDialog ) {\r
-    GetWindowPlacement(engineOutputDialog, &wp);\r
-    wpEngineOutput.x = wp.rcNormalPosition.left;\r
-    wpEngineOutput.y = wp.rcNormalPosition.top;\r
-    wpEngineOutput.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpEngineOutput.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(engineOutputDialog, &wpEngineOutput);\r
 \r
   for (ad = argDescriptors; ad->argName != NULL; ad++) {\r
     if (!ad->save) continue;\r
@@ -2443,10 +2390,10 @@ SaveSettings(char* name)
       fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc);\r
       break;\r
     case ArgX:\r
-      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardX); // [HGM] placement: stor relative value\r
+      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.x); // [HGM] placement: stor relative value\r
       break;\r
     case ArgY:\r
-      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardY);\r
+      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.y);\r
       break;\r
     case ArgFloat:\r
       fprintf(f, "/%s=%g\n", ad->argName, *(float *)ad->argLoc);\r
@@ -2469,16 +2416,7 @@ SaveSettings(char* name)
       }\r
       break;\r
     case ArgAttribs:\r
-      {\r
-       MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
-       fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
-          (ta->effects & CFE_BOLD) ? "b" : "",\r
-          (ta->effects & CFE_ITALIC) ? "i" : "",\r
-          (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
-          (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
-          (ta->effects) ? " " : "",\r
-         ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
-      }\r
+      SaveAttribsArg(f, ad);\r
       break;\r
     case ArgFilename:\r
       if (strchr(*(char **)ad->argLoc, '\"')) {\r
@@ -2492,21 +2430,7 @@ SaveSettings(char* name)
              sizeInfo[*(BoardSize *)ad->argLoc].name);\r
       break;\r
     case ArgFont:\r
-      {\r
-        int bs;\r
-       for (bs=0; bs<NUM_SIZES; bs++) {\r
-         MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
-          fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
-         fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n",\r
-           ad->argName, mfp->faceName, mfp->pointSize,\r
-            mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
-           mfp->bold ? "b" : "",\r
-           mfp->italic ? "i" : "",\r
-           mfp->underline ? "u" : "",\r
-           mfp->strikeout ? "s" : "",\r
-            (int)mfp->charset);\r
-       }\r
-      }\r
+      SaveFontArg(f, ad);\r
       break;\r
     case ArgCommSettings:\r
       PrintCommSettings(f, ad->argName, (DCB *)ad->argLoc);\r
@@ -3032,7 +2956,7 @@ void CreatePiecesFromFont()
                 }\r
                 else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) {\r
                     /* Good Companion (Some characters get warped as literal :-( */\r
-                    char s[] = "1cmWG0ñueOS¯®oYI23wgQU";\r
+                    char s[] = "1cmWG0??S??oYI23wgQU";\r
                     s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3;\r
                     SetCharTable(pieceToFontChar, s);\r
                 }\r
@@ -3200,10 +3124,10 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   /* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */\r
   if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize;\r
 \r
-  oldRect.left = boardX; //[HGM] placement: remember previous window params\r
-  oldRect.top = boardY;\r
-  oldRect.right = boardX + winWidth;\r
-  oldRect.bottom = boardY + winHeight;\r
+  oldRect.left = wpMain.x; //[HGM] placement: remember previous window params\r
+  oldRect.top = wpMain.y;\r
+  oldRect.right = wpMain.x + wpMain.width;\r
+  oldRect.bottom = wpMain.y + wpMain.height;\r
 \r
   tinyLayout = sizeInfo[boardSize].tinyLayout;\r
   smallLayout = sizeInfo[boardSize].smallLayout;\r
@@ -3311,49 +3235,49 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) +\r
     GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN;\r
   if(suppressVisibleEffects) return; // [HGM] when called for filling sizeInfo only\r
-  winWidth = winW;  // [HGM] placement: set through temporary which can used by initial sizing choice\r
-  winHeight = winH; //       without disturbing window attachments\r
+  wpMain.width = winW;  // [HGM] placement: set through temporary which can used by initial sizing choice\r
+  wpMain.height = winH; //       without disturbing window attachments\r
   GetWindowRect(hwndMain, &wrect);\r
-  SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+  SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
               SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
 \r
   // [HGM] placement: let attached windows follow size change.\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, moveHistoryDialog, &wpMoveHistory );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, evalGraphDialog, &wpEvalGraph );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, engineOutputDialog, &wpEngineOutput );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, gameListDialog, &wpGameList );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, hwndConsole, &wpConsole );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, moveHistoryDialog, &wpMoveHistory );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, evalGraphDialog, &wpEvalGraph );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, engineOutputDialog, &wpEngineOutput );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, gameListDialog, &wpGameList );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, hwndConsole, &wpConsole );\r
 \r
   /* compensate if menu bar wrapped */\r
   GetClientRect(hwndMain, &crect);\r
   offby = boardRect.bottom + OUTER_MARGIN - crect.bottom;\r
-  winHeight += offby;\r
+  wpMain.height += offby;\r
   switch (flags) {\r
   case WMSZ_TOPLEFT:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.right - winWidth, wrect.bottom - winHeight, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.right - wpMain.width, wrect.bottom - wpMain.height, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_TOPRIGHT:\r
   case WMSZ_TOP:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.left, wrect.bottom - winHeight, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.left, wrect.bottom - wpMain.height, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_BOTTOMLEFT:\r
   case WMSZ_LEFT:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.right - winWidth, wrect.top, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.right - wpMain.width, wrect.top, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_BOTTOMRIGHT:\r
   case WMSZ_BOTTOM:\r
   case WMSZ_RIGHT:\r
   default:\r
-    SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+    SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
                SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
     break;\r
   }\r
@@ -6252,18 +6176,18 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             RECT rcMain;\r
 \r
 //            GetWindowRect( hwnd, &rcMain ); //[HGM] sticky: in XP this returned new position, not old\r
-           rcMain.left   = boardX;           //              replace by these 4 lines to reconstruct old rect\r
-           rcMain.right  = boardX + winWidth;\r
-           rcMain.top    = boardY;\r
-           rcMain.bottom = boardY + winHeight;\r
+           rcMain.left   = wpMain.x;           //              replace by these 4 lines to reconstruct old rect\r
+           rcMain.right  = wpMain.x + wpMain.width;\r
+           rcMain.top    = wpMain.y;\r
+           rcMain.bottom = wpMain.y + wpMain.height;\r
             \r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, moveHistoryDialog, &wpMoveHistory );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, evalGraphDialog, &wpEvalGraph );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, engineOutputDialog, &wpEngineOutput );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, gameListDialog, &wpGameList );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, hwndConsole, &wpConsole );\r
-           boardX = lpwp->x;\r
-            boardY = lpwp->y;\r
+           wpMain.x = lpwp->x;\r
+            wpMain.y = lpwp->y;\r
         }\r
     }\r
     break;\r
@@ -7026,18 +6950,18 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       GetClientRect(hDlg, &rect);\r
       sizeX = rect.right;\r
       sizeY = rect.bottom;\r
-      if (commentX != CW_USEDEFAULT && commentY != CW_USEDEFAULT &&\r
-         commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) {\r
+      if (wpComment.x != CW_USEDEFAULT && wpComment.y != CW_USEDEFAULT &&\r
+         wpComment.width != CW_USEDEFAULT && wpComment.height != CW_USEDEFAULT) {\r
        WINDOWPLACEMENT wp;\r
-       EnsureOnScreen(&commentX, &commentY, 0, 0);\r
+       EnsureOnScreen(&wpComment.x, &wpComment.y, 0, 0);\r
        wp.length = sizeof(WINDOWPLACEMENT);\r
        wp.flags = 0;\r
        wp.showCmd = SW_SHOW;\r
        wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-       wp.rcNormalPosition.left = commentX;\r
-       wp.rcNormalPosition.right = commentX + commentW;\r
-       wp.rcNormalPosition.top = commentY;\r
-       wp.rcNormalPosition.bottom = commentY + commentH;\r
+       wp.rcNormalPosition.left = wpComment.x;\r
+       wp.rcNormalPosition.right = wpComment.x + wpComment.width;\r
+       wp.rcNormalPosition.top = wpComment.y;\r
+       wp.rcNormalPosition.bottom = wpComment.y + wpComment.height;\r
        SetWindowPlacement(hDlg, &wp);\r
 \r
        GetClientRect(hDlg, &rect);\r
@@ -7416,7 +7340,7 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
   case WM_INITDIALOG:\r
     GetWindowRect(hDlg, &rChild);\r
 \r
-    SetWindowPos(hDlg, NULL, boardX, boardY-height, winWidth, height,\r
+    SetWindowPos(hDlg, NULL, wpMain.x, wpMain.y-height, wpMain.width, height,\r
                                                              SWP_NOZORDER);\r
 \r
     /* \r
@@ -8037,10 +7961,10 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    // [HGM] Chessknight's change 2004-07-13\r
    else { /* Determine Defaults */\r
        WINDOWPLACEMENT wp;\r
-       wpConsole.x = winWidth + 1;\r
-       wpConsole.y = boardY;\r
-       wpConsole.width = screenWidth -  winWidth;\r
-       wpConsole.height = winHeight;\r
+       wpConsole.x = wpMain.width + 1;\r
+       wpConsole.y = wpMain.y;\r
+       wpConsole.width = screenWidth -  wpMain.width;\r
+       wpConsole.height = wpMain.height;\r
        EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0);\r
        wp.length = sizeof(WINDOWPLACEMENT);\r
        wp.flags = 0;\r
@@ -10490,86 +10414,6 @@ StartAnalysisClock()
                                        (UINT) 2000, NULL);\r
 }\r
 \r
-LRESULT CALLBACK\r
-AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
-  static HANDLE hwndText;\r
-  RECT rect;\r
-  static int sizeX, sizeY;\r
-  int newSizeX, newSizeY, flags;\r
-  MINMAXINFO *mmi;\r
-\r
-  switch (message) {\r
-  case WM_INITDIALOG: /* message: initialize dialog box */\r
-    /* Initialize the dialog items */\r
-    hwndText = GetDlgItem(hDlg, OPT_AnalysisText);\r
-    SetWindowText(hDlg, analysisTitle);\r
-    SetDlgItemText(hDlg, OPT_AnalysisText, analysisText);\r
-    /* Size and position the dialog */\r
-    if (!analysisDialog) {\r
-      analysisDialog = hDlg;\r
-      flags = SWP_NOZORDER;\r
-      GetClientRect(hDlg, &rect);\r
-      sizeX = rect.right;\r
-      sizeY = rect.bottom;\r
-      if (analysisX != CW_USEDEFAULT && analysisY != CW_USEDEFAULT &&\r
-         analysisW != CW_USEDEFAULT && analysisH != CW_USEDEFAULT) {\r
-       WINDOWPLACEMENT wp;\r
-       EnsureOnScreen(&analysisX, &analysisY, 0, 0);\r
-       wp.length = sizeof(WINDOWPLACEMENT);\r
-       wp.flags = 0;\r
-       wp.showCmd = SW_SHOW;\r
-       wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-       wp.rcNormalPosition.left = analysisX;\r
-       wp.rcNormalPosition.right = analysisX + analysisW;\r
-       wp.rcNormalPosition.top = analysisY;\r
-       wp.rcNormalPosition.bottom = analysisY + analysisH;\r
-       SetWindowPlacement(hDlg, &wp);\r
-\r
-       GetClientRect(hDlg, &rect);\r
-       newSizeX = rect.right;\r
-       newSizeY = rect.bottom;\r
-        ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY,\r
-                             newSizeX, newSizeY);\r
-       sizeX = newSizeX;\r
-       sizeY = newSizeY;\r
-      }\r
-    }\r
-    return FALSE;\r
-\r
-  case WM_COMMAND: /* message: received a command */\r
-    switch (LOWORD(wParam)) {\r
-    case IDCANCEL:\r
-      if (appData.icsActive && appData.icsEngineAnalyze) { /* [DM] icsEngineAnalyze */\r
-          ExitAnalyzeMode();\r
-          ModeHighlight();\r
-          return TRUE;\r
-      }\r
-      EditGameEvent();\r
-      return TRUE;\r
-    default:\r
-      break;\r
-    }\r
-    break;\r
-\r
-  case WM_SIZE:\r
-    newSizeX = LOWORD(lParam);\r
-    newSizeY = HIWORD(lParam);\r
-    ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY);\r
-    sizeX = newSizeX;\r
-    sizeY = newSizeY;\r
-    break;\r
-\r
-  case WM_GETMINMAXINFO:\r
-    /* Prevent resizing window too small */\r
-    mmi = (MINMAXINFO *) lParam;\r
-    mmi->ptMinTrackSize.x = 100;\r
-    mmi->ptMinTrackSize.y = 100;\r
-    break;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
 VOID\r
 SetHighlights(int fromX, int fromY, int toX, int toY)\r
 {\r
index 973aab6..af8c3f9 100644 (file)
@@ -173,6 +173,19 @@ extern MyFont *font[NUM_SIZES][NUM_FONTS];
 #define COPY_TMP "wbcopy.tmp"\r
 #define PASTE_TMP "wbpaste.tmp"\r
 \r
+/* variables */\r
+extern HINSTANCE hInst;\r
+extern HWND hwndMain;\r
+extern BoardSize boardSize;\r
+\r
+// [HGM] Some stuff to allo a platform-independent reference to windows\r
+// This should be moved to frontend.h in due time\r
+\r
+typedef enum {\r
+  W_Main, W_Console, W_Comment, W_Tags, W_GameList, \r
+  W_MoveHist, W_EngineOut, W_GameList, NUM_WINDOWS\r
+} WindowID;\r
+\r
 /* [AS] Layout management */\r
 typedef struct {\r
     Boolean visible;\r
@@ -182,10 +195,41 @@ typedef struct {
     int height;\r
 } WindowPlacement;\r
 \r
-VOID InitWindowPlacement( WindowPlacement * wp );\r
+extern WindowPlacement placementTab[NUM_WINDOWS];\r
+extern HWND hwndTab[NUM_WINDOWS]; // this remains pure front-end.\r
 \r
+VOID InitWindowPlacement( WindowPlacement * wp );\r
 VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp );\r
-\r
 VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild );\r
-\r
 VOID ReattachAfterSize( LPRECT lprcOldPos, int new_w, int new_h, HWND hWndChild, WindowPlacement * pwpChild );\r
+BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp );\r
+\r
+extern WindowPlacement wpEngineOutput;\r
+extern WindowPlacement wpEvalGraph;\r
+extern WindowPlacement wpMoveHistory;\r
+extern WindowPlacement wpGameList;\r
+extern WindowPlacement wpTags;\r
+\r
+VOID MoveHistoryPopUp();\r
+VOID MoveHistoryPopDown();\r
+VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
+BOOL MoveHistoryIsUp();\r
+extern HWND moveHistoryDialog;\r
+\r
+VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
+VOID EvalGraphPopUp();\r
+VOID EvalGraphPopDown();\r
+Boolean EvalGraphIsUp();\r
+extern HWND evalGraphDialog;\r
+\r
+VOID EngineOutputPopUp();\r
+VOID EngineOutputPopDown();\r
+BOOL EngineOutputIsUp();\r
+VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
+extern HWND engineOutputDialog;\r
+\r
+VOID ShowGameListProc(void);\r
+extern HWND gameListDialog;\r
+\r
+VOID EditTagsProc(void);\r
+extern HWND editTagsDialog;\r
index 04f6eb6..2442466 100644 (file)
@@ -33,6 +33,7 @@
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
+#include "frontend.h"\r
 #include "winboard.h"\r
 \r
 VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp )\r
@@ -93,7 +94,7 @@ static BOOL IsDefaultPlacement( WindowPlacement * wp )
     return result;\r
 }\r
 \r
-static BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp )\r
+BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp )\r
 {\r
     BOOL result = FALSE;\r
 \r
index 20a3106..dfc1bfb 100755 (executable)
 #include <ctype.h>\r
 \r
 #include "common.h"\r
+#include "frontend.h"\r
 #include "winboard.h"\r
 #include "backend.h"\r
 #include "woptions.h"\r
 #include "defaults.h"\r
-#include "wedittags.h"\r
 #include <richedit.h>\r
 \r
 #if __GNUC__\r