X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9923c37dccb4e5dbe6387ceb3ab0a8202fadc231..d1da887276915d7b83dc7beff43bbe0deea35939:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index ea20d2de24..022caeb470 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -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() @@ -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";