// headers
// ---------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "app.h"
#endif
#include "wx/apptrait.h"
#include "wx/filename.h"
#include "wx/module.h"
+#include "wx/dynlib.h"
#include "wx/msw/private.h"
#include <string.h>
#include <ctype.h>
-#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__WXMICROWIN__)) && !defined(__CYGWIN10__))
- #include <commctrl.h>
-#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__) && !defined(__WXWINCE__)
+#if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
+ !defined(__CYGWIN__) && !defined(__DIGITALMARS__) && !defined(__WXWINCE__) && \
+ (!defined(_MSC_VER) || (_MSC_VER > 1100))
#include <shlwapi.h>
#endif
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
// ===========================================================================
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
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;
}
}
}
-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()
{
-#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
+//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) )
+ {
+ wxLogApiError(_T("DllGetVersion"), hr);
+ }
+ else
{
- WXADLLVERSIONINFO dvi;
- dvi.cbSize = sizeof(dvi);
+ // 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