]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
wxUniv compilation fixes
[wxWidgets.git] / src / msw / app.cpp
index 4e58a0bba6c8aa74e4dde9b6c3869ae779c57b3b..2b12d8ebb074cda3fdfbece78c99cdff2c12fe63 100644 (file)
@@ -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"
 
 // 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)
+// 0x0500                      5.80              IE 5.x
+// 0x0500                      5.81              Win2k/ME
+// 0x0600                      6.00              WinXP
 
 #ifndef _WIN32_IE
-    // minimal set of features by default
-    #define _WIN32_IE 0x0200
+    // use maximal set of features by default, we check for them during
+    // run-time anyhow
+    #define _WIN32_IE 0x0600
 #endif
 
-#if _WIN32_IE >= 0x0300 && \
-    (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
-    !defined(__CYGWIN__)
+#if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
+    !defined(__CYGWIN__) && !defined(__WXWINCE__) && \
+    (!defined(_MSC_VER) || (_MSC_VER > 1100))
     #include <shlwapi.h>
 #endif
 
 // ---------------------------------------------------------------------------
 
 extern wxList WXDLLEXPORT wxPendingDelete;
-#ifndef __WXMICROWIN__
+
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
 extern void wxSetKeyboardHook(bool doIt);
 #endif
 
@@ -189,8 +194,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
@@ -269,7 +274,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 +282,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 +306,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 +326,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 +354,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     if (wxDummyChar) wxDummyChar++;
 #endif
 
-#ifndef __WXMICROWIN__
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
     wxSetKeyboardHook(TRUE);
 #endif
 
@@ -497,7 +507,7 @@ bool wxApp::UnregisterWindowClasses()
 
 void wxApp::CleanUp()
 {
-#ifndef __WXMICROWIN__
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
     wxSetKeyboardHook(FALSE);
 #endif
 
@@ -509,7 +519,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
@@ -792,23 +806,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
@@ -818,14 +817,6 @@ 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;
 }
 
@@ -863,118 +854,87 @@ 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__
+#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
     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() )
         {
             // 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;
+                }
+            }
 
-                    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