X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/80a07196b3b9bdafcb36f99ec43accdda3113faa..6bb09706724534c42465f9ecf46a4a7e7ff08c30:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 022caeb470..08b942a312 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -475,7 +475,7 @@ void wxWindowOS2::SetFocusFromKbd() wxWindowBase::SetFocusFromKbd(); } // end of wxWindowOS2::SetFocus -wxWindow* wxWindowBase::FindFocus() +wxWindow* wxWindowBase::DoFindFocus() { HWND hWnd = ::WinQueryFocus(HWND_DESKTOP); @@ -484,7 +484,7 @@ wxWindow* wxWindowBase::FindFocus() return wxFindWinFromHandle((WXHWND)hWnd); } return NULL; -} // wxWindowBase::FindFocus +} // wxWindowBase::DoFindFocus bool wxWindowOS2::Enable( bool bEnable @@ -1472,6 +1472,16 @@ void wxWindowOS2::DoMoveWindow( 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; + if (pParent && !IsKindOf(CLASSINFO(wxDialog))) { int nOS2Height = GetOS2ParentHeight(pParent); @@ -1620,6 +1630,7 @@ void wxWindowOS2::DoMoveWindow( MoveChildren(nYDiff); ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp); } + MoveChildren(nHeightDelta); } // end of wxWindowOS2::DoMoveWindow // @@ -1951,10 +1962,15 @@ bool wxWindowOS2::DoPopupMenu( HWND hWndParent = GetHwnd(); HWND hMenu = GetHmenuOf(pMenu); bool bIsWaiting = TRUE; + int nHeight; + + // Protect against recursion + if (wxCurrentPopupMenu) + return false; pMenu->SetInvokingWindow(this); pMenu->UpdateUI(); - + if ( nX == -1 && nY == -1 ) { wxPoint mouse = wxGetMousePosition(); @@ -1965,6 +1981,8 @@ bool wxWindowOS2::DoPopupMenu( DoClientToScreen( &nX ,&nY ); + DoGetSize(0,&nHeight); + nY = nHeight - nY; } wxCurrentPopupMenu = pMenu; @@ -1981,13 +1999,12 @@ bool wxWindowOS2::DoPopupMenu( { QMSG vMsg; - if (vMsg.msg == WM_MENUEND || vMsg.msg == WM_COMMAND) - { + ::WinGetMsg(vHabmain,&vMsg, (HWND)0, 0, 0); + if (vMsg.msg == WM_COMMAND) bIsWaiting = FALSE; - } ::WinDispatchMsg(vHabmain, (PQMSG)&vMsg); - } + wxCurrentPopupMenu = NULL; pMenu->SetInvokingWindow(NULL); return TRUE; @@ -2958,6 +2975,20 @@ MRESULT wxWindowOS2::OS2WindowProc( mResult = (MRESULT)TRUE; } break; + +#if wxUSE_MENUS_NATIVE + case WM_MENUEND: + if (wxCurrentPopupMenu) + { + if (GetHmenuOf(wxCurrentPopupMenu) == (HWND)lParam) + { + // Break out of msg loop in DoPopupMenu + ::WinPostMsg((HWND)lParam,WM_COMMAND,wParam,0); + } + } + break; +#endif // wxUSE_MENUS_NATIVE + } if (!bProcessed) { @@ -4047,7 +4078,7 @@ bool wxWindowOS2::HandleMouseEvent( // // The mouse events take consecutive IDs from WM_MOUSEFIRST to - // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST + // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST // from the message id and take the value in the table to get wxWin event // id // @@ -4065,26 +4096,30 @@ bool wxWindowOS2::HandleMouseEvent( wxEVT_MIDDLE_DCLICK }; - wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]); - - InitMouseEvent( vEvent - ,nX - ,nY - ,uFlags - ); - - bProcessed = GetEventHandler()->ProcessEvent(vEvent); - if (!bProcessed) + // Bounds check + if ((uMsg >= WM_MOUSEMOVE) && (uMsg <= WM_BUTTON3DBLCLK)) { - HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR(); + wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]); - if (hCursor != NULLHANDLE) + InitMouseEvent( vEvent + ,nX + ,nY + ,uFlags + ); + + bProcessed = GetEventHandler()->ProcessEvent(vEvent); + if (!bProcessed) { - ::WinSetPointer(HWND_DESKTOP, hCursor); - bProcessed = TRUE; + HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR(); + + if (hCursor != NULLHANDLE) + { + ::WinSetPointer(HWND_DESKTOP, hCursor); + bProcessed = TRUE; + } } } - return GetEventHandler()->ProcessEvent(vEvent); + return bProcessed; } // end of wxWindowOS2::HandleMouseEvent bool wxWindowOS2::HandleMouseMove(