X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3210d001bfa045ce765fc241419738b0d7c47799..38755449339718307f594d0c92f7d37ce56c908c:/src/os2/app.cpp diff --git a/src/os2/app.cpp b/src/os2/app.cpp index 46dc757d50..7288a6e08c 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -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 @@ -749,11 +798,13 @@ bool wxApp::ProcessMessage( 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; - } + + 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; } @@ -761,11 +812,11 @@ bool wxApp::ProcessMessage( // // 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 @@ -778,7 +829,7 @@ void wxApp::OnIdle( // // Avoid recursion (via ProcessEvent default case) // - if (sbInOnIdle ) + if (sbInOnIdle) return; sbInOnIdle = TRUE; @@ -912,6 +963,8 @@ void wxExit() wxApp::CleanUp(); } // end of wxExit +static bool gs_inYield = FALSE; + // // Yield to incoming messages // @@ -926,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. (?) @@ -948,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