X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a086de984d366b97e91b39aaba7acd84430d963a..76c79ff467c1af23e3cbc6201c1e6110c110b26a:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 3e106c6c6a..42c6c75783 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -138,10 +138,14 @@ MRESULT EXPENTRY wxWndProc( HWND hWnd const char *wxGetMessageName(int message); #endif //__WXDEBUG__ -void wxRemoveHandleAssociation(wxWindowOS2* pWin); -void wxAssociateWinWithHandle( HWND hWnd - ,wxWindowOS2* pWin - ); +wxWindowOS2* FindWindowForMouseEvent( wxWindow* pWin + ,short* pnX + ,short* pnY + ); +void wxRemoveHandleAssociation(wxWindowOS2* pWin); +void wxAssociateWinWithHandle( HWND hWnd + ,wxWindowOS2* pWin + ); wxWindow* wxFindWinFromHandle(WXHWND hWnd); // @@ -465,6 +469,14 @@ void wxWindowOS2::SetFocus() ::WinSetFocus(HWND_DESKTOP, hWnd); } // end of wxWindowOS2::SetFocus +void wxWindowOS2::SetFocusFromKbd() +{ + // + // Nothing else to do under OS/2 + // + wxWindowBase::SetFocusFromKbd(); +} // end of wxWindowOS2::SetFocus + wxWindow* wxWindowBase::FindFocus() { HWND hWnd = ::WinQueryFocus(HWND_DESKTOP); @@ -2649,12 +2661,38 @@ MRESULT wxWindowOS2::OS2WindowProc( case WM_BUTTON3MOTIONEND: case WM_BUTTON3MOTIONSTART: { - short x = LOWORD(wParam); - short y = HIWORD(wParam); + if (uMsg == WM_BUTTON1DOWN && AcceptsFocus()) + SetFocus(); + + short nX = LOWORD(wParam); + short nY = HIWORD(wParam); - bProcessed = HandleMouseEvent(uMsg, x, y, (WXUINT)wParam); + // + // Redirect the event to a static control if necessary + // + if (this == GetCapture()) + { + bProcessed = HandleMouseEvent( uMsg + ,nX + ,nY + ,(WXUINT)SHORT1FROMMP(wParam) + ); + } + else + { + wxWindow* pWin = FindWindowForMouseEvent( this + ,&nX + ,&nY + ); + bProcessed = pWin->HandleMouseEvent( uMsg + ,nX + ,nY + ,(WXUINT)SHORT1FROMMP(wParam) + ); + } } break; + case WM_SYSCOMMAND: bProcessed = HandleSysCommand(wParam, lParam); break; @@ -2759,20 +2797,7 @@ MRESULT wxWindowOS2::OS2WindowProc( break; default: - if (m_bLastKeydownProcessed) - { - // - // The key was handled in the EVT_KEY_DOWN and handling - // a key in an EVT_KEY_DOWN handler is meant, by - // design, to prevent EVT_CHARs from happening - // - m_bLastKeydownProcessed = FALSE; - bProcessed = TRUE; - } - else // do generate a CHAR event - { - bProcessed = HandleChar((WXDWORD)wParam, lParam); - } + bProcessed = HandleChar(wParam, lParam); } break; } @@ -2790,7 +2815,7 @@ MRESULT wxWindowOS2::OS2WindowProc( } else // do generate a CHAR event { - bProcessed = HandleChar((WXDWORD)wParam, lParam, TRUE); + bProcessed = HandleChar(wParam, lParam, TRUE); break; } } @@ -4050,7 +4075,7 @@ wxKeyEvent wxWindowOS2::CreateKeyEvent( // WM_KEYDOWN one // bool wxWindowOS2::HandleChar( - WXDWORD wParam + WXWPARAM wParam , WXLPARAM lParam , bool isASCII ) @@ -4073,7 +4098,7 @@ bool wxWindowOS2::HandleChar( // // If 1 -> 26, translate to CTRL plus a letter. // - vId = wParam; + vId = (int)wParam; if ((vId > 0) && (vId < 27)) { switch (vId) @@ -4098,7 +4123,7 @@ bool wxWindowOS2::HandleChar( } else // we're called from WM_KEYDOWN { - vId = wxCharCodeOS2ToWX(wParam); + vId = wxCharCodeOS2ToWX((int)wParam); if (vId == 0) return FALSE; } @@ -5114,3 +5139,59 @@ wxPoint wxGetMousePosition() return wxPoint(vPt.x, vPt.y); } +wxWindowOS2* FindWindowForMouseEvent( + wxWindow* pWin +, short* pnX +, short* pnY +) +{ + wxCHECK_MSG( pnX && pnY, pWin, _T("NULL pointer in FindWindowForMouseEvent") ); + POINTL vPoint = { *pnX, *pnY }; + HWND hWnd = GetHwndOf(pWin); + HWND hWndUnderMouse; + + // + // First try to find a non transparent child: this allows us to send events + // to a static text which is inside a static box, for example + // + + hWndUnderMouse = ::WinWindowFromPoint( hWnd + ,&vPoint + ,TRUE + ); + if (!hWndUnderMouse || hWndUnderMouse == hWnd) + { + // + // Now try any child window at all + // + hWndUnderMouse = ::WinWindowFromPoint( HWND_DESKTOP + ,&vPoint + ,TRUE + ); + + } + + // + // Check that we have a child window which is susceptible to receive mouse + // events: for this it must be shown and enabled + if ( hWndUnderMouse && + hWndUnderMouse != hWnd && + ::WinIsWindowVisible(hWndUnderMouse) && + ::WinIsWindowEnabled(hWndUnderMouse)) + { + wxWindow* pWinUnderMouse = wxFindWinFromHandle((WXHWND)hWndUnderMouse); + if (pWinUnderMouse) + { + // translate the mouse coords to the other window coords + pWin->ClientToScreen( (int*)pnX + ,(int*)pnY + ); + pWinUnderMouse->ScreenToClient( (int*)pnX + ,(int*)pnY + ); + pWin = pWinUnderMouse; + } + } + return pWin; +} // end of FindWindowForMouseEvent +