X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/893758d507abf66a429666b9f0b2c1baa195b398..4222829b44b42720b8b0c737124cfa0e3e33ef1e:/src/os2/app.cpp diff --git a/src/os2/app.cpp b/src/os2/app.cpp index 6ef2a2253d..8062159328 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -39,26 +39,26 @@ #ifdef __EMX__ -#include -#include +#include +#include #else #include -#include -#include +#include +#include +#include -#endif // ndef for __EMX__ +#endif // #ifndef __EMX__ #define select(a,b,c,d,e) bsdselect(a,b,c,d,e) -int _System bsdselect(int, - struct fd_set *, - struct fd_set *, - struct fd_set *, - struct timeval *); - +extern "C" int _System bsdselect(int, + struct fd_set *, + struct fd_set *, + struct fd_set *, + struct timeval *); #endif #if wxUSE_THREADS @@ -96,16 +96,6 @@ HAB vHabmain = NULLHANDLE; QMSG svCurrentMsg; wxApp* wxTheApp = NULL; -// NB: all "NoRedraw" classes must have the same names as the "normal" classes -// with NR suffix - wxWindow::OS2Create() supposes this -wxChar wxFrameClassName[] = wxT("wxFrameClass"); -wxChar wxFrameClassNameNoRedraw[] = wxT("wxFrameClassNR"); -wxChar wxMDIFrameClassName[] = wxT("wxMDIFrameClass"); -wxChar wxMDIFrameClassNameNoRedraw[] = wxT("wxMDIFrameClassNR"); -wxChar wxMDIChildFrameClassName[] = wxT("wxMDIChildFrameClass"); -wxChar wxMDIChildFrameClassNameNoRedraw[] = wxT("wxMDIChildFrameClassNR"); -wxChar wxPanelClassName[] = wxT("wxPanelClass"); -wxChar wxCanvasClassName[] = wxT("wxCanvasClass"); HICON wxSTD_FRAME_ICON = (HICON) NULL; HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL; @@ -263,22 +253,6 @@ bool wxApp::Initialize( #endif //wxUSE_CONSOLEDEBUG #endif - // - // OS2 has to have an anchorblock - // - vHab = WinInitialize(0); - - if (!vHab) - return FALSE; - else - vHabmain = vHab; - - // Some people may wish to use this, but - // probably it shouldn't be here by default. -#ifdef __WXDEBUG__ - // wxRedirectIOToConsole(); -#endif - wxBuffer = new wxChar[1500]; // FIXME; why? wxClassInfo::InitializeClasses(); @@ -299,7 +273,22 @@ bool wxApp::Initialize( wxBitmap::InitStandardHandlers(); - RegisterWindowClasses(vHab); + // + // OS2 has to have an anchorblock + // + vHab = WinInitialize(0); + + if (!vHab) + return FALSE; + else + vHabmain = vHab; + + // Some people may wish to use this, but + // probably it shouldn't be here by default. +#ifdef __WXDEBUG__ + // wxRedirectIOToConsole(); +#endif + wxWinHandleList = new wxList(wxKEY_INTEGER); // This is to foil optimizations in Visual C++ that throw out dummy.obj. @@ -314,6 +303,7 @@ bool wxApp::Initialize( wxModule::RegisterModules(); if (!wxModule::InitializeModules()) return FALSE; + RegisterWindowClasses(vHab); return TRUE; } // end of wxApp::Initialize @@ -326,14 +316,13 @@ bool wxApp::RegisterWindowClasses( HAB vHab ) { - APIRET rc; ERRORID vError = 0L; wxString sError; if (!::WinRegisterClass( vHab ,wxFrameClassName ,wxFrameWndProc - ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT | CS_CLIPCHILDREN + ,CS_SIZEREDRAW | CS_SYNCPAINT ,sizeof(ULONG) )) { @@ -424,7 +413,7 @@ bool wxApp::RegisterWindowClasses( if (!::WinRegisterClass( vHab ,wxCanvasClassName ,wxWndProc - ,CS_MOVENOTIFY | CS_SIZEREDRAW | CS_HITTEST | CS_SAVEBITS | CS_SYNCPAINT | CS_CLIPCHILDREN + ,CS_SIZEREDRAW | CS_HITTEST | CS_SYNCPAINT ,sizeof(ULONG) )) { @@ -654,6 +643,9 @@ bool wxApp::OnInitGui() ERRORID vError; wxString sError; + if (!wxAppBase::OnInitGui()) + return FALSE; + m_hMq = ::WinCreateMsgQueue(vHabmain, 0); if (!m_hMq) { @@ -662,6 +654,7 @@ bool wxApp::OnInitGui() wxLogDebug(sError); return FALSE; } + return TRUE; } // end of wxApp::OnInitGui @@ -903,11 +896,26 @@ bool wxApp::ProcessMessage( #endif // wxUSE_TOOLTIPS // - // We must relay Timer events to wxTimer's processing function + // Pass non-system timer messages to the wxTimerProc // - if (pMsg->msg == WM_TIMER) + if (pMsg->msg == WM_TIMER && + (SHORT1FROMMP(pMsg->mp1) != TID_CURSOR && + SHORT1FROMMP(pMsg->mp1) != TID_FLASHWINDOW && + SHORT1FROMMP(pMsg->mp1) != TID_SCROLL && + SHORT1FROMMP(pMsg->mp1) != 0x0000 + )) wxTimerProc(NULL, 0, (int)pMsg->mp1, 0); + // + // Allow the window to prevent certain messages from being + // translated/processed (this is currently used by wxTextCtrl to always + // grab Ctrl-C/V/X, even if they are also accelerators in some parent) + // + if (pWndThis && !pWndThis->OS2ShouldPreProcessMessage(pWxmsg)) + { + return FALSE; + } + // // For some composite controls (like a combobox), wndThis might be NULL // because the subcontrol is not a wxWindow, but only the control itself @@ -998,9 +1006,9 @@ void wxApp::OnIdle( // automated DC cache management: clear the cached DCs and bitmap // if it's likely that the app has finished with them, that is, we // get an idle event and we're not dragging anything. - if (!::WinGetKeyState(MK_LBUTTON) && - !::WinGetKeyState(MK_MBUTTON) && - !::WinGetKeyState(MK_RBUTTON)) + if (!::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) && + !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) && + !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2)) wxDC::ClearCache(); #endif // wxUSE_DC_CACHEING @@ -1114,13 +1122,23 @@ void wxExit() wxApp::CleanUp(); } // end of wxExit -static bool gs_inYield = FALSE; - // // Yield to incoming messages // -bool wxYield() +bool wxApp::Yield(bool onlyIfNeeded) { + static bool s_inYield = FALSE; + + if ( s_inYield ) + { + if ( !onlyIfNeeded ) + { + wxFAIL_MSG( _T("wxYield() called recursively") ); + } + + return FALSE; + } + HAB vHab = 0; QMSG vMsg; @@ -1130,7 +1148,7 @@ bool wxYield() // wxLog::Suspend(); - gs_inYield = TRUE; + s_inYield = TRUE; // // We want to go back to the main message loop @@ -1154,19 +1172,10 @@ bool wxYield() // Let the logs be flashed again // wxLog::Resume(); - gs_inYield = FALSE; + s_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