]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
fix a bunch of warnings in unicode build
[wxWidgets.git] / src / os2 / window.cpp
index ea20d2de24c6b1326b18593e348d8cd37bd70c7a..6c57b9aa91ddcf612968e21c2285c628f2ba7b89 100644 (file)
@@ -180,7 +180,6 @@ static wxWindow*                    gpWinBeingCreated = NULL;
 BEGIN_EVENT_TABLE(wxWindowOS2, wxWindowBase)
     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground)
     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged)
-    EVT_INIT_DIALOG(wxWindowOS2::OnInitDialog)
     EVT_IDLE(wxWindowOS2::OnIdle)
     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus)
 END_EVENT_TABLE()
@@ -476,7 +475,7 @@ void wxWindowOS2::SetFocusFromKbd()
     wxWindowBase::SetFocusFromKbd();
 } // end of wxWindowOS2::SetFocus
 
-wxWindow* wxWindowBase::FindFocus()
+wxWindow* wxWindowBase::DoFindFocus()
 {
     HWND                            hWnd = ::WinQueryFocus(HWND_DESKTOP);
 
@@ -485,7 +484,7 @@ wxWindow* wxWindowBase::FindFocus()
         return wxFindWinFromHandle((WXHWND)hWnd);
     }
     return NULL;
-} // wxWindowBase::FindFocus
+} // wxWindowBase::DoFindFocus
 
 bool wxWindowOS2::Enable(
   bool                              bEnable
@@ -939,16 +938,14 @@ void wxWindowOS2::ScrollWindow(
 {
     RECTL                           vRect;
 
+    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    int                             height = vRect.yTop;
     if (pRect)
     {
         vRect.xLeft   = pRect->x;
-        vRect.yTop    = pRect->y + pRect->height;
+        vRect.yTop    = height - pRect->y;
         vRect.xRight  = pRect->x + pRect->width;
-        vRect.yBottom = pRect->y;
-    }
-    else
-    {
-        ::WinQueryWindowRect(GetHwnd(), &vRect);
+        vRect.yBottom = vRect.yTop - pRect->height;
     }
     nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
     ::WinScrollWindow( GetHwnd()
@@ -956,11 +953,10 @@ void wxWindowOS2::ScrollWindow(
                       ,(LONG)nDy
                       ,&vRect
                       ,&vRect
-                      ,NULLHANDLE
+                      ,NULL
                       ,NULL
                       ,SW_SCROLLCHILDREN | SW_INVALIDATERGN
                      );
-    Refresh();
 } // end of wxWindowOS2::ScrollWindow
 
 // ---------------------------------------------------------------------------
@@ -1087,7 +1083,7 @@ WXDWORD wxWindowOS2::OS2GetStyle(
 } // end of wxWindowMSW::MSWGetStyle
 
 //
-// Make a Windows extended style from the given wxWindows window style
+// Make a Windows extended style from the given wxWidgets window style
 //
 WXDWORD wxWindowOS2::MakeExtendedStyle(
   long                              lStyle
@@ -1221,11 +1217,14 @@ void wxWindowOS2::Refresh(
         if (pRect)
         {
             RECTL                   vOs2Rect;
+            int                     height;
 
+            ::WinQueryWindowRect(GetHwnd(), &vOs2Rect);
+           height = vOs2Rect.yTop;
             vOs2Rect.xLeft   = pRect->x;
-            vOs2Rect.yBottom = pRect->y;
+            vOs2Rect.yTop    = height - pRect->y;
             vOs2Rect.xRight  = pRect->x + pRect->width;
-            vOs2Rect.yTop    = pRect->y + pRect->height;
+            vOs2Rect.yBottom = vOs2Rect.yTop - pRect->height;
 
             ::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
         }
@@ -1955,10 +1954,18 @@ bool wxWindowOS2::DoPopupMenu(
 
     pMenu->SetInvokingWindow(this);
     pMenu->UpdateUI();
-
-    DoClientToScreen( &nX
-                     ,&nY
-                    );
+    
+    if ( nX == -1 && nY == -1 )
+    {
+        wxPoint mouse = wxGetMousePosition();
+        nX = mouse.x; nY = mouse.y;
+    }
+    else
+    {
+        DoClientToScreen( &nX
+                         ,&nY
+                        );
+    }
     wxCurrentPopupMenu = pMenu;
 
     ::WinPopupMenu( hWndParent
@@ -2269,7 +2276,7 @@ void wxWindowOS2::UnpackMenuSelect(
 } // end of wxWindowOS2::UnpackMenuSelect
 
 // ---------------------------------------------------------------------------
-// Main wxWindows window proc and the window proc for wxWindow
+// Main wxWidgets window proc and the window proc for wxWindow
 // ---------------------------------------------------------------------------
 
 //
@@ -2754,7 +2761,7 @@ MRESULT wxWindowOS2::OS2WindowProc(
                             break;
                         }
                         //
-                        // Simulate a WM_COMMAND here, as wxWindows expects all control
+                        // Simulate a WM_COMMAND here, as wxWidgets expects all control
                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
                         //
                         if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
@@ -2814,7 +2821,7 @@ MRESULT wxWindowOS2::OS2WindowProc(
                             break;
                         }
                         //
-                        // Simulate a WM_COMMAND here, as wxWindows expects all control
+                        // Simulate a WM_COMMAND here, as wxWidgets expects all control
                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
                         //
                         if (pWin->IsKindOf(CLASSINFO(wxListBox)))
@@ -3386,7 +3393,7 @@ bool wxWindowOS2::OS2OnDrawItem(
                   );
         vDc.SetHPS(pMeasureStruct->hps);
         //
-        // Load the wxWindows Pallete and set to RGB mode
+        // Load the wxWidgets Pallete and set to RGB mode
         //
         if (!::GpiCreateLogColorTable( pMeasureStruct->hps
                                       ,0L
@@ -3679,6 +3686,51 @@ bool wxWindowOS2::HandlePaint()
          return FALSE;
     }
 
+    // Get all the rectangles from the region, convert the individual
+    // rectangles to "the other" coordinate system and reassemble a
+    // region from the rectangles, to be feed into m_updateRegion.
+    //
+    // FIXME: This is a bad hack since OS/2 API specifies that rectangles
+    //         passed into GpiSetRegion must not have Bottom > Top,
+    //          however, at first sight, it _seems_ to work nonetheless.
+    //
+    RGNRECT                     vRgnData;
+    PRECTL                      pUpdateRects = NULL;
+    vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
+    if (::GpiQueryRegionRects( hPS          // Pres space
+                              ,hRgn         // Handle of region to query
+                              ,NULL         // Return all RECTs
+                              ,&vRgnData    // Will contain number or RECTs in region
+                              ,NULL         // NULL to return number of RECTs
+                             ))
+    {
+        pUpdateRects = new RECTL[vRgnData.crcReturned];
+        vRgnData.crc = vRgnData.crcReturned;
+        vRgnData.ircStart = 1;
+        if (::GpiQueryRegionRects( hPS      // Pres space of source
+                                  ,hRgn     // Handle of source region
+                                  ,NULL     // Return all RECTs
+                                  ,&vRgnData // Operations set to return rects
+                                  ,pUpdateRects // Will contain the actual RECTS
+                                 ))
+        {
+            int                     height;
+            RECT                    vRect;
+            ::WinQueryWindowRect(GetHwnd(), &vRect);
+            height = vRect.yTop;
+
+            for(size_t i = 0; i < vRgnData.crc; i++)
+            {
+                int                 rectHeight;
+                rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom;
+                pUpdateRects[i].yTop = height - pUpdateRects[i].yTop;
+                pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight;
+            }
+            ::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects);
+            delete [] pUpdateRects;
+        }
+    }
+
     m_updateRegion = wxRegion(hRgn, hPS);
 
     vEvent.SetEventObject(this);
@@ -3962,7 +4014,7 @@ void wxWindowOS2::InitMouseEvent(
     int                                 nHeight;
     DoGetSize(0, &nHeight);
     rEvent.m_x           = nX;
-    // Convert to wxWindows standard coordinate system!
+    // Convert to wxWidgets standard coordinate system!
     rEvent.m_y           = nHeight - nY;
     rEvent.m_shiftDown   = ((uFlags & KC_SHIFT) != 0);
     rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0);
@@ -4353,7 +4405,7 @@ void wxWindowOS2::MoveChildren(
                               ,vSwp.y - nDiff
                               ,vSwp.cx
                               ,vSwp.cy
-                              ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
+                              ,SWP_MOVE
                              );
             ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp());
             if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
@@ -4388,7 +4440,7 @@ void wxWindowOS2::MoveChildren(
 //
 //  Getting the Y position for a window, like a control, is a real
 //  pain.  There are three sitatuions we must deal with in determining
-//  the OS2 to wxWindows Y coordinate.
+//  the OS2 to wxWidgets Y coordinate.
 //
 //  1)  The controls are created in a dialog.
 //      This is the easiest since a dialog is created with its original
@@ -4900,7 +4952,7 @@ const char* wxGetMessageName(
         // Beginning of user defined messages
         case 0x1000: return "WM_USER";
 
-        // wxWindows user defined types
+        // wxWidgets user defined types
 
         // listview
         // case 0x1000 + 0: return "LVM_GETBKCOLOR";