]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/app.cpp
fixed incorrect GetTextExtent for wxTELETYPE font
[wxWidgets.git] / src / os2 / app.cpp
index 6855dedd1397cf56a583c92061fa8d15ece605d9..d918cd0d42b6a93119d098382ce43e937c6b8e87 100644 (file)
@@ -63,7 +63,6 @@
 // ---------------------------------------------------------------------------
 
 extern wxChar*                      wxBuffer;
-extern wxChar*                      wxOsVersion;
 extern wxList*                      wxWinHandleList;
 extern wxList WXDLLEXPORT           wxPendingDelete;
 extern wxCursor*                    g_globalCursor;
@@ -93,12 +92,6 @@ HICON wxDEFAULT_MDIPARENTFRAME_ICON  = (HICON) NULL;
 
 HBRUSH wxDisableButtonBrush = (HBRUSH) 0;
 
-MRESULT EXPENTRY wxWndProc( HWND
-                           ,ULONG
-                           ,MPARAM
-                           ,MPARAM
-                          );
-
 // ===========================================================================
 // implementation
 // ===========================================================================
@@ -122,6 +115,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
     //
@@ -142,10 +157,6 @@ bool wxApp::Initialize(
 
     wxClassInfo::InitializeClasses();
 
-#if wxUSE_RESOURCES
-    wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
-#endif
-
 #if wxUSE_THREADS
     wxPendingEventsLocker = new wxCriticalSection;
 #endif
@@ -180,6 +191,7 @@ bool wxApp::Initialize(
     return TRUE;
 } // end of wxApp::Initialize
 
+const char*                         CANTREGISTERCLASS = " Can't register Class ";
 // ---------------------------------------------------------------------------
 // RegisterWindowClasses
 // ---------------------------------------------------------------------------
@@ -194,8 +206,8 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxFrameClassName
-                            ,(PFNWP)wxWndProc
-                            ,CS_SIZEREDRAW | CS_SYNCPAINT
+                            ,NULL
+                            ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT
                             ,sizeof(ULONG)
                            ))
     {
@@ -207,7 +219,7 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
+                            ,NULL
                             ,0
                             ,0
                            ))
@@ -220,8 +232,8 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIFrameClassName
-                            ,(PFNWP)wxWndProc
-                            ,CS_SIZEREDRAW | CS_SYNCPAINT
+                            ,NULL
+                            ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT
                             ,0
                            ))
     {
@@ -233,7 +245,7 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
+                            ,NULL
                             ,0
                             ,0
                            ))
@@ -246,7 +258,7 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIChildFrameClassName
-                            ,(PFNWP)wxWndProc
+                            ,NULL
                             ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_SYNCPAINT | CS_HITTEST
                             ,0
                            ))
@@ -259,7 +271,7 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxMDIChildFrameClassNameNoRedraw
-                            ,(PFNWP)wxWndProc
+                            ,NULL
                             ,CS_HITTEST
                             ,0
                            ))
@@ -272,7 +284,7 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxPanelClassName
-                            ,(PFNWP)wxWndProc
+                            ,NULL
                             ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT
                             ,0
                            ))
@@ -285,8 +297,8 @@ bool wxApp::RegisterWindowClasses(
 
     if (!::WinRegisterClass( vHab
                             ,wxCanvasClassName
-                            ,(PFNWP)wxWndProc
-                            ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT
+                            ,NULL
+                            ,0 // CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT
                             ,0
                            ))
     {
@@ -386,6 +398,10 @@ void wxApp::CleanUp()
 
     wxClassInfo::CleanUpClasses();
 
+    // Delete Message queue
+    if (wxTheApp->m_hMq)
+        ::WinDestroyMsgQueue(wxTheApp->m_hMq);
+
     delete wxTheApp;
     wxTheApp = NULL;
 
@@ -409,6 +425,9 @@ void wxApp::CleanUp()
 #endif // wxUSE_LOG
 } // end of wxApp::CleanUp
 
+//----------------------------------------------------------------------
+// Main wxWindows entry point
+//----------------------------------------------------------------------
 int wxEntry(
   int                               argc
 , char*                             argv[]
@@ -467,7 +486,7 @@ int wxEntry(
 //          nRetValue = -1;
         }
     }
-
+// Normal exit
     wxWindow*                       pTopWindow = wxTheApp->GetTopWindow();
 
     if (pTopWindow)
@@ -485,8 +504,24 @@ int wxEntry(
             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
 
@@ -522,6 +557,7 @@ wxApp::wxApp()
     m_nPrintMode = wxPRINT_WINDOWS;
     m_exitOnFrameDelete = TRUE;
     m_bAuto3D = TRUE;
+    m_hMq = 0;
 } // end of wxApp::wxApp
 
 wxApp::~wxApp()
@@ -529,6 +565,7 @@ wxApp::~wxApp()
     //
     // Delete command-line args
     //
+#if wxUSE_UNICODE
     int                             i;
 
     for (i = 0; i < argc; i++)
@@ -536,6 +573,7 @@ wxApp::~wxApp()
         delete[] argv[i];
     }
     delete[] argv;
+#endif
 } // end of wxApp::~wxApp
 
 bool wxApp::Initialized()
@@ -552,7 +590,7 @@ bool wxApp::Initialized()
 //
 bool wxApp::DoMessage()
 {
-    BOOL                            bRc = ::WinGetMsg(vHabmain, &m_vMsg, HWND(NULL), 0, 0);
+    BOOL                            bRc = ::WinGetMsg(vHabmain, &svCurrentMsg, HWND(NULL), 0, 0);
 
     if (bRc == 0)
     {
@@ -622,7 +660,7 @@ bool wxApp::DoMessage()
 #endif // wxUSE_THREADS
 
         // Process the message
-        if (!ProcessMessage((WXMSG *)&svCurrentMsg) )
+        if (!ProcessMessage((WXMSG *)&svCurrentMsg))
         {
             ::WinDispatchMsg(vHabmain, (PQMSG)&svCurrentMsg);
         }
@@ -654,8 +692,9 @@ int wxApp::MainLoop()
 #if wxUSE_THREADS
         wxMutexGuiLeaveOrEnter();
 #endif // wxUSE_THREADS
-        while (!Pending() && ProcessIdle())
+        while (/*Pending() &&*/ ProcessIdle())
         {
+//          wxUsleep(10000);
         }
         DoMessage();
     }
@@ -700,8 +739,8 @@ bool wxApp::ProcessMessage(
   WXMSG*                            pWxmsg
 )
 {
-    QMSG*                           vMsg = (PQMSG)pWxmsg;
-    HWND                            hWnd = vMsg->hwnd;
+    QMSG*                           pMsg = (PQMSG)pWxmsg;
+    HWND                            hWnd = pMsg->hwnd;
     wxWindow*                       pWndThis = wxFindWinFromHandle((WXHWND)hWnd);
     wxWindow*                       pWnd;
 
@@ -710,7 +749,7 @@ bool wxApp::ProcessMessage(
     // We must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to
     // popup the tooltip bubbles
     //
-    if (pWndThis && (vMsg->msg == WM_MOUSEMOVE))
+    if (pWndThis && (pMsg->msg == WM_MOUSEMOVE))
     {
         wxToolTip*                  pToolTip = pWndThis->GetToolTip();
         if (pToolTip)
@@ -732,13 +771,44 @@ bool wxApp::ProcessMessage(
     }
 
     //
-    // Anyone for a non-translation message? Try youngest descendants first.
+    // Try translations first; find the youngest window with
+    // a translation table. OS/2 has case sensative accels, so
+    // this block, coded by BK, removes that and helps make them
+    // case insensative.
     //
-    for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
+    if(pMsg->msg == WM_CHAR)
     {
-        if (pWnd->OS2ProcessMessage(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;
+        }
     }
+    //
+    // Anyone for a non-translation message? Try youngest descendants first.
+    //
+//  for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
+//  {
+//      if (pWnd->OS2ProcessMessage(pWxmsg))
+//          return TRUE;
+//  }
     return FALSE;
 } // end of wxApp::ProcessMessage
 
@@ -751,7 +821,7 @@ void wxApp::OnIdle(
     //
     // Avoid recursion (via ProcessEvent default case)
     //
-    if (sbInOnIdle )
+    if (sbInOnIdle)
         return;
 
     sbInOnIdle = TRUE;