X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4a712ba3cfe27e8d39ee8fe8691ff67d1c96cb43..f5766910b6731eb03e82371416e9778203396ce7:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 8b37718764..c41347074c 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: windows.cpp +// Name: src/os2/window.cpp // Purpose: wxWindow // Author: David Webster // Modified by: @@ -14,13 +14,13 @@ // #include "wx/wxprec.h" +#include "wx/window.h" + #ifndef WX_PRECOMP #define INCL_DOS #define INCL_PM #include - #include "wx/window.h" #include "wx/accel.h" - #include "wx/setup.h" #include "wx/menu.h" #include "wx/dc.h" #include "wx/dcclient.h" @@ -44,10 +44,14 @@ #include "wx/statusbr.h" #include "wx/toolbar.h" #include "wx/settings.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/textctrl.h" + #include "wx/menuitem.h" #include #endif -#if wxUSE_OWNER_DRAWN +#if wxUSE_OWNER_DRAWN #include "wx/ownerdrw.h" #endif @@ -55,9 +59,6 @@ #include "wx/dnd.h" #endif -#include "wx/menuitem.h" -#include "wx/log.h" - #include "wx/os2/private.h" #if wxUSE_TOOLTIPS @@ -72,12 +73,6 @@ #include "wx/caret.h" #endif // wxUSE_CARET -#include "wx/intl.h" -#include "wx/log.h" - - -#include "wx/textctrl.h" - #include // @@ -159,8 +154,9 @@ wxWindow* wxFindWinFromHandle(WXHWND hWnd); // // get the current state of SHIFT/CTRL keys // -static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000) != 0; } -static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) != 0; } +static inline bool IsKeyDown(LONG key) {return (::WinGetKeyState(HWND_DESKTOP, key) & 0x8000) != 0; } +static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT); } +static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL); } static wxWindow* gpWinBeingCreated = NULL; @@ -410,9 +406,7 @@ bool wxWindowOS2::Create( wxWindow* pParent, pParent->AddChild(this); hParent = GetWinHwnd(pParent); - if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) || - pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) - ) + if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow))) ulCreateFlags |= WS_CLIPSIBLINGS; } @@ -576,15 +570,15 @@ void wxWindowOS2::Lower() ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE); } // end of wxWindowOS2::Lower -void wxWindowOS2::SetTitle( const wxString& rTitle ) +void wxWindowOS2::SetLabel( const wxString& label ) { - ::WinSetWindowText(GetHwnd(), (PSZ)rTitle.c_str()); -} // end of wxWindowOS2::SetTitle + ::WinSetWindowText(GetHwnd(), (PSZ)label.c_str()); +} // end of wxWindowOS2::SetLabel -wxString wxWindowOS2::GetTitle() const +wxString wxWindowOS2::GetLabel() const { return wxGetWindowText(GetHWND()); -} // end of wxWindowOS2::GetTitle +} // end of wxWindowOS2::GetLabel void wxWindowOS2::DoCaptureMouse() { @@ -595,7 +589,7 @@ void wxWindowOS2::DoCaptureMouse() ::WinSetCapture(HWND_DESKTOP, hWnd); m_bWinCaptured = true; } -} // end of wxWindowOS2::GetTitle +} // end of wxWindowOS2::DoCaptureMouse void wxWindowOS2::DoReleaseMouse() { @@ -727,6 +721,10 @@ void wxWindowOS2::SetScrollbar( int nOrient, int nOldRange = nRange - nThumbVisible; int nRange1 = nOldRange; int nPageSize = nThumbVisible; + int nVSBWidth = wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X, + this); + int nHSBHeight = wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y, + this); SBCDATA vInfo; ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT; @@ -788,8 +786,8 @@ void wxWindowOS2::SetScrollbar( int nOrient, ,ulStyle ,vSwp.x ,vSwp.y - ,vSwp.cx - 20 - ,20 + ,vSwp.cx - nVSBWidth + ,nHSBHeight ,hWnd ,HWND_TOP ,60000 @@ -806,18 +804,19 @@ void wxWindowOS2::SetScrollbar( int nOrient, // origin, not the frame's client window origin. // The starting x position is the same as the starting x position // of the owner, but in terms of the parent frame. - // The starting y position is 20 pels below the origin of the - // owner in terms of the parent frame. - // The horz bar is the same width as the owner and 20 pels high. + // The starting y position is wxSYS_HSCROLL_Y pels below the + // origin of the owner in terms of the parent frame. + // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y + // pels high. // if (nRange1 >= nThumbVisible) { ::WinSetWindowPos( m_hWndScrollBarHorz ,HWND_TOP ,vSwp.x + vSwpOwner.x - ,(vSwp.y + vSwpOwner.y) - 20 + ,(vSwp.y + vSwpOwner.y) - nHSBHeight ,vSwpOwner.cx - ,20 + ,nHSBHeight ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER ); ::WinSendMsg( m_hWndScrollBarHorz @@ -858,10 +857,10 @@ void wxWindowOS2::SetScrollbar( int nOrient, ,WC_SCROLLBAR ,(PSZ)NULL ,ulStyle - ,vSwp.x + vSwp.cx - 20 - ,vSwp.y + 20 - ,20 - ,vSwp.cy - 20 + ,vSwp.x + vSwp.cx - nVSBWidth + ,vSwp.y + nHSBHeight + ,nVSBWidth + ,vSwp.cy - nHSBHeight ,hWnd ,HWND_TOP ,60001 @@ -884,7 +883,7 @@ void wxWindowOS2::SetScrollbar( int nOrient, // position of the scrollbar relative to the parent frame (the vert // scrollbar is on the right and starts at the bottom of the // owner window). - // It is 20 pels wide and the same height as the owner. + // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. // if (nRange1 >= nThumbVisible) { @@ -892,7 +891,7 @@ void wxWindowOS2::SetScrollbar( int nOrient, ,HWND_TOP ,vSwp.x + vSwpOwner.x + vSwpOwner.cx ,vSwp.y + vSwpOwner.y - ,20 + ,nVSBWidth ,vSwpOwner.cy ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ); @@ -1296,7 +1295,10 @@ void wxWindowOS2::DoGetPosition( , int* pY ) const { - HWND hWnd = GetHwnd(); + // + // Return parameters assume wxWidgets coordinate system + // + HWND hWnd; SWP vSwp; POINTL vPoint; wxWindow* pParent = GetParent(); @@ -1306,17 +1308,30 @@ void wxWindowOS2::DoGetPosition( // the WIN32 WinGetRect, but unlike WinGetRect which returns the window // origin position in screen coordinates, WinQueryWindowRect returns it // relative to itself, i.e. (0,0). To get the same under PM we must - // us WinQueryWindowPos. This call, unlike the WIN32 call, however, + // use WinQueryWindowPos. This call, unlike the WIN32 call, however, // returns a position relative to it's parent, so no parent adujstments // are needed under OS/2. Also, windows should be created using - // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already - // reflect that. + // wxWindow coordinates, i.e 0,0 is the TOP left. // + if (IsKindOf(CLASSINFO(wxFrame))) + { + wxFrame* pFrame = wxDynamicCast(this, wxFrame); + hWnd = pFrame->GetFrame(); + } + else + hWnd = GetHwnd(); + ::WinQueryWindowPos(hWnd, &vSwp); vPoint.x = vSwp.x; vPoint.y = vSwp.y; + // We need to convert to wxWidgets coordinates + int vHeight; + DoGetSize(NULL,&vHeight); + wxWindow* pWindow = wxDynamicCast(this,wxWindow); + vPoint.y = pWindow->GetOS2ParentHeight(pParent) - vPoint.y - vHeight; + // // We may be faking the client origin. So a window that's really at (0, // 30) may appear (to wxWin apps) to be at (0, 0). @@ -1448,18 +1463,12 @@ void wxWindowOS2::DoMoveWindow( , int nHeight ) { + // + // Input parameters assume wxWidgets coordinate system + // RECTL vRect; wxWindow* pParent = GetParent(); - - /* Due to OS/2's inverted coordinate system, changing the height - of a window requires repositioning all it's children, e.g. if - you want a child of height 100 to be at the top left corner of - the parent you need to position the lower left corner of the - child at (0, (height of parent - 100)), so, obviously, if the - height of the parent changes, the child needs to be repositioned. */ - int nHeightDelta; - GetSize(0, &nHeightDelta); - nHeightDelta = nHeight - nHeightDelta; + HWND hWnd = GetHwnd(); if (pParent && !IsKindOf(CLASSINFO(wxDialog))) { @@ -1489,64 +1498,26 @@ void wxWindowOS2::DoMoveWindow( if (IsKindOf(CLASSINFO(wxFrame))) { RECTL vFRect; - HWND hWndFrame; int nWidthFrameDelta = 0; int nHeightFrameDelta = 0; - int nHeightFrame = 0; - int nWidthFrame = 0; wxFrame* pFrame; pFrame = wxDynamicCast(this, wxFrame); - hWndFrame = pFrame->GetFrame(); - ::WinQueryWindowRect(hWndFrame, &vRect); - ::WinMapWindowPoints(hWndFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2); + hWnd = pFrame->GetFrame(); + ::WinQueryWindowRect(hWnd, &vRect); + ::WinMapWindowPoints(hWnd, HWND_DESKTOP, (PPOINTL)&vRect, 2); vFRect = vRect; - ::WinCalcFrameRect(hWndFrame, &vRect, TRUE); + ::WinCalcFrameRect(hWnd, &vRect, TRUE); nWidthFrameDelta = ((vRect.xLeft - vFRect.xLeft) + (vFRect.xRight - vRect.xRight)); nHeightFrameDelta = ((vRect.yBottom - vFRect.yBottom) + (vFRect.yTop - vRect.yTop)); - nWidthFrame = vFRect.xRight - vFRect.xLeft; - nHeightFrame = vFRect.yTop - vFRect.yBottom; - - if (nWidth == vFRect.xRight - vFRect.xLeft && - nHeight == vFRect.yTop - vFRect.yBottom) - { - // - // In this case the caller is not aware of OS/2's need to size both - // the frame and it's client and is really only moving the window, - // not resizeing it. So move the frame, and back off the sizes - // for a proper client fit. - // - ::WinSetWindowPos( hWndFrame - ,HWND_TOP - ,(LONG)nX - (vRect.xLeft - vFRect.xLeft) - ,(LONG)nY - (vRect.yBottom - vFRect.yBottom) - ,(LONG)0 - ,(LONG)0 - ,SWP_MOVE - ); - nX += (vRect.xLeft - vFRect.xLeft); - nY += (vRect.yBottom - vFRect.yBottom); - nWidth -= nWidthFrameDelta; - nHeight -= nHeightFrameDelta; - } - else - { - if (nWidth > nWidthFrame - nHeightFrameDelta || - nHeight > nHeightFrame - nHeightFrameDelta) - { - ::WinSetWindowPos( hWndFrame - ,HWND_TOP - ,(LONG)nX - (vRect.xLeft - vFRect.xLeft) - ,(LONG)nY - (vRect.yBottom - vFRect.yBottom) - ,(LONG)nWidth + nWidthFrameDelta - ,(LONG)nHeight + nHeightFrameDelta - ,SWP_MOVE | SWP_SIZE - ); - } - } + // Input values refer to the window position relative to its parent + // which may be the Desktop so we need to calculate + // the new frame values to keep the wxWidgets frame origin constant + nY -= nHeightFrameDelta; + nWidth += nWidthFrameDelta; + nHeight += nHeightFrameDelta; } - - ::WinSetWindowPos( GetHwnd() + ::WinSetWindowPos( hWnd ,HWND_TOP ,(LONG)nX ,(LONG)nY @@ -1558,17 +1529,15 @@ void wxWindowOS2::DoMoveWindow( // // Uninitialized // - ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp); + ::WinQueryWindowPos(hWnd, &m_vWinSwp); else { - int nYDiff = m_vWinSwp.cy - nHeight; - // // Handle resizing of scrolled windows. The target or window to - // be scrolled is the owner (gets the scroll notificaitons). The + // be scrolled is the owner (gets the scroll notifications). The // parent is usually the parent frame of the scrolled panel window. // In order to show the scrollbars the target window will be shrunk - // by the size of the scroll bar widths (20) and moved in the X and Y + // by the size of the scroll bar widths and moved in the X and Y // directon. That value will be computed as part of the diff for // moving the children. Everytime the window is sized the // toplevel OnSize is going to resize the panel to fit the client @@ -1577,26 +1546,28 @@ void wxWindowOS2::DoMoveWindow( // which will cause the scrollbars to be displayed via the SetScrollbar // call in CWindow. // - if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow)) || - IsKindOf(CLASSINFO(wxScrolledWindow)) - ) + if (IsKindOf(CLASSINFO(wxScrolledWindow))) { int nAdjustWidth = 0; int nAdjustHeight = 0; + int nHSBHeight = wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y, + this); + int nVSBWidth = wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X, + this); SWP vSwpScroll; if (GetScrollBarHorz() == NULLHANDLE || !WinIsWindowShowing(GetScrollBarHorz())) nAdjustHeight = 0L; else - nAdjustHeight = 20L; + nAdjustHeight = nHSBHeight; if (GetScrollBarVert() == NULLHANDLE || !WinIsWindowShowing(GetScrollBarVert())) nAdjustWidth = 0L; else - nAdjustWidth = 20L; - ::WinQueryWindowPos(GetHWND(), &vSwpScroll); - ::WinSetWindowPos( GetHWND() + nAdjustWidth = nVSBWidth; + ::WinQueryWindowPos(hWnd, &vSwpScroll); + ::WinSetWindowPos( hWnd ,HWND_TOP ,vSwpScroll.x ,vSwpScroll.y + nAdjustHeight @@ -1604,19 +1575,9 @@ void wxWindowOS2::DoMoveWindow( ,vSwpScroll.cy - nAdjustHeight ,SWP_MOVE | SWP_SIZE ); - nYDiff -= nAdjustHeight; } - MoveChildren(nYDiff); - ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp); + ::WinQueryWindowPos(hWnd, &m_vWinSwp); } -#if 0 - // FIXME: By my logic, the next line should be needed as it moves child - // windows when resizing the parent (see comment at beginning of - // function). However, this seems to cause lots of problems. At - // least, e.g. the grid sample almost works with this line - // commented out but crashes badly with it. - MoveChildren(nHeightDelta); -#endif } // end of wxWindowOS2::DoMoveWindow // @@ -1635,6 +1596,10 @@ void wxWindowOS2::DoSetSize( int nX, int nHeight, int nSizeFlags ) { + // + // Input & output parameters assume wxWidgets coordinate system + // + // // Get the current size and position... // @@ -1650,12 +1615,7 @@ void wxWindowOS2::DoSetSize( int nX, // // ... and don't do anything (avoiding flicker) if it's already ok // - // - // Must convert Y coords to test for equality under OS/2 - // - int nY2 = nY; - - if (nX == nCurrentX && nY2 == nCurrentY && + if (nX == nCurrentX && nY == nCurrentY && nWidth == nCurrentWidth && nHeight == nCurrentHeight) { return; @@ -1707,50 +1667,15 @@ void wxWindowOS2::DoSetSize( int nX, void wxWindowOS2::DoSetClientSize( int nWidth, int nHeight ) { - POINTL vPoint; - int nActualWidth; - int nActualHeight; - wxWindow* pParent = (wxWindow*)GetParent(); - HWND hParentWnd = (HWND)0; - - if (pParent) - hParentWnd = (HWND)pParent->GetHWND(); - - if (IsKindOf(CLASSINFO(wxFrame))) - { - wxFrame* pFrame = wxDynamicCast(this, wxFrame); - HWND hFrame = pFrame->GetFrame(); - RECTL vRect; - RECTL vRect2; - RECTL vRect3; - - ::WinQueryWindowRect(GetHwnd(), &vRect2); - ::WinQueryWindowRect(hFrame, &vRect); - ::WinQueryWindowRect(hParentWnd, &vRect3); - nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth; - nActualHeight = vRect2.yTop - vRect2.yBottom - vRect.yTop + nHeight; - - vPoint.x = vRect2.xLeft; - vPoint.y = vRect2.yBottom; - if (pParent) - { - vPoint.x -= vRect3.xLeft; - vPoint.y -= vRect3.yBottom; - } - } - else - { - int nX; - int nY; + // + // nX & nY assume wxWidgets coordinate system + // + int nX; + int nY; - GetPosition(&nX, &nY); - nActualWidth = nWidth; - nActualHeight = nHeight; + GetPosition(&nX, &nY); - vPoint.x = nX; - vPoint.y = nY; - } - DoMoveWindow( vPoint.x, vPoint.y, nActualWidth, nActualHeight ); + DoMoveWindow( nX, nY, nWidth, nHeight ); wxSize size( nWidth, nHeight ); wxSizeEvent vEvent( size, m_windowId ); @@ -1813,7 +1738,7 @@ void wxWindowOS2::GetTextExtent( const wxString& rString, hPS = ::WinGetPS(GetHwnd()); - l = rString.Length(); + l = rString.length(); if (l > 0L) { pStr = (PCH)rString.c_str(); @@ -1821,12 +1746,12 @@ void wxWindowOS2::GetTextExtent( const wxString& rString, // // In world coordinates. // - bRc = ::GpiQueryTextBox( hPS - ,l - ,pStr - ,TXTBOX_COUNT // return maximum information - ,avPoint // array of coordinates points - ); + bRc = ::GpiQueryTextBox( hPS, + l, + pStr, + TXTBOX_COUNT,// return maximum information + avPoint // array of coordinates points + ); if (bRc) { vPtMin.x = avPoint[0].x; @@ -1914,9 +1839,7 @@ bool wxWindowOS2::IsMouseInWindow() const // --------------------------------------------------------------------------- // #if wxUSE_MENUS_NATIVE -bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu, - int nX, - int nY ) +bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu, int nX, int nY ) { HWND hWndOwner = GetHwnd(); HWND hWndParent = GetHwnd(); @@ -2098,9 +2021,13 @@ bool wxWindowOS2::OS2ProcessMessage( WXMSG* pMsg ) } else { - wxButton* pBtn = wxDynamicCast( GetDefaultItem() - ,wxButton - ); + wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + wxButton* pBtn = NULL; + + if (tlw) + { + pBtn = wxDynamicCast(tlw->GetDefaultItem(), wxButton); + } if (pBtn && pBtn->IsEnabled()) { @@ -2469,9 +2396,6 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg, case WM_BUTTON3MOTIONEND: case WM_BUTTON3MOTIONSTART: { - if (uMsg == WM_BUTTON1DOWN && AcceptsFocus()) - SetFocus(); - short nX = LOWORD(wParam); short nY = HIWORD(wParam); @@ -2717,6 +2641,7 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg, } break; + case CBN_LBSELECT: case BN_CLICKED: // Dups as LN_SELECT and CBN_LBSELECT { HWND hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam)); @@ -2773,11 +2698,19 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg, ,(WXWORD)SHORT1FROMMP(wParam) ); } + if (pWin->IsKindOf(CLASSINFO(wxChoice))) + { + wxChoice* pChoice = wxDynamicCast(pWin, wxChoice); + + pChoice->OS2Command( (WXUINT)SHORT2FROMMP(wParam) + ,(WXWORD)SHORT1FROMMP(wParam) + ); + } return 0; } // break; - case LN_ENTER: /* dups as CBN_EFCHANGE */ + case LN_ENTER: { HWND hWnd = HWNDFROMMP(lParam); wxWindowOS2* pWin = wxFindWinFromHandle(hWnd); @@ -2981,16 +2914,16 @@ void wxAssociateWinWithHandle( wxCHECK_RET( hWnd != (HWND)NULL, wxT("attempt to add a NULL hWnd to window list ignored") ); - wxWindow* pOldWin = wxFindWinFromHandle((WXHWND) hWnd); if (pOldWin && (pOldWin != pWin)) { - wxString str(pWin->GetClassInfo()->GetClassName()); - - wxLogError( _T("Bug! Found existing HWND %X for new window of class %s") - ,(int)hWnd - ,str.c_str() + wxString Newstr(pWin->GetClassInfo()->GetClassName()); + wxString Oldstr(pOldWin->GetClassInfo()->GetClassName()); + wxLogError( _T("Bug! New window of class %s has same HWND %X as old window of class %s"), + Newstr.c_str(), + (int)hWnd, + Oldstr.c_str() ); } else if (!pOldWin) @@ -3120,7 +3053,7 @@ bool wxWindowOS2::OS2Create( PSZ zClass, SubclassWin(m_hWnd); SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - m_backgroundColour.Set(wxString(wxT("GREY"))); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); LONG lColor = (LONG)m_backgroundColour.GetPixel(); @@ -3141,7 +3074,7 @@ bool wxWindowOS2::OS2Create( PSZ zClass, ,nHeight ); return true; -} // end of WinGuiBase_Window::OS2Create +} // end of wxWindowOS2::OS2Create // =========================================================================== // OS2 PM message handlers @@ -3369,7 +3302,7 @@ bool wxWindowOS2::OS2OnDrawItem( int vId, { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str()); + wxLogError(_T("Unable to set current color table (1). Error: %s\n"), sError.c_str()); } // // Set the color table to RGB mode @@ -3384,7 +3317,7 @@ bool wxWindowOS2::OS2OnDrawItem( int vId, { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str()); + wxLogError(_T("Unable to set current color table (2). Error: %s\n"), sError.c_str()); } wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); @@ -3644,15 +3577,10 @@ bool wxWindowOS2::HandlePaint() wxLogLastError(wxT("CreateRectRgn")); 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; @@ -3682,14 +3610,13 @@ bool wxWindowOS2::HandlePaint() { int rectHeight; rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom; - pUpdateRects[i].yTop = height - pUpdateRects[i].yTop; - pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight; + pUpdateRects[i].yBottom = height - pUpdateRects[i].yTop; + pUpdateRects[i].yTop = pUpdateRects[i].yBottom + rectHeight; } ::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects); delete [] pUpdateRects; } } - m_updateRegion = wxRegion(hRgn, hPS); vEvent.SetEventObject(this); @@ -3811,7 +3738,6 @@ bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC ) vDC.m_hPS = (HPS)hDC; // this is really a PS vDC.SetWindow((wxWindow*)this); - vDC.BeginDrawing(); wxEraseEvent vEvent(m_windowId, &vDC); @@ -3819,19 +3745,16 @@ bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC ) rc = GetEventHandler()->ProcessEvent(vEvent); - vDC.EndDrawing(); vDC.m_hPS = NULLHANDLE; return true; } // end of wxWindowOS2::HandleEraseBkgnd -void wxWindowOS2::OnEraseBackground( - wxEraseEvent& rEvent -) +void wxWindowOS2::OnEraseBackground(wxEraseEvent& rEvent) { - RECTL vRect; - HPS hPS = rEvent.m_dc->m_hPS; - APIRET rc; - LONG lColor = m_backgroundColour.GetPixel(); + RECTL vRect; + HPS hPS = rEvent.GetDC()->GetHPS(); + APIRET rc; + LONG lColor = m_backgroundColour.GetPixel(); rc = ::WinQueryWindowRect(GetHwnd(), &vRect); rc = ::WinFillRect(hPS, &vRect, lColor); @@ -3884,25 +3807,15 @@ bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp ) switch(pSwp->fl) { case SWP_MAXIMIZE: -#if !(defined(__WATCOMC__) && __WATCOMC__ < 1240 ) -// Open Watcom 1.3 had incomplete headers -// that's reported and should be fixed for OW 1.4 ::WinGetMaxPosition(GetHwnd(), pSwp); m_maxWidth = pSwp->cx; m_maxHeight = pSwp->cy; -#endif break; case SWP_MINIMIZE: -#if !(defined(__WATCOMC__) && __WATCOMC__ < 1240 ) -// Open Watcom 1.3 had incomplete headers -// that's reported and should be fixed for OW 1.4 ::WinGetMinPosition(GetHwnd(), pSwp, &vPoint); m_minWidth = pSwp->cx; m_minHeight = pSwp->cy; -#else - wxUnusedVar(vPoint); -#endif break; default: @@ -3961,7 +3874,7 @@ bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam, // --------------------------------------------------------------------------- // mouse events // --------------------------------------------------------------------------- -//TODO!!! check against MSW +//TODO: check against MSW void wxWindowOS2::InitMouseEvent( wxMouseEvent& rEvent , int nX @@ -3977,12 +3890,9 @@ void wxWindowOS2::InitMouseEvent( rEvent.m_shiftDown = ((uFlags & KC_SHIFT) != 0); rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0); rEvent.m_altDown = ((uFlags & KC_ALT) != 0); - rEvent.m_leftDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) & - 0x8000) != 0; - rEvent.m_middleDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) & - 0x8000) != 0; - rEvent.m_rightDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) & - 0x8000) != 0; + rEvent.m_leftDown = IsKeyDown(VK_BUTTON1); + rEvent.m_middleDown = IsKeyDown(VK_BUTTON3); + rEvent.m_rightDown = IsKeyDown(VK_BUTTON2); rEvent.SetTimestamp(s_currentMsg.time); rEvent.SetEventObject(this); rEvent.SetId(GetId()); @@ -4310,88 +4220,9 @@ bool wxWindowOS2::OS2OnScroll( int nOrientation, return GetEventHandler()->ProcessEvent(vEvent); } // end of wxWindowOS2::OS2OnScroll -void wxWindowOS2::MoveChildren( - int nDiff -) -{ - // - // We want to handle top levels ourself, manually - // - if (!IsTopLevel() && GetAutoLayout()) - { - Layout(); - } - else - { - SWP vSwp; - - for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - node; - node = node->GetNext()) - { - wxWindow* pWin = node->GetData(); - - ::WinQueryWindowPos( GetHwndOf(pWin) - ,&vSwp - ); - // Actually, only move children that already are placed on the - // frame, not ones which are still at wxDefaultCoord. - if (vSwp.y == wxDefaultCoord) - continue; - if (pWin->IsKindOf(CLASSINFO(wxControl))) - { - wxControl* pCtrl; - - // - // Must deal with controls that have margins like ENTRYFIELD. The SWP - // struct of such a control will have and origin offset from its intended - // position by the width of the margins. - // - pCtrl = wxDynamicCast(pWin, wxControl); - vSwp.y -= pCtrl->GetYComp(); - vSwp.x -= pCtrl->GetXComp(); - } - ::WinSetWindowPos( GetHwndOf(pWin) - ,HWND_TOP - ,vSwp.x - ,vSwp.y - nDiff - ,vSwp.cx - ,vSwp.cy - ,SWP_MOVE - ); - ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp()); - if (pWin->IsKindOf(CLASSINFO(wxRadioBox))) - { - wxRadioBox* pRadioBox; - - pRadioBox = wxDynamicCast(pWin, wxRadioBox); - pRadioBox->AdjustButtons( (int)vSwp.x - ,(int)vSwp.y - nDiff - ,(int)vSwp.cx - ,(int)vSwp.cy - ,pRadioBox->GetSizeFlags() - ); - } - if (pWin->IsKindOf(CLASSINFO(wxSlider))) - { - wxSlider* pSlider; - - pSlider = wxDynamicCast(pWin, wxSlider); - pSlider->AdjustSubControls( (int)vSwp.x - ,(int)vSwp.y - nDiff - ,(int)vSwp.cx - ,(int)vSwp.cy - ,(int)pSlider->GetSizeFlags() - ); - } - } - } - Refresh(); -} // end of 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 +// pain. There are three situations we must deal with in determining // the OS2 to wxWidgets Y coordinate. // // 1) The controls are created in a dialog. @@ -4422,11 +4253,13 @@ void wxWindowOS2::MoveChildren( // int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2* pParent ) { + if (pParent) + { // // Case 1 // - if (pParent->IsKindOf(CLASSINFO(wxDialog))) - return(pParent->GetClientSize().y); + if (pParent->IsKindOf(CLASSINFO(wxDialog))) + return(pParent->GetClientSize().y); // // Case 2 -- if we are one of the separately built standard Frame @@ -4434,40 +4267,43 @@ int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2* pParent ) // use the frame, itself, for positioning. Otherwise we are // child window and want to use the Frame's client. // - else if (pParent->IsKindOf(CLASSINFO(wxFrame))) - { - if (IsKindOf(CLASSINFO(wxStatusBar)) || - IsKindOf(CLASSINFO(wxMenuBar)) || - IsKindOf(CLASSINFO(wxToolBar)) - ) + else if (pParent->IsKindOf(CLASSINFO(wxFrame))) { - if (IsKindOf(CLASSINFO(wxToolBar))) + if (IsKindOf(CLASSINFO(wxStatusBar)) || + IsKindOf(CLASSINFO(wxMenuBar)) || + IsKindOf(CLASSINFO(wxToolBar)) + ) { - wxFrame* pFrame = wxDynamicCast(GetParent(), wxFrame); + if (IsKindOf(CLASSINFO(wxToolBar))) + { + wxFrame* pFrame = wxDynamicCast(GetParent(), wxFrame); - if (pFrame->GetToolBar() == this) - return(pParent->GetSize().y); + if (pFrame->GetToolBar() == this) + return(pParent->GetSize().y); + else + return(pParent->GetClientSize().y); + } else - return(pParent->GetClientSize().y); + return(pParent->GetSize().y); } else - return(pParent->GetSize().y); + return(pParent->GetClientSize().y); } + // + // Case -- this is for any window that is the sole child of a Frame. + // The grandparent must exist and it must be of type CFrame + // and it's height must be different. Otherwise the standard + // applies. + // else return(pParent->GetClientSize().y); } - // - // Case -- this is for any window that is the sole child of a Frame. - // The grandparent must exist and it must be of type CFrame - // and it's height must be different. Otherwise the standard - // applies. - // - // else - // { - - return(pParent->GetClientSize().y); - - // } + else // We must be a child of the screen + { + int nHeight; + wxDisplaySize(NULL,&nHeight); + return(nHeight); + } } // end of wxWindowOS2::GetOS2ParentHeight // @@ -4541,8 +4377,8 @@ int wxCharCodeOS2ToWX( case VK_CTRL: nId = WXK_CONTROL; break; case VK_PAUSE: nId = WXK_PAUSE; break; case VK_SPACE: nId = WXK_SPACE; break; - case VK_PAGEUP: nId = WXK_PRIOR; break; - case VK_PAGEDOWN: nId = WXK_NEXT; break; + case VK_PAGEUP: nId = WXK_PAGEUP; break; + case VK_PAGEDOWN: nId = WXK_PAGEDOWN; break; case VK_ESC: nId = WXK_ESCAPE; break; case VK_END: nId = WXK_END; break; case VK_HOME : nId = WXK_HOME; break; @@ -4604,15 +4440,16 @@ int wxCharCodeWXToOS2( int nId, { int nKeySym = 0; - *bIsVirtual = true; + if ( bIsVirtual ) + *bIsVirtual = true; switch (nId) { case WXK_CLEAR: nKeySym = VK_CLEAR; break; case WXK_SHIFT: nKeySym = VK_SHIFT; break; case WXK_CONTROL: nKeySym = VK_CTRL; break; case WXK_PAUSE: nKeySym = VK_PAUSE; break; - case WXK_PRIOR: nKeySym = VK_PAGEUP; break; - case WXK_NEXT : nKeySym = VK_PAGEDOWN; break; + case WXK_PAGEUP: nKeySym = VK_PAGEUP; break; + case WXK_PAGEDOWN: nKeySym = VK_PAGEDOWN; break; case WXK_END: nKeySym = VK_END; break; case WXK_HOME : nKeySym = VK_HOME; break; case WXK_LEFT : nKeySym = VK_LEFT; break; @@ -4650,7 +4487,8 @@ int wxCharCodeWXToOS2( int nId, case WXK_SCROLL: nKeySym = VK_SCRLLOCK; break; default: { - *bIsVirtual = false; + if ( bIsVirtual ) + *bIsVirtual = false; nKeySym = nId; break; } @@ -4658,6 +4496,29 @@ int wxCharCodeWXToOS2( int nId, return nKeySym; } // end of wxCharCodeWXToOS2 + +bool wxGetKeyState(wxKeyCode key) +{ + wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key != + WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons")); + + const LONG vk = wxCharCodeWXToOS2(key); + // if the requested key is a LED key, return true if the led is pressed + if ( key == WXK_NUMLOCK || key == WXK_CAPITAL || key == WXK_SCROLL ) + { + // low order bit means LED is highlighted and high order one means the + // key is down; for compatibility with the other ports return true if + // either one is set + return ::WinGetKeyState(HWND_DESKTOP, vk) != 0; + + } + else // normal key + { + return IsKeyDown(vk); + } +} + + wxWindow* wxGetActiveWindow() { HWND hWnd = ::WinQueryActiveWindow(HWND_DESKTOP); @@ -5126,7 +4987,7 @@ const wxChar* wxGetMessageName( int nMessage ) } static wxString s_szBuf; - s_szBuf.Printf(wxT(""), message); + s_szBuf.Printf(wxT(""), nMessage); return s_szBuf.c_str(); } // end of wxGetMessageName @@ -5167,25 +5028,21 @@ static void TranslateKbdEventToMouse( // Find the wxWindow at the current mouse position, returning the mouse // position. -wxWindow* wxFindWindowAtPointer( - wxPoint& WXUNUSED(rPt) -) +wxWindow* wxFindWindowAtPointer(wxPoint& WXUNUSED(rPt)) { return wxFindWindowAtPoint(wxGetMousePosition()); } -wxWindow* wxFindWindowAtPoint( - const wxPoint& rPt -) +wxWindow* wxFindWindowAtPoint(const wxPoint& rPt) { - POINTL vPt2; + POINTL vPt2; vPt2.x = rPt.x; vPt2.y = rPt.y; - HWND hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE); - wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ; - HWND hWnd = hWndHit; + HWND hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE); + wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ; + HWND hWnd = hWndHit; // // Try to find a window with a wxWindow associated with it @@ -5201,12 +5058,29 @@ wxWindow* wxFindWindowAtPoint( // Get the current mouse position. wxPoint wxGetMousePosition() { - POINTL vPt; + POINTL vPt; ::WinQueryPointerPos(HWND_DESKTOP, &vPt); return wxPoint(vPt.x, vPt.y); } +wxMouseState wxGetMouseState() +{ + wxMouseState ms; + wxPoint pt = wxGetMousePosition(); + ms.SetX(pt.x); + ms.SetY(pt.y); + ms.SetLeftDown(IsKeyDown(VK_BUTTON1)); + ms.SetMiddleDown(IsKeyDown(VK_BUTTON3)); + ms.SetRightDown(IsKeyDown(VK_BUTTON2)); + ms.SetControlDown(IsCtrlDown()); + ms.SetShiftDown(IsShiftDown()); + ms.SetAltDown(IsKeyDown(VK_ALT)|IsKeyDown(VK_ALTGRAF)); + ms.SetMetaDown(IsKeyDown(VK_ALTGRAF)); + return ms; +} + + wxWindowOS2* FindWindowForMouseEvent( wxWindow* pWin, short* WXUNUSED(pnX), short* WXUNUSED(pnY) )