X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..a1a2adef0792a4accda1a7c48052dbfd9511c5fa:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 31c1cd1849..6a73f6d322 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -59,7 +59,7 @@ extern wxList wxPendingDelete; extern void wxSetKeyboardHook(bool doIt); extern wxCursor *g_globalCursor; -HANDLE wxhInstance = 0; +HINSTANCE wxhInstance = 0; static MSG s_currentMsg; wxApp *wxTheApp = NULL; @@ -94,9 +94,9 @@ long wxApp::sm_lastMessageTime = 0; static HINSTANCE gs_hRichEdit = NULL; #endif -bool wxApp::Initialize(WXHANDLE instance) +bool wxApp::Initialize(WXHINSTANCE instance) { - HANDLE hInstance = (HANDLE)instance; + HINSTANCE hInstance = (HINSTANCE) instance; CommonInit(); @@ -161,7 +161,7 @@ bool wxApp::Initialize(WXHANDLE instance) return TRUE; } -bool wxApp::RegisterWindowClasses(void) +bool wxApp::RegisterWindowClasses() { /////////////////////////////////////////////////////////////////////// // Register the frame window class. @@ -248,7 +248,7 @@ bool wxApp::RegisterWindowClasses(void) wndclass2.hIcon = NULL; wndclass2.hCursor = NULL; // wndclass2.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1) ; - wndclass2.hbrBackground = GetStockObject( LTGRAY_BRUSH ); + wndclass2.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH ); wndclass2.lpszMenuName = NULL; wndclass2.lpszClassName = wxPanelClassName; if (!RegisterClass( &wndclass2 )) @@ -286,7 +286,7 @@ bool wxApp::RegisterWindowClasses(void) } // Cleans up any wxWindows internal structures left lying around -void wxApp::CleanUp(void) +void wxApp::CleanUp() { wxModule::CleanUpModules(); @@ -331,11 +331,13 @@ void wxApp::CleanUp(void) if (wxWinHandleList) delete wxWinHandleList ; + // do it as the very last thing because everything else can log messages + delete wxLog::SetActiveTarget(NULL); } -void wxApp::CommonInit(void) +void wxApp::CommonInit() { -#ifdef __WINDOWS__ +#ifdef __WXMSW__ wxBuffer = new char[1500]; #else wxBuffer = new char[BUFSIZ + 512]; @@ -343,32 +345,8 @@ void wxApp::CommonInit(void) wxClassInfo::InitializeClasses(); -#ifdef __X__ - wxTheFontNameDirectory.Initialize(); -#endif - -#if defined(__X__) && USE_RESOURCES - // Read standard font names from .Xdefaults - - extern char *wxDecorativeFontName; - extern char *wxRomanFontName; - extern char *wxModernFontName; - extern char *wxSwissFontName; - extern char *wxScriptFontName; - extern char *wxTeletypeFontName; - extern char *wxDefaultFontName; - - (void) wxGetResource("wxWindows", "defaultFamily", &wxDefaultFontName); - (void) wxGetResource("wxWindows", "decorativeFamily", &wxDecorativeFontName); - (void) wxGetResource("wxWindows", "romanFamily", &wxRomanFontName); - (void) wxGetResource("wxWindows", "modernFamily", &wxModernFontName); - (void) wxGetResource("wxWindows", "swissFamily", &wxSwissFontName); - (void) wxGetResource("wxWindows", "scriptFamily", &wxScriptFontName); - (void) wxGetResource("wxWindows", "teletypeFamily", &wxTeletypeFontName); -#endif - #if USE_RESOURCES - (void) wxGetResource("wxWindows", "OsVersion", &wxOsVersion); + wxGetResource("wxWindows", "OsVersion", &wxOsVersion); #endif wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING); @@ -391,7 +369,7 @@ void wxApp::CommonInit(void) g_globalCursor = new wxCursor; } -void wxApp::CommonCleanUp(void) +void wxApp::CommonCleanUp() { #if USE_WX_RESOURCES wxCleanUpResourceSystem(); @@ -444,7 +422,7 @@ int wxEntry(WXHINSTANCE hInstance, WXHINSTANCE WXUNUSED(hPrevInstance), char *m_ { wxhInstance = (HINSTANCE) hInstance; -#if (DEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT +#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT #if !defined(_WINDLL) streambuf* sBuf = new wxDebugStreamBuf; @@ -596,7 +574,7 @@ int wxEntry(WXHINSTANCE hInstance, WXHINSTANCE WXUNUSED(hPrevInstance), char *m_ delete [] command[0] ; delete [] command ; -#if (DEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT +#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT // At this point we want to check if there are any memory // blocks that aren't part of the wxDebugContext itself, // as a special case. Then when dumping we need to ignore @@ -658,7 +636,7 @@ int wxEntry(WXHINSTANCE hInstance) // Static member initialization wxAppInitializerFunction wxApp::m_appInitFn = (wxAppInitializerFunction) NULL; -wxApp::wxApp(void) +wxApp::wxApp() { m_topWindow = NULL; wxTheApp = this; @@ -670,18 +648,16 @@ wxApp::wxApp(void) m_appName = ""; argc = 0; argv = NULL; -#ifdef __WINDOWS__ +#ifdef __WXMSW__ m_printMode = wxPRINT_WINDOWS; #else m_printMode = wxPRINT_POSTSCRIPT; #endif -// work_proc = NULL; m_exitOnFrameDelete = TRUE; -// m_showOnInit = TRUE; m_auto3D = TRUE; } -bool wxApp::Initialized(void) +bool wxApp::Initialized() { #ifndef _WINDLL if (GetTopWindow()) @@ -699,7 +675,7 @@ bool wxApp::Initialized(void) * received. * */ -bool wxApp::DoMessage(void) +bool wxApp::DoMessage() { if (!::GetMessage(&s_currentMsg, (HWND) NULL, 0, 0)) { @@ -730,7 +706,7 @@ bool wxApp::DoMessage(void) * are processed (it'll sit in DoMessage). */ -int wxApp::MainLoop(void) +int wxApp::MainLoop() { m_keepGoing = TRUE; while (m_keepGoing) @@ -745,7 +721,7 @@ int wxApp::MainLoop(void) } // Returns TRUE if more time is needed. -bool wxApp::ProcessIdle(void) +bool wxApp::ProcessIdle() { wxIdleEvent event; event.SetEventObject(this); @@ -754,17 +730,17 @@ bool wxApp::ProcessIdle(void) return event.MoreRequested(); } -void wxApp::ExitMainLoop(void) +void wxApp::ExitMainLoop() { m_keepGoing = FALSE; } -bool wxApp::Pending(void) +bool wxApp::Pending() { return (::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) != 0) ; } -void wxApp::Dispatch(void) +void wxApp::Dispatch() { if (!DoMessage()) m_keepGoing = FALSE; @@ -781,26 +757,29 @@ bool wxApp::ProcessMessage(WXMSG *Msg) HWND hWnd; - // Anyone for a message? Try youngest descendants first. + // Try translations first; find the youngest window with + // a translation table. for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) { wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd); if (wnd) { - if (wnd->MSWProcessMessage(Msg)) + if (wnd->MSWTranslateMessage(Msg)) return TRUE; - - // STOP if we've reached the top of the hierarchy! -// if (m_topWindow && (wnd == m_topWindow)) -// return FALSE; } } - // TODO: Is this now obsolete, given that m_topWindow may not be defined? - // Does it do anything useful anyway? -// if (m_topWindow && m_topWindow->MSWProcessMessage(Msg)) -// return TRUE; - return FALSE; + // Anyone for a non-translation message? Try youngest descendants first. + for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) + { + wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd); + if (wnd) + { + if (wnd->MSWProcessMessage(Msg)) + return TRUE; + } + } + return FALSE; } void wxApp::OnIdle(wxIdleEvent& event) @@ -816,8 +795,14 @@ void wxApp::OnIdle(wxIdleEvent& event) // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); + // flush the logged messages if any + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL && pLog->HasPendingMessages() ) + pLog->Flush(); + // Send OnIdle events to all windows bool needMore = SendIdleEvents(); +// bool needMore = FALSE; if (needMore) event.RequestMore(TRUE); @@ -826,7 +811,7 @@ void wxApp::OnIdle(wxIdleEvent& event) } // Send idle event to all top-level windows -bool wxApp::SendIdleEvents(void) +bool wxApp::SendIdleEvents() { bool needMore = FALSE; wxNode* node = wxTopLevelWindows.First(); @@ -865,20 +850,7 @@ bool wxApp::SendIdleEvents(wxWindow* win) return needMore ; } -// Windows specific. Intercept keyboard input: by default, -// route it to the active frame or dialog box. -#if WXWIN_COMPATIBILITY == 2 -bool wxApp::OldOnCharHook(wxKeyEvent& event) -{ - wxWindow *win = wxGetActiveWindow(); - if (win) - return win->GetEventHandler()->OldOnCharHook(event); - else - return FALSE; -} -#endif - -void wxApp::DeletePendingObjects(void) +void wxApp::DeletePendingObjects() { wxNode *node = wxPendingDelete.First(); while (node) @@ -898,7 +870,7 @@ void wxApp::DeletePendingObjects(void) /* // Free up font objects that are not being used at present. -bool wxApp::DoResourceCleanup(void) +bool wxApp::DoResourceCleanup() { // wxDebugMsg("ResourceCleanup\n"); @@ -950,12 +922,12 @@ bool wxApp::DoResourceCleanup(void) } */ -wxLog* wxApp::CreateLogTarget(void) +wxLog* wxApp::CreateLogTarget() { return new wxLogGui; } -wxWindow* wxApp::GetTopWindow(void) const +wxWindow* wxApp::GetTopWindow() const { if (m_topWindow) return m_topWindow; @@ -965,14 +937,57 @@ wxWindow* wxApp::GetTopWindow(void) const return NULL; } -void wxExit(void) +int wxApp::GetComCtl32Version() const +{ + // have we loaded COMCTL32 yet? + HMODULE theModule = ::GetModuleHandle("COMCTL32"); + int version = 0; + + // if so, then we can check for the version + if (theModule) + { + // InitCommonControlsEx is unique to 4.7 and later + FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx"); + + if (! theProc) + { // not found, must be 4.00 + version = 400; + } + else + { + // The following symbol are unique to 4.71 + // DllInstall + // FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos + // FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo + // FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange + // FlatSB_ShowScrollBar + // _DrawIndirectImageList _DuplicateImageList + // InitializeFlatSB + // UninitializeFlatSB + // we could check for any of these - I chose DllInstall + FARPROC theProc = ::GetProcAddress(theModule, "DllInstall"); + if (! theProc) + { + // not found, must be 4.70 + version = 470; + } + else + { // found, must be 4.71 + version = 471; + } + } + } + return version; +} + +void wxExit() { wxApp::CleanUp(); FatalAppExit(0, "Fatal error: exiting"); } // Yield to incoming messages -bool wxYield(void) +bool wxYield() { MSG msg; // We want to go back to the main message loop