// 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__)
+#if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
+ !defined(__CYGWIN__) && !defined(__DIGITALMARS__) && !defined(__WXWINCE__) && \
+ (!defined(_MSC_VER) || (_MSC_VER > 1100))
#include <shlwapi.h>
#endif
// global variables
// ---------------------------------------------------------------------------
-extern wxChar *wxBuffer;
extern wxList WXDLLEXPORT wxPendingDelete;
-#ifndef __WXMICROWIN__
+
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
extern void wxSetKeyboardHook(bool doIt);
#endif
wxWindow *winActive = new wxFrame
(
wxTheApp->GetTopWindow(),
- -1,
- _T(""),
+ wxID_ANY,
+ wxEmptyString,
wxPoint(32600, 32600),
wxSize(1, 1),
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR
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
// ===========================================================================
};
//// Initialize
-bool wxApp::Initialize(int argc, wxChar **argv)
+bool wxApp::Initialize(int& argc, wxChar **argv)
{
if ( !wxAppBase::Initialize(argc, argv) )
return false;
// 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
::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
);
}
#endif // wxUSE_UNICODE && !wxUSE_UNICODE_MSLU
- wxBuffer = new wxChar[1500]; // FIXME
-
#if defined(__WIN95__) && !defined(__WXMICROWIN__)
InitCommonControls();
#endif // __WIN95__
#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
RegisterWindowClasses();
-#ifndef __WXMICROWIN__
+#if defined(__WXMICROWIN__) && !defined(__WXWINCE__)
// Create the brush for disabling bitmap buttons
LOGBRUSH lb;
if (wxDummyChar) wxDummyChar++;
#endif
-#ifndef __WXMICROWIN__
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
wxSetKeyboardHook(TRUE);
#endif
void wxApp::CleanUp()
{
- delete[] wxBuffer;
- wxBuffer = NULL;
-
-#ifndef __WXMICROWIN__
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
wxSetKeyboardHook(FALSE);
#endif
::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
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
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;
}
-// 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
}
}
-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) )
+ {
+ 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