X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3e3be693d0e18531299c8f45d27d79f23f948eba..cb73e6001f891ae46b12a1e4ca39b93649cb6099:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index dd14f9b063..ec3c4c0124 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -17,7 +17,7 @@ // headers // --------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "app.h" #endif @@ -51,6 +51,7 @@ #include "wx/apptrait.h" #include "wx/filename.h" #include "wx/module.h" +#include "wx/dynlib.h" #include "wx/msw/private.h" @@ -84,34 +85,11 @@ #include #include -#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__WXMICROWIN__)) && !defined(__CYGWIN10__)) - #include -#endif - -// ---------------------------------------------------------------------------- -// conditional compilation -// ---------------------------------------------------------------------------- - -// The macro _WIN32_IE is defined by commctrl.h (unless it had already been -// defined before) and shows us what common control features are available -// during the compile time (it doesn't mean that they will be available during -// the run-time, use GetComCtl32Version() to test for them!). The possible -// values are: -// -// 0x0200 for comctl32.dll 4.00 shipped with Win95/NT 4.0 -// 0x0300 4.70 IE 3.x -// 0x0400 4.71 IE 4.0 -// 0x0401 4.72 IE 4.01 and Win98 -// 0x0500 5.00 IE 5.x and NT 5.0 (Win2000) - -#ifndef _WIN32_IE - // minimal set of features by default - #define _WIN32_IE 0x0200 -#endif +#include "wx/msw/wrapcctl.h" -#if _WIN32_IE >= 0x0300 && \ - (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \ - !defined(__CYGWIN__) +#if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \ + !defined(__CYGWIN__) && !defined(__DIGITALMARS__) && !defined(__WXWINCE__) && \ + (!defined(_MSC_VER) || (_MSC_VER > 1100)) #include #endif @@ -120,7 +98,8 @@ // --------------------------------------------------------------------------- extern wxList WXDLLEXPORT wxPendingDelete; -#ifndef __WXMICROWIN__ + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) extern void wxSetKeyboardHook(bool doIt); #endif @@ -189,8 +168,8 @@ void *wxGUIAppTraits::BeforeChildWaitLoop() wxWindow *winActive = new wxFrame ( wxTheApp->GetTopWindow(), - -1, - _T(""), + wxID_ANY, + wxEmptyString, wxPoint(32600, 32600), wxSize(1, 1), wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR @@ -224,6 +203,22 @@ bool wxGUIAppTraits::DoMessageFromThreadWait() return !wxTheApp || wxTheApp->DoMessage(); } +wxToolkitInfo& wxGUIAppTraits::GetToolkitInfo() +{ + static wxToolkitInfo info; + wxToolkitInfo& baseInfo = wxAppTraits::GetToolkitInfo(); + info.versionMajor = baseInfo.versionMajor; + info.versionMinor = baseInfo.versionMinor; + info.os = baseInfo.os; + info.shortName = _T("msw"); + info.name = _T("wxMSW"); +#ifdef __WXUNIVERSAL__ + info.shortName << _T("univ"); + info.name << _T("/wxUniversal"); +#endif + return info; +} + // =========================================================================== // wxApp implementation // =========================================================================== @@ -269,7 +264,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) // program under Win9x w/o MSLU emulation layer - if so, abort right now // as it has no chance to work #if wxUSE_UNICODE && !wxUSE_UNICODE_MSLU - if ( wxGetOsVersion() != wxWINDOWS_NT ) + if ( wxGetOsVersion() != wxWINDOWS_NT && wxGetOsVersion() != wxWINDOWS_CE ) { // note that we can use MessageBoxW() as it's implemented even under // Win9x - OTOH, we can't use wxGetTranslation() because the file APIs @@ -277,7 +272,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) ::MessageBox ( NULL, - _T("This program uses Unicode and requires Windows NT/2000/XP.\nProgram aborted."), + _T("This program uses Unicode and requires Windows NT/2000/XP/CE.\nProgram aborted."), _T("wxWindows Fatal Error"), MB_ICONERROR | MB_OK ); @@ -301,9 +296,14 @@ bool wxApp::Initialize(int& argc, wxChar **argv) #if wxUSE_OLE // we need to initialize OLE library +#ifdef __WXWINCE__ + if ( FAILED(::CoInitializeEx(NULL, COINIT_MULTITHREADED)) ) + wxLogError(_("Cannot initialize OLE")); +#else if ( FAILED(::OleInitialize(NULL)) ) wxLogError(_("Cannot initialize OLE")); #endif +#endif #endif // wxUSE_OLE @@ -316,7 +316,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) RegisterWindowClasses(); -#ifndef __WXMICROWIN__ +#if defined(__WXMICROWIN__) && !defined(__WXWINCE__) // Create the brush for disabling bitmap buttons LOGBRUSH lb; @@ -344,7 +344,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) if (wxDummyChar) wxDummyChar++; #endif -#ifndef __WXMICROWIN__ +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) wxSetKeyboardHook(TRUE); #endif @@ -497,7 +497,7 @@ bool wxApp::UnregisterWindowClasses() void wxApp::CleanUp() { -#ifndef __WXMICROWIN__ +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) wxSetKeyboardHook(FALSE); #endif @@ -509,7 +509,11 @@ void wxApp::CleanUp() ::DeleteObject( wxDisableButtonBrush ); #if wxUSE_OLE +#ifdef __WXWINCE__ + ::CoUninitialize(); +#else ::OleUninitialize(); +#endif #endif // for an EXE the classes are unregistered when it terminates but DLL may @@ -684,16 +688,6 @@ int wxApp::MainLoop() return s_currentMsg.wParam; } -// Returns TRUE if more time is needed. -bool wxApp::ProcessIdle() -{ - wxIdleEvent event; - event.SetEventObject(this); - ProcessEvent(event); - - return event.MoreRequested(); -} - void wxApp::ExitMainLoop() { // this will set m_keepGoing to FALSE a bit later @@ -802,23 +796,8 @@ void wxApp::OnIdle(wxIdleEvent& event) return; wxIsInOnIdleFlag = TRUE; - - // If there are pending events, we must process them: pending events - // are either events to the threads other than main or events posted - // with wxPostEvent() functions - // GRG: I have moved this here so that all pending events are processed - // before starting to delete any objects. This behaves better (in - // particular, wrt wxPostEvent) and is coherent with wxGTK's current - // behaviour. Changed Feb/2000 before 2.1.14 - ProcessPendingEvents(); - - // 'Garbage' collection of windows deleted with Close(). - DeletePendingObjects(); - -#if wxUSE_LOG - // flush the logged messages if any - wxLog::FlushActive(); -#endif // wxUSE_LOG + + wxAppBase::OnIdle(event); #if wxUSE_DC_CACHEING // automated DC cache management: clear the cached DCs and bitmap @@ -828,56 +807,9 @@ void wxApp::OnIdle(wxIdleEvent& event) wxDC::ClearCache(); #endif // wxUSE_DC_CACHEING - // Send OnIdle events to all windows - if ( SendIdleEvents() ) - { - // SendIdleEvents() returns TRUE if at least one window requested more - // idle events - event.RequestMore(TRUE); - } - wxIsInOnIdleFlag = FALSE; } -// Send idle event to all top-level windows -bool wxApp::SendIdleEvents() -{ - bool needMore = FALSE; - - wxWindowList::Node* node = wxTopLevelWindows.GetFirst(); - while (node) - { - wxWindow* win = node->GetData(); - if (SendIdleEvents(win)) - needMore = TRUE; - node = node->GetNext(); - } - - return needMore; -} - -// Send idle event to window and all subwindows -bool wxApp::SendIdleEvents(wxWindow* win) -{ - wxIdleEvent event; - event.SetEventObject(win); - win->GetEventHandler()->ProcessEvent(event); - - bool needMore = event.MoreRequested(); - - wxWindowList::Node *node = win->GetChildren().GetFirst(); - while ( node ) - { - wxWindow *win = node->GetData(); - if (SendIdleEvents(win)) - needMore = TRUE; - - node = node->GetNext(); - } - - return needMore; -} - void wxApp::WakeUpIdle() { // Send the top window a dummy message so idle handler processing will @@ -912,118 +844,90 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event) } } -typedef struct _WXADllVersionInfo -{ - DWORD cbSize; - DWORD dwMajorVersion; // Major version - DWORD dwMinorVersion; // Minor version - DWORD dwBuildNumber; // Build number - DWORD dwPlatformID; // DLLVER_PLATFORM_* -} WXADLLVERSIONINFO; - -typedef HRESULT (CALLBACK* WXADLLGETVERSIONPROC)(WXADLLVERSIONINFO *); - /* static */ int wxApp::GetComCtl32Version() { -#ifdef __WXMICROWIN__ +//FIX ME FOR DIGITALMARS!! +#if defined(__WXMICROWIN__) || defined(__WXWINCE__) || defined(__DIGITALMARS__) return 0; #else // cache the result + // + // NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice, + // but as its value should be the same both times it doesn't matter static int s_verComCtl32 = -1; - wxCRIT_SECT_DECLARE(csComCtl32); - wxCRIT_SECT_LOCKER(lock, csComCtl32); - if ( s_verComCtl32 == -1 ) { // initally assume no comctl32.dll at all s_verComCtl32 = 0; + // we're prepared to handle the errors + wxLogNull noLog; + // do we have it? - HMODULE hModuleComCtl32 = ::GetModuleHandle(wxT("COMCTL32")); - BOOL bFreeComCtl32 = FALSE ; - if(!hModuleComCtl32) - { - hModuleComCtl32 = ::LoadLibrary(wxT("COMCTL32.DLL")) ; - if(hModuleComCtl32) - { - bFreeComCtl32 = TRUE ; - } - } + wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM); // if so, then we can check for the version - if ( hModuleComCtl32 ) + if ( dllComCtl32.IsLoaded() ) { +#ifdef DLLVER_PLATFORM_WINDOWS // try to use DllGetVersion() if available in _headers_ - WXADLLGETVERSIONPROC pfnDllGetVersion = (WXADLLGETVERSIONPROC) - ::GetProcAddress(hModuleComCtl32, "DllGetVersion"); - if ( pfnDllGetVersion ) + wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 ); + if ( pfnDllGetVersion ) + { + DLLVERSIONINFO dvi; + dvi.cbSize = sizeof(dvi); + + HRESULT hr = (*pfnDllGetVersion)(&dvi); + if ( FAILED(hr) ) { - WXADLLVERSIONINFO dvi; - dvi.cbSize = sizeof(dvi); + wxLogApiError(_T("DllGetVersion"), hr); + } + else + { + // this is incompatible with _WIN32_IE values, but + // compatible with the other values returned by + // GetComCtl32Version() + s_verComCtl32 = 100*dvi.dwMajorVersion + + dvi.dwMinorVersion; + } + } +#endif - HRESULT hr = (*pfnDllGetVersion)(&dvi); - if ( FAILED(hr) ) - { - wxLogApiError(_T("DllGetVersion"), hr); - } - else - { - // this is incompatible with _WIN32_IE values, but - // compatible with the other values returned by - // GetComCtl32Version() - s_verComCtl32 = 100*dvi.dwMajorVersion + - dvi.dwMinorVersion; - } + // if DllGetVersion() is unavailable either during compile or + // run-time, try to guess the version otherwise + if ( !s_verComCtl32 ) + { + // InitCommonControlsEx is unique to 4.70 and later + void *pfn = dllComCtl32.GetSymbol(_T("InitCommonControlsEx")); + if ( !pfn ) + { + // not found, must be 4.00 + s_verComCtl32 = 400; } - // DllGetVersion() unavailable either during compile or - // run-time, try to guess the version otherwise - if ( !s_verComCtl32 ) + else // 4.70+ { - // InitCommonControlsEx is unique to 4.70 and later - FARPROC theProc = ::GetProcAddress - ( - hModuleComCtl32, - "InitCommonControlsEx" - ); - - if ( !theProc ) + // many symbols appeared in comctl32 4.71, could use any of + // them except may be DllInstall() + pfn = dllComCtl32.GetSymbol(_T("InitializeFlatSB")); + if ( !pfn ) { - // not found, must be 4.00 - s_verComCtl32 = 400; + // not found, must be 4.70 + s_verComCtl32 = 470; } else { - // many symbols appeared in comctl32 4.71, could use - // any of them except may be DllInstall - theProc = ::GetProcAddress - ( - hModuleComCtl32, - "InitializeFlatSB" - ); - if ( !theProc ) - { - // not found, must be 4.70 - s_verComCtl32 = 470; - } - else - { - // found, must be 4.71 - s_verComCtl32 = 471; - } + // found, must be 4.71 or later + s_verComCtl32 = 471; } } - } - - if(bFreeComCtl32) - { - ::FreeLibrary(hModuleComCtl32) ; + } } } return s_verComCtl32; -#endif +#endif // Microwin/!Microwin } // Yield to incoming messages