X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3958ae62ba9d7dca5bec365837d8047c97b0712a..ac7f88268351957316945c7d0e5326d1a482e238:/src/os2/app.cpp diff --git a/src/os2/app.cpp b/src/os2/app.cpp index 8a5b65436c..31c1d49629 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -9,6 +9,10 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ + #pragma implementation "app.h" +#endif + // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -37,22 +41,28 @@ #include "wx/os2/private.h" -#if defined(__VISAGECPP__) && __IBMCPP__ < 400 -#include -#include -#include -#include +#ifdef __EMX__ + +#include +#include + #else -#include -#include + +#include +#include +#include +#include + +#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 *); -#endif +extern "C" int _System bsdselect(int, + struct fd_set *, + struct fd_set *, + struct fd_set *, + struct timeval *); #endif #if wxUSE_THREADS @@ -90,16 +100,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; @@ -133,22 +133,34 @@ struct GsocketCallbackInfo{ #define wxSockReadMask 0x01 #define wxSockWriteMask 0x02 +#ifdef __EMX__ extern "C" int wxAppAddSocketHandler(int handle, int mask, - void (*callback)(void*), void * gsock) + void (*callback)(void*), void * gsock) { return wxTheApp->AddSocketHandler(handle, mask, callback, gsock); } - extern "C" void wxAppRemoveSocketHandler(int handle) { wxTheApp->RemoveSocketHandler(handle); } +#else +// Linkage mode problems using callbacks with extern C in a .cpp module +int wxAppAddSocketHandler(int handle, int mask, + void (*callback)(void*), void * gsock) +{ + return wxTheApp->AddSocketHandler(handle, mask, callback, gsock); +} +void wxAppRemoveSocketHandler(int handle) +{ + wxTheApp->RemoveSocketHandler(handle); +} +#endif void wxApp::HandleSockets() { - bool pendingEvent = false; + bool pendingEvent = FALSE; // Check whether it's time for Gsocket operation if (m_maxSocketHandles > 0 && m_maxSocketNr > 0) @@ -179,7 +191,7 @@ void wxApp::HandleSockets() if (r < m_maxSocketHandles) { CallbackInfo[r].proc(CallbackInfo[r].gsock); - pendingEvent = true; + pendingEvent = TRUE; wxYield(); } } @@ -193,7 +205,7 @@ void wxApp::HandleSockets() if (r < m_maxSocketHandles) { CallbackInfo[r].proc(CallbackInfo[r].gsock); - pendingEvent = true; + pendingEvent = TRUE; wxYield(); } } @@ -245,22 +257,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(); @@ -281,7 +277,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. @@ -296,6 +307,7 @@ bool wxApp::Initialize( wxModule::RegisterModules(); if (!wxModule::InitializeModules()) return FALSE; + RegisterWindowClasses(vHab); return TRUE; } // end of wxApp::Initialize @@ -308,14 +320,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) )) { @@ -406,7 +417,19 @@ 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) + )) + { + vError = ::WinGetLastError(vHab); + sError = wxPMErrorToStr(vError); + wxLogLastError(sError); + return FALSE; + } + if (!::WinRegisterClass( vHab + ,wxCanvasClassNameNR + ,wxWndProc + ,CS_HITTEST | CS_SYNCPAINT ,sizeof(ULONG) )) { @@ -636,6 +659,9 @@ bool wxApp::OnInitGui() ERRORID vError; wxString sError; + if (!wxAppBase::OnInitGui()) + return FALSE; + m_hMq = ::WinCreateMsgQueue(vHabmain, 0); if (!m_hMq) { @@ -644,6 +670,7 @@ bool wxApp::OnInitGui() wxLogDebug(sError); return FALSE; } + return TRUE; } // end of wxApp::OnInitGui @@ -656,12 +683,10 @@ wxApp::wxApp() { m_topWindow = NULL; wxTheApp = this; - m_wantDebugOutput = TRUE; argc = 0; argv = NULL; m_nPrintMode = wxPRINT_WINDOWS; - m_exitOnFrameDelete = TRUE; m_bAuto3D = TRUE; m_hMq = 0; m_maxSocketHandles = 0; @@ -759,25 +784,31 @@ bool wxApp::DoMessage() { QMSG vMsg = svSavedMessages[n]; - if ( !ProcessMessage((WXMSG *)&vMsg) ) - { - ::WinDispatchMsg(vHabmain, &vMsg); - } + DoMessage((WXMSG*)&vMsg); } svSavedMessages.Empty(); } } #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 @@ -831,13 +862,13 @@ bool wxApp::ProcessIdle() void wxApp::ExitMainLoop() { - m_bKeepGoing = FALSE; -} + ::WinPostMsg(NULL, WM_QUIT, 0, 0); +} // end of wxApp::ExitMainLoop bool wxApp::Pending() { return (::WinPeekMsg(vHabmain, (PQMSG)&svCurrentMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) != 0); -} +} // end of wxApp::Pending void wxApp::Dispatch() { @@ -860,26 +891,26 @@ bool wxApp::ProcessMessage( wxWindow* pWndThis = wxFindWinFromHandle((WXHWND)hWnd); wxWindow* pWnd; -#if wxUSE_TOOLTIPS // - // We must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to - // popup the tooltip bubbles + // Pass non-system timer messages to the wxTimerProc // - if (pWndThis && (pMsg->msg == WM_MOUSEMOVE)) - { - wxToolTip* pToolTip = pWndThis->GetToolTip(); - if (pToolTip) - { - pToolTip->RelayEvent(pWxmsg); - } - } -#endif // wxUSE_TOOLTIPS + 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); // - // We must relay Timer events to wxTimer's processing function + // 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 (pMsg->msg == WM_TIMER) - wxTimerProc(NULL, 0, (int)pMsg->mp1, 0); + if (pWndThis && !pWndThis->OS2ShouldPreProcessMessage(pWxmsg)) + { + return FALSE; + } // // For some composite controls (like a combobox), wndThis might be NULL @@ -967,6 +998,16 @@ void wxApp::OnIdle( wxLog::FlushActive(); #endif // wxUSE_LOG +#if wxUSE_DC_CACHEING + // 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(HWND_DESKTOP, VK_BUTTON1) && + !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) && + !::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2)) + wxDC::ClearCache(); +#endif // wxUSE_DC_CACHEING + // // Send OnIdle events to all windows // @@ -1077,13 +1118,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; @@ -1093,7 +1144,7 @@ bool wxYield() // wxLog::Suspend(); - gs_inYield = TRUE; + s_inYield = TRUE; // // We want to go back to the main message loop @@ -1117,44 +1168,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 -{ - switch(nWhich) - { - case wxICON_INFORMATION: - return wxIcon("wxICON_INFO"); - - case wxICON_QUESTION: - return wxIcon("wxICON_QUESTION"); - - case wxICON_EXCLAMATION: - return wxIcon("wxICON_WARNING"); - - default: - wxFAIL_MSG(wxT("requested non existent standard icon")); - // still fall through - - case wxICON_HAND: - return wxIcon("wxICON_ERROR"); - } - return wxIcon("wxICON_ERROR"); -} // end of wxApp::GetStdIcon - int wxApp::AddSocketHandler(int handle, int mask, void (*callback)(void*), void * gsock) {