Fix multi-leg promotions
[xboard.git] / winboard / wlayout.c
index 0261736..c308fb3 100644 (file)
@@ -3,6 +3,11 @@
  *\r
  * Author: Alessandro Scotti (Dec 2005)\r
  *\r
+ * Copyright 2005 Alessandro Scotti\r
+ *\r
+ * Enhancements Copyright 2009, 2012, 2013, 2014, 2015, 2016 Free\r
+ * Software Foundation, Inc.\r
+ *\r
  * ------------------------------------------------------------------------\r
  *\r
  * GNU XBoard is free software: you can redistribute it and/or modify\r
@@ -31,6 +36,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
@@ -91,7 +97,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
@@ -163,20 +169,26 @@ VOID ReattachAfterSize( LPRECT lprcOldPos, int new_w, int new_h, HWND hWndChild,
     if( ! IsDefaultPlacement( pwpChild ) ) {\r
         GetActualPlacement( hWndChild, pwpChild );\r
 \r
-if(appData.debugMode) fprintf(debugFP, "resize, old=(%d,%d,%d,%d), new=(%d,%d)\n",\r
-lprcOldPos->left,lprcOldPos->top,lprcOldPos->right,lprcOldPos->bottom,new_w,new_h);\r
         if( IsAttachedByWindowPlacement( lprcOldPos, pwpChild ) ) {\r
             /* Get delta of lower right corner */\r
             int delta_x = new_w - (lprcOldPos->right  - lprcOldPos->left);\r
             int delta_y = new_h - (lprcOldPos->bottom - lprcOldPos->top);\r
 \r
             /* Adjust size & placement */\r
-            if(pwpChild->x + pwpChild->width  >= lprcOldPos->right  )\r
+            if(pwpChild->x + pwpChild->width  >= lprcOldPos->right &&\r
+              (pwpChild->x + pwpChild->width  < screenGeometry.right - 5 || delta_x > 0) ) // keep right edge glued to display edge if touching\r
                pwpChild->width += delta_x;\r
-            if(pwpChild->y + pwpChild->height >= lprcOldPos->bottom )\r
+            if(pwpChild->x + pwpChild->width  >= screenGeometry.right  ) // don't move right edge off screen\r
+               pwpChild->width = screenGeometry.right - pwpChild->x;\r
+            if(pwpChild->y + pwpChild->height >= lprcOldPos->bottom &&\r
+              (pwpChild->y + pwpChild->height < screenGeometry.bottom - 35 || delta_y > 0) ) // keep bottom edge glued to display edge if touching\r
                pwpChild->height += delta_y;\r
+            if(pwpChild->y + pwpChild->height >= screenGeometry.bottom - 30 ) // don't move bottom edge off screen\r
+               pwpChild->height = screenGeometry.bottom - 30 - pwpChild->y;\r
             if(pwpChild->x >= lprcOldPos->right)  pwpChild->width  -= delta_x, pwpChild->x += delta_x;\r
             if(pwpChild->y >= lprcOldPos->bottom) pwpChild->height -= delta_y, pwpChild->y += delta_y;\r
+            if(pwpChild->width  < 30) pwpChild->width = 30;  // force minimum width\r
+            if(pwpChild->height < 50) pwpChild->height = 50; // force minimum height\r
             /* Move window */\r
             if( hWndChild != NULL ) {\r
                 SetWindowPos( hWndChild, HWND_TOP,\r