From 3febf6845ffa9f9004dc5000e01a0f01d8a6f57c Mon Sep 17 00:00:00 2001
From: David Webster <Dave.Webster@bhmi.com>
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.50.0

