]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/app.cpp
Suppress "Assignement in logical expression" type warnings for compilers that compain...
[wxWidgets.git] / src / os2 / app.cpp
index 4aa19bee52c443a650aeae6dd1c5558aecd74ac8..7288a6e08cc54f8d8f7bcfa3b3f601f379b1278e 100644 (file)
@@ -27,8 +27,9 @@
     #include "wx/msgdlg.h"
     #include "wx/intl.h"
     #include "wx/dynarray.h"
-#   include "wx/wxchar.h"
-#   include "wx/icon.h"
+    #include "wx/wxchar.h"
+    #include "wx/icon.h"
+    #include "wx/timer.h"
 #endif
 
 #include "wx/log.h"
@@ -92,6 +93,9 @@ HICON wxDEFAULT_MDIPARENTFRAME_ICON  = (HICON) NULL;
 
 HBRUSH wxDisableButtonBrush = (HBRUSH) 0;
 
+MRESULT EXPENTRY wxWndProc( HWND hWnd,ULONG message,MPARAM mp1,MPARAM mp2);
+MRESULT EXPENTRY wxFrameWndProc( HWND hWnd,ULONG message,MPARAM mp1,MPARAM mp2);
+
 // ===========================================================================
 // implementation
 // ===========================================================================
@@ -115,6 +119,28 @@ bool wxApp::Initialize(
   HAB                               vHab
 )
 {
+#if defined(wxUSE_CONSOLEDEBUG)
+  #if wxUSE_CONSOLEDEBUG
+/***********************************************/
+/* Code for using stdout debug                 */
+/* To use it you mast link app as "Window" - EK*/
+/***********************************************/
+  {
+     PPIB pib;
+     PTIB tib;
+
+    printf("In console\n");
+
+  DosGetInfoBlocks(&tib, &pib);
+/* Try morphing into a PM application. */
+//  if(pib->pib_ultype == 2)    /* VIO */
+    pib->pib_ultype = 3;
+   }
+/**********************************************/
+/**********************************************/
+  #endif //wxUSE_CONSOLEDEBUG
+#endif
+
     //
     // OS2 has to have an anchorblock
     //
@@ -169,6 +195,7 @@ bool wxApp::Initialize(
     return TRUE;
 } // end of wxApp::Initialize
 
+const char*                         CANTREGISTERCLASS = " Can't register Class ";
 // ---------------------------------------------------------------------------
 // RegisterWindowClasses
 // ---------------------------------------------------------------------------
@@ -183,8 +210,8 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxFrameClassName
-                            ,(PFNWP)wxWndProc
-                            ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT
+                            ,wxFrameWndProc
+                            ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT  | CS_CLIPCHILDREN
                             ,sizeof(ULONG)
                            ))
     {
@@ -196,9 +223,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
-                            ,0
+                            ,wxWndProc
                             ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -209,9 +236,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIFrameClassName
-                            ,(PFNWP)wxWndProc
+                            ,wxWndProc
                             ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT
-                            ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -222,9 +249,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
-                            ,0
+                            ,wxWndProc
                             ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -235,9 +262,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIChildFrameClassName
-                            ,(PFNWP)wxWndProc
+                            ,wxWndProc
                             ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_SYNCPAINT | CS_HITTEST
-                            ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -248,9 +275,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIChildFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
+                            ,wxWndProc
                             ,CS_HITTEST
-                            ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -261,9 +288,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxPanelClassName
-                            ,(PFNWP)wxWndProc
+                            ,wxWndProc
                             ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT
-                            ,0
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -274,9 +301,9 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxCanvasClassName
-                            ,(PFNWP)wxWndProc
-                            ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT
-                            ,0
+                            ,wxWndProc
+                            ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT | CS_CLIPCHILDREN
+                            ,sizeof(ULONG)
                            ))
     {
         vError = ::WinGetLastError(vHab);
@@ -402,6 +429,9 @@ void wxApp::CleanUp()
 #endif // wxUSE_LOG
 } // end of wxApp::CleanUp
 
+//----------------------------------------------------------------------
+// Main wxWindows entry point
+//----------------------------------------------------------------------
 int wxEntry(
   int                               argc
 , char*                             argv[]
@@ -457,29 +487,43 @@ int wxEntry(
         if (wxTheApp->OnInit())
         {
             nRetValue = wxTheApp->OnRun();
-//          nRetValue = -1;
-        }
-    }
-
-    wxWindow*                       pTopWindow = wxTheApp->GetTopWindow();
-
-    if (pTopWindow)
-    {
-        // Forcibly delete the window.
-        if (pTopWindow->IsKindOf(CLASSINFO(wxFrame)) ||
-            pTopWindow->IsKindOf(CLASSINFO(wxDialog)) )
-        {
-            pTopWindow->Close(TRUE);
-            wxTheApp->DeletePendingObjects();
         }
-        else
+        // Normal exit
+        wxWindow*                   pTopWindow = wxTheApp->GetTopWindow();
+        if (pTopWindow)
         {
-            delete pTopWindow;
-            wxTheApp->SetTopWindow(NULL);
+            // Forcibly delete the window.
+            if (pTopWindow->IsKindOf(CLASSINFO(wxFrame)) ||
+                pTopWindow->IsKindOf(CLASSINFO(wxDialog)) )
+            {
+                pTopWindow->Close(TRUE);
+                wxTheApp->DeletePendingObjects();
+            }
+            else
+            {
+                delete pTopWindow;
+                wxTheApp->SetTopWindow(NULL);
+            }
         }
     }
+    else // app initialization failed
+    {
+        wxLogLastError(" Gui initialization failed, exitting");
+    }
+#if wxUSE_CONSOLEDEBUG
+    printf("wxTheApp->OnExit ");
+    fflush(stdout);
+#endif
     wxTheApp->OnExit();
+#if wxUSE_CONSOLEDEBUG
+    printf("wxApp::CleanUp ");
+    fflush(stdout);
+#endif
     wxApp::CleanUp();
+#if wxUSE_CONSOLEDEBUG
+    printf("return %i ", nRetValue);
+    fflush(stdout);
+#endif
     return(nRetValue);
 } // end of wxEntry
 
@@ -550,7 +594,6 @@ bool wxApp::DoMessage()
 {
     BOOL                            bRc = ::WinGetMsg(vHabmain, &svCurrentMsg, HWND(NULL), 0, 0);
 
-//    wxUsleep(1000);
     if (bRc == 0)
     {
         // got WM_QUIT
@@ -651,9 +694,9 @@ int wxApp::MainLoop()
 #if wxUSE_THREADS
         wxMutexGuiLeaveOrEnter();
 #endif // wxUSE_THREADS
-        while (!Pending() && ProcessIdle())
+        while (/*Pending() &&*/ ProcessIdle())
         {
-//            wxUsleep(10000);
+//          wxUsleep(10000);
         }
         DoMessage();
     }
@@ -718,6 +761,12 @@ bool wxApp::ProcessMessage(
     }
 #endif // wxUSE_TOOLTIPS
 
+    //
+    // We must relay Timer events to wxTimer's processing function
+    //
+    if (pMsg->msg == WM_TIMER)
+        wxTimerProc(NULL, 0, (int)pMsg->mp1, 0);
+
     //
     // For some composite controls (like a combobox), wndThis might be NULL
     // because the subcontrol is not a wxWindow, but only the control itself
@@ -731,24 +780,43 @@ bool wxApp::ProcessMessage(
 
     //
     // Try translations first; find the youngest window with
-    // a translation table.
+    // a translation table. OS/2 has case sensative accels, so
+    // this block, coded by BK, removes that and helps make them
+    // case insensative.
     //
-#if 0
-    for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent() )
+    if(pMsg->msg == WM_CHAR)
     {
-        if (pMsg->msg == WM_CHAR)
-            if (pWnd->OS2TranslateMessage(pWxmsg))
-                return TRUE;
+       PBYTE                        pChmsg = (PBYTE)&(pMsg->msg);
+       USHORT                       uSch  = CHARMSG(pChmsg)->chr;
+       bool                         bRc;
+
+       //
+       // Do not process keyup events
+       //
+       if(!(CHARMSG(pChmsg)->fs & KC_KEYUP))
+       {
+           if((CHARMSG(pChmsg)->fs & (KC_ALT | KC_CTRL)) && CHARMSG(pChmsg)->chr != 0)
+                CHARMSG(pChmsg)->chr = (USHORT)wxToupper((UCHAR)uSch);
+
+
+           for(pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent() )
+           {
+               if((bRc = pWnd->OS2TranslateMessage(pWxmsg)) == TRUE)
+                   break;
+           }
+
+            if(!bRc)    // untranslated, should restore original value
+                CHARMSG(pChmsg)->chr = uSch;
+        }
     }
-#endif
     //
     // Anyone for a non-translation message? Try youngest descendants first.
     //
-    for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
-    {
-        if (pWnd->OS2ProcessMessage(pWxmsg))
-            return TRUE;
-    }
+//  for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
+//  {
+//      if (pWnd->OS2ProcessMessage(pWxmsg))
+//          return TRUE;
+//  }
     return FALSE;
 } // end of wxApp::ProcessMessage
 
@@ -761,7 +829,7 @@ void wxApp::OnIdle(
     //
     // Avoid recursion (via ProcessEvent default case)
     //
-    if (sbInOnIdle )
+    if (sbInOnIdle)
         return;
 
     sbInOnIdle = TRUE;
@@ -895,6 +963,8 @@ void wxExit()
     wxApp::CleanUp();
 } // end of wxExit
 
+static bool gs_inYield = FALSE;
+
 //
 // Yield to incoming messages
 //
@@ -909,6 +979,8 @@ bool wxYield()
     //
     wxLog::Suspend();
 
+    gs_inYield = TRUE;
+
     //
     // We want to go back to the main message loop
     // if we see a WM_QUIT. (?)
@@ -931,9 +1003,19 @@ bool wxYield()
     // Let the logs be flashed again
     //
     wxLog::Resume();
+    gs_inYield = FALSE;
     return TRUE;
 } // end of wxYield
 
+// Yield to incoming messages; but fail silently if recursion is detected.
+bool wxYieldIfNeeded()
+{
+    if (gs_inYield)
+        return FALSE;
+        
+    return wxYield();
+}
+
 wxIcon wxApp::GetStdIcon(
   int                               nWhich
 ) const