From 3febf6845ffa9f9004dc5000e01a0f01d8a6f57c Mon Sep 17 00:00:00 2001 From: David Webster Date: Fri, 8 Jun 2001 15:24:37 +0000 Subject: [PATCH] Enabling the Pop Menu fix to peek at all the command messages. Required adding a secondary DoMessage to wxApp. Some textctrl work as well. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10460 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/accel.cpp | 9 +++++++++ src/os2/app.cpp | 17 +++++++++++++---- src/os2/frame.cpp | 12 ++++-------- src/os2/window.cpp | 29 ++++++++++++++++++++++++++++- src/os2/wx23.def | 2 ++ 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/os2/accel.cpp b/src/os2/accel.cpp index 611f53c959..a93f7f1af6 100644 --- a/src/os2/accel.cpp +++ b/src/os2/accel.cpp @@ -120,11 +120,20 @@ wxAcceleratorTable::wxAcceleratorTable( USHORT uVirt = AF_CHAR; if (vaEntries[i].GetFlags() & wxACCEL_ALT) + { uVirt |= AF_ALT; + uVirt |= AF_VIRTUALKEY; + } if (vaEntries[i].GetFlags() & wxACCEL_SHIFT) + { uVirt |= AF_SHIFT; + uVirt |= AF_VIRTUALKEY; + } if (vaEntries[i].GetFlags() & wxACCEL_CTRL) + { uVirt |= AF_CONTROL; + uVirt |= AF_VIRTUALKEY; + } bool bIsVirtual; USHORT uKey = wxCharCodeWXToOS2( vaEntries[i].GetKeyCode() diff --git a/src/os2/app.cpp b/src/os2/app.cpp index bd4b47a6cf..61d3cdc3c6 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -787,15 +787,24 @@ bool wxApp::DoMessage() } #endif // wxUSE_THREADS + // // Process the message - if (!ProcessMessage((WXMSG *)&svCurrentMsg)) - { - ::WinDispatchMsg(vHabmain, (PQMSG)&svCurrentMsg); - } + // + DoMessage((WXMSG *)&svCurrentMsg); } return TRUE; } // end of wxApp::DoMessage +void wxApp::DoMessage( + WXMSG* pMsg +) +{ + if (!ProcessMessage((WXMSG *)&svCurrentMsg)) + { + ::WinDispatchMsg(vHabmain, (PQMSG)&svCurrentMsg); + } +} // end of wxApp::DoMessage + ////////////////////////////////////////////////////////////////////////////// // // Keep trying to process messages until WM_QUIT diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index dbc1e6be98..838197f4d4 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -341,15 +341,9 @@ void wxFrame::DoGetPosition( POINTL vPoint; ::WinQueryWindowRect(m_hFrame, &vRect); - vPoint.x = vRect.xLeft; - // - // OS/2 is backwards [WIN32 it is vRect.yTop] - // - vPoint.y = vRect.yBottom; - - *pX = vPoint.x; - *pY = vPoint.y; + *pX = vRect.xRight - vRect.xLeft; + *pY = vRect.yTop - vRect.yBottom; } // end of wxFrame::DoGetPosition // ---------------------------------------------------------------------------- @@ -1356,6 +1350,7 @@ bool wxFrame::HandleSize( // restore all child frames too // IconizeChildFrames(FALSE); + (void)SendIconizeEvent(FALSE); // // fall through @@ -1370,6 +1365,7 @@ bool wxFrame::HandleSize( // Iconize all child frames too // IconizeChildFrames(TRUE); + (void)SendIconizeEvent(); m_bIconized = TRUE; break; } diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 8da4f9c1a7..26e94bc0cc 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -1810,6 +1810,26 @@ void wxWindow::GetCaretPos( // popup menu // --------------------------------------------------------------------------- +static void wxYieldForCommandsOnly() +{ + // + // Peek all WM_COMMANDs (it will always return WM_QUIT too but we don't + // want to process it here) + // + QMSG vMsg; + + while (::WinPeekMsg( vHabmain + ,&vMsg + ,(HWND)0 + ,WM_COMMAND + ,WM_COMMAND + ,PM_REMOVE + ) && vMsg.msg != WM_QUIT) + { + wxTheApp->DoMessage((WXMSG*)&vMsg); + } +} + bool wxWindow::DoPopupMenu( wxMenu* pMenu , int nX @@ -1836,7 +1856,14 @@ bool wxWindow::DoPopupMenu( ,0L ,PU_MOUSEBUTTON2DOWN | PU_MOUSEBUTTON2 | PU_KEYBOARD ); - wxYield(); + // we need to do it righ now as otherwise the events are never going to be + // sent to wxCurrentPopupMenu from HandleCommand() + // + // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't + // help and we'd still need wxYieldForCommandsOnly() as the menu may be + // destroyed as soon as we return (it can be a local variable in the caller + // for example) and so we do need to process the event immediately + wxYieldForCommandsOnly(); wxCurrentPopupMenu = NULL; pMenu->SetInvokingWindow(NULL); diff --git a/src/os2/wx23.def b/src/os2/wx23.def index 6d128609f8..80f73e8df4 100644 --- a/src/os2/wx23.def +++ b/src/os2/wx23.def @@ -11163,6 +11163,8 @@ EXPORTS DoMessage__5wxAppFv ;wxExit() wxExit__Fv + ;wxApp::DoMessage(void**) + DoMessage__5wxAppFPPv ;wxApp::Dispatch() Dispatch__5wxAppFv ;wxEntry(int,char**) -- 2.45.2