]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
xti additions / changes, trying to reduce dependencies
[wxWidgets.git] / src / msw / app.cpp
index 79153ef858a707e4a2824662733343ef85cfbf74..ec3c4c0124c042290e1c7da37633fb0a59e4f043 100644 (file)
@@ -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"
 
 #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
 
@@ -225,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
 // ===========================================================================
@@ -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,17 +807,6 @@ void wxApp::OnIdle(wxIdleEvent& event)
         wxDC::ClearCache();
 #endif // wxUSE_DC_CACHEING
 
-    // Now done in ProcessIdle()
-#if 0
-    // Send OnIdle events to all windows
-    if ( SendIdleEvents() )
-    {
-        // SendIdleEvents() returns TRUE if at least one window requested more
-        // idle events
-        event.RequestMore(TRUE);
-    }
-#endif
-
     wxIsInOnIdleFlag = FALSE;
 }
 
@@ -876,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()
 {
-#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