+//
+// OS/2 needs a lot extra manipulation to deal with layouts
+// for canvas windows, particularly scrolled ones.
+//
+void wxWindowOS2::OS2Layout(
+  int                               nWidth
+, int                               nHeight
+)
+{
+    //
+    // Frames laying out canvas windows need the held.
+    // Dialogs or Frames laying out child controls do not.
+    //
+    if (IsKindOf(CLASSINFO(wxFrame)))
+    {
+        RECTL                       vRectFrame;
+        RECTL                       vRectClient;
+        RECTL                       vRectChild;
+        RECTL                       vRectHorz;
+        RECTL                       vRectVert;
+        SWP                         vSwpFrame;
+        SWP                         vSwpClient;
+        SWP                         vSwpChild;
+        SWP                         vSwpHorz;
+        SWP                         vSwpVert;
+        wxFrame*                    pFrame = wxDynamicCast(this, wxFrame);
+        bool                        bNewYSize = FALSE;
+        bool                        bNewXSize = FALSE;
+
+        ::WinQueryWindowPos(pFrame->GetFrame(), &vSwpFrame);
+        ::WinQueryWindowPos(GetHwnd(), &vSwpClient);
+
+        if (vSwpClient.cy != pFrame->GetSwpClient()->cy)
+            bNewYSize = TRUE;
+        if (vSwpClient.cx != pFrame->GetSwpClient()->cx)
+            bNewXSize = TRUE;
+
+        for (wxWindowList::Node* pNode = GetChildren().GetFirst();
+             pNode;
+             pNode = pNode->GetNext())
+        {
+            wxWindow*               pChild = pNode->GetData();
+            int                     nWidthAdjust = 0;
+            int                     nHeightAdjust = 0;
+
+            if ( pChild->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+                 pChild->IsKindOf(CLASSINFO(wxScrolledWindow))
+               )
+            {
+                if(bNewYSize)
+                {
+                    //
+                    // This is needed SetSize will mess up the OS/2 child window
+                    // positioning because we position in wxWindows coordinates,
+                    // not OS/2 coordinates.
+                    //
+                    pChild->MoveChildren(pFrame->GetSwpClient()->cy - vSwpClient.cy);
+                    pChild->Refresh();
+                }
+                ::WinQueryWindowPos(pChild->GetHWND(), &vSwpChild);
+
+                //
+                // Reset the child window size to account for scrollbars
+                //
+                if (pChild->GetScrollBarHorz() != NULLHANDLE)
+                    nHeightAdjust = 20;
+                if (pChild->GetScrollBarVert() != NULLHANDLE)
+                    nWidthAdjust = 20;
+                ::WinSetWindowPos( pChild->GetHWND()
+                                  ,HWND_TOP
+                                  ,vSwpChild.x
+                                  ,vSwpChild.y + nHeightAdjust
+                                  ,vSwpChild.cx - nWidthAdjust
+                                  ,vSwpChild.cy - nHeightAdjust
+                                  ,SWP_MOVE | SWP_SIZE
+                                 );
+
+                //
+                // Reset the scrollbar sizes...they will be all messed up after
+                // auto layouts
+                //
+                if (pChild->GetScrollBarHorz() != NULLHANDLE)
+                {
+                    ::WinSetWindowPos( pChild->GetScrollBarHorz()
+                                      ,HWND_TOP
+                                      ,vSwpClient.x + vSwpChild.x
+                                      ,vSwpClient.y + vSwpChild.y
+                                      ,vSwpChild.cx - 20
+                                      ,20
+                                      ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
+                                     );
+                }
+                if (pChild->GetScrollBarVert() != NULLHANDLE)
+                {
+                    ::WinSetWindowPos( pChild->GetScrollBarVert()
+                                      ,HWND_TOP
+                                      ,vSwpClient.x + vSwpChild.x + vSwpChild.cx - 20
+                                      ,vSwpClient.y + vSwpChild.y  + 20
+                                      ,20
+                                      ,vSwpChild.cy - 20
+                                      ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
+                                     );
+                }
+            }
+        }
+        ::WinQueryWindowPos(GetHwnd(), pFrame->GetSwpClient());
+    }
+} // end of wxWindowOS2::OS2Layout
+