From d43eb2a0d52d9cf09c73d596076d4fd8c81ef0df Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 11 Feb 2007 00:21:06 +0000
Subject: [PATCH] return the restored window size from GetSize() when window is
 minimized (for consistency with wxGTK and also for convenience)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44443 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt          |  1 +
 docs/latex/wx/window.tex  | 13 +++++---
 include/wx/msw/toplevel.h | 10 ++++--
 src/msw/toplevel.cpp      | 69 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 86 insertions(+), 7 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 22223832c6..8acfbae8a2 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -36,6 +36,7 @@ wxGTK:
 wxMSW:
 
 - Fixed infinite loop in wxThread::Wait() in console applications
+- Return the restored window size from GetSize() when window is minimized
 
 
 2.8.2
diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex
index a416fa5151..1271cec6e6 100644
--- a/docs/latex/wx/window.tex
+++ b/docs/latex/wx/window.tex
@@ -869,9 +869,9 @@ a 2-element list {\tt (width, height)}.}
 
 \constfunc{wxSize}{GetClientSize}{\void}
 
-This gets the size of the window `client area' in pixels.
-The client area is the area which may be drawn on by the programmer,
-excluding title bar, border, scrollbars, etc.
+Returns the size of the window `client area' in pixels. The client area is the
+area which may be drawn on by the programmer, excluding title bar, border,
+scrollbars, etc.
 
 \wxheading{Parameters}
 
@@ -1246,8 +1246,11 @@ Returns the built-in scrollbar thumb size.
 
 \constfunc{wxSize}{GetSize}{\void}
 
-This gets the size of the entire window in pixels,
-including title bar, border, scrollbars, etc.
+Returns the size of the entire window in pixels, including title bar, border,
+scrollbars, etc.
+
+Note that if this window is a top-level one and it is currently minimized, the
+returned size is the restored window size, not the size of the window icon.
 
 \wxheading{Parameters}
 
diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h
index 44c5141a12..ff20508a5a 100644
--- a/include/wx/msw/toplevel.h
+++ b/include/wx/msw/toplevel.h
@@ -55,7 +55,7 @@ public:
     virtual void SetIcon(const wxIcon& icon);
     virtual void SetIcons(const wxIconBundle& icons );
     virtual void Restore();
-    
+
     virtual void SetLayoutDirection(wxLayoutDirection dir);
 
 #ifndef __WXWINCE__
@@ -76,7 +76,7 @@ public:
     virtual bool SetTransparent(wxByte alpha);
     virtual bool CanSetTransparent();
 
-    
+
     // implementation from now on
     // --------------------------
 
@@ -127,6 +127,12 @@ protected:
     // common part of Iconize(), Maximize() and Restore()
     void DoShowWindow(int nShowCmd);
 
+    // override those to return the normal window coordinates even when the
+    // window is minimized
+    virtual void DoGetPosition(int *x, int *y) const;
+    virtual void DoGetSize(int *width, int *height) const;
+
+
     // is the window currently iconized?
     bool m_iconized;
 
diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp
index 97fec59a6a..cc9f0bcc87 100644
--- a/src/msw/toplevel.cpp
+++ b/src/msw/toplevel.cpp
@@ -780,6 +780,75 @@ void wxTopLevelWindowMSW::SetLayoutDirection(wxLayoutDirection dir)
         wxTopLevelWindowBase::SetLayoutDirection(dir);
 }
 
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMSW geometry
+// ----------------------------------------------------------------------------
+
+void wxTopLevelWindowMSW::DoGetPosition(int *x, int *y) const
+{
+    if ( IsIconized() )
+    {
+        WINDOWPLACEMENT wp;
+        wp.length = sizeof(WINDOWPLACEMENT);
+        if ( ::GetWindowPlacement(GetHwnd(), &wp) )
+        {
+            RECT& rc = wp.rcNormalPosition;
+
+            // the position returned by GetWindowPlacement() is in workspace
+            // coordinates except for windows with WS_EX_TOOLWINDOW style
+            if ( !HasFlag(wxFRAME_TOOL_WINDOW) )
+            {
+                // we must use the correct display for the translation as the
+                // task bar might be shown on one display but not the other one
+                int n = wxDisplay::GetFromWindow(this);
+                wxDisplay dpy(n == wxNOT_FOUND ? 0 : n);
+                const wxPoint ptOfs = dpy.GetClientArea().GetPosition() -
+                                      dpy.GetGeometry().GetPosition();
+
+                rc.left += ptOfs.x;
+                rc.top += ptOfs.y;
+            }
+
+            if ( x )
+                *x = rc.left;
+            if ( y )
+                *y = rc.top;
+
+            return;
+        }
+
+        wxLogLastError(_T("GetWindowPlacement"));
+    }
+    //else: normal case
+
+    wxTopLevelWindowBase::DoGetPosition(x, y);
+}
+
+void wxTopLevelWindowMSW::DoGetSize(int *width, int *height) const
+{
+    if ( IsIconized() )
+    {
+        WINDOWPLACEMENT wp;
+        wp.length = sizeof(WINDOWPLACEMENT);
+        if ( ::GetWindowPlacement(GetHwnd(), &wp) )
+        {
+            const RECT& rc = wp.rcNormalPosition;
+
+            if ( width )
+                *width = rc.right - rc.left;
+            if ( height )
+                *height = rc.bottom - rc.top;
+
+            return;
+        }
+
+        wxLogLastError(_T("GetWindowPlacement"));
+    }
+    //else: normal case
+
+    wxTopLevelWindowBase::DoGetSize(width, height);
+}
+
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowMSW fullscreen
 // ----------------------------------------------------------------------------
-- 
2.50.0

