--- ..\winboard-3_6_12beta-src\winboard\winboard.c	Sat Jun 13 17:13:13 1998
+++ winboard.c	Fri Jun 19 22:54:43 1998
@@ -153,6 +153,8 @@
 static BOOL paletteChanged = FALSE;
 static COLORREF lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor;
 static HICON iconWhite, iconBlack, iconCurrent;
+static int doingSizing = FALSE;
+static int lastSizing = 0;
 
 static char *defaultTextAttribs[] = 
 {
@@ -493,13 +495,13 @@
   for (bs = NUM_SIZES - 1; bs >= (BoardSize)0; bs--) {
     /* Compute window size for each board size, and use the largest
        size that fits on this screen as the default. */
-    InitDrawingSizes(bs);
+    InitDrawingSizes(bs, 0);
     if (boardSize == (BoardSize)-1 &&
 	winHeight <= screenHeight && winWidth <= screenWidth) {
       boardSize = bs;
     }
   }
-  InitDrawingSizes(boardSize);
+  InitDrawingSizes(boardSize, 0);
   InitMenuChecks();
   buttonCount = GetSystemMetrics(SM_CMOUSEBUTTONS);
 
@@ -1824,7 +1826,7 @@
 
 /* Respond to board resize by dragging edge */
 VOID
-ResizeBoard(int newSizeX, int newSizeY)
+ResizeBoard(int newSizeX, int newSizeY, int flags)
 {
   BoardSize newSize = NUM_SIZES - 1;
   static int recurse = 0;
@@ -1841,14 +1843,14 @@
   (void) CheckMenuItem(GetMenu(hwndMain), newSize + IDM_Tiny,
 		       MF_BYCOMMAND|MF_CHECKED);
   boardSize = newSize;
-  InitDrawingSizes(boardSize);
+  InitDrawingSizes(boardSize, flags);
   recurse--;
 }
 
 
 
 VOID
-InitDrawingSizes(BoardSize boardSize)
+InitDrawingSizes(BoardSize boardSize, int flags)
 {
   int i, boardWidth;
   ChessSquare piece;
@@ -1860,7 +1862,7 @@
   char *str;
   LOGBRUSH logbrush;
   HMENU hmenu = GetMenu(hwndMain);
-  RECT wrect;
+  RECT crect, wrect;
   int offby;
 
   tinyLayout = sizeInfo[boardSize].tinyLayout;
@@ -1930,16 +1932,41 @@
   winWidth = 2 * GetSystemMetrics(SM_CXFRAME) + boardRect.right + OUTER_MARGIN;
   winHeight = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) +
     GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN;
+  GetWindowRect(hwndMain, &wrect);
   SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,
 	       SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);
-
   /* compensate if menu bar wrapped */
-  GetClientRect(hwndMain, &wrect);
-  offby = boardRect.bottom + OUTER_MARGIN - wrect.bottom;
-  if (offby != 0) {
-    winHeight += offby;
+  GetClientRect(hwndMain, &crect);
+  offby = boardRect.bottom + OUTER_MARGIN - crect.bottom;
+  winHeight += offby;
+  switch (flags) {
+  case WMSZ_TOPLEFT:
+    SetWindowPos(hwndMain, NULL, 
+                 wrect.right - winWidth, wrect.bottom - winHeight, 
+                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);
+    break;
+
+  case WMSZ_TOPRIGHT:
+  case WMSZ_TOP:
+    SetWindowPos(hwndMain, NULL, 
+                 wrect.left, wrect.bottom - winHeight, 
+                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);
+    break;
+
+  case WMSZ_BOTTOMLEFT:
+  case WMSZ_LEFT:
+    SetWindowPos(hwndMain, NULL, 
+                 wrect.right - winWidth, wrect.top, 
+                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);
+    break;
+
+  case WMSZ_BOTTOMRIGHT:
+  case WMSZ_BOTTOM:
+  case WMSZ_RIGHT:
+  default:
     SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,
-		 SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);
+               SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);
+    break;
   }
 
   hwndPause = NULL;
@@ -2243,6 +2270,8 @@
    */
   Boolean fullrepaint = repaint;
 
+  if (doingSizing) return;
+
   if (board == NULL) {
     if (!lastReqValid) 
       return;
@@ -3052,7 +3081,6 @@
   int wmId, wmEvent;
   char *defName;
   FILE *f;
-  static int didSizing = FALSE;
   int i, j;
   UINT number;
   char fileTitle[MSG_SIZ];
@@ -3668,14 +3696,14 @@
 
     case IDM_MessageFont:
       if (MyCreateFont(font[boardSize][MESSAGE_FONT])) {
-	InitDrawingSizes(boardSize);
+	InitDrawingSizes(boardSize, 0);
 	InvalidateRect(hwnd, NULL, TRUE);
       }
       break;
 
     case IDM_ClockFont:
       if (MyCreateFont(font[boardSize][CLOCK_FONT])) {
-	InitDrawingSizes(boardSize);
+	InitDrawingSizes(boardSize, 0);
 	InvalidateRect(hwnd, NULL, TRUE);
       }
       break;
@@ -3720,7 +3748,7 @@
           ParseFontName(font[j][i]->def, &font[j][i]->mfp);
 	  CreateFontInMF(font[j][i]);
 	}
-      InitDrawingSizes(boardSize);
+      InitDrawingSizes(boardSize, 0);
       InvalidateRect(hwnd, NULL, TRUE);
       if (commentDialog) {
 	SendDlgItemMessage(commentDialog, OPT_CommentText,
@@ -3996,15 +4024,28 @@
     InputEvent(hwnd, message, wParam, lParam);
     break;
 
-  case WM_SIZE:
-    if (didSizing) {
-      ResizeBoard(LOWORD(lParam), HIWORD(lParam));
-      didSizing = FALSE;
+  case WM_ENTERSIZEMOVE:
+    if (hwnd == hwndMain) {
+      doingSizing = TRUE;
+      lastSizing = 0;
     }
     break;
 
   case WM_SIZING:
-    didSizing = TRUE;
+    if (hwnd == hwndMain) {
+      lastSizing = wParam;
+    }
+    break;
+
+  case WM_EXITSIZEMOVE:
+    if (hwnd == hwndMain) {
+      RECT client;
+      doingSizing = FALSE;
+      InvalidateRect(hwnd, &boardRect, FALSE);
+      GetClientRect(hwnd, &client);
+      ResizeBoard(client.right, client.bottom, lastSizing);
+      lastSizing = 0;
+    }
     break;
 
   case WM_DESTROY: /* message: window being destroyed */
@@ -4214,7 +4255,7 @@
     (void) CheckMenuItem(GetMenu(hwndMain), newSize + IDM_Tiny,
 			 MF_BYCOMMAND|MF_CHECKED);
     boardSize = newSize;
-    InitDrawingSizes(boardSize);
+    InitDrawingSizes(boardSize, 0);
   }
 }
 
