X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce3ed50dbe32d118321082db84c3a9abb047d5b7..0492c5a094d1baac126331385d66d2f66aa5db52:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index a1b24b0f1a..16b58ba2f9 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -34,6 +34,7 @@ #include "wx/dialog.h" #include "wx/msgdlg.h" #include "wx/intl.h" + #include "wx/dynarray.h" #endif #include "wx/msw/private.h" @@ -60,43 +61,17 @@ // Also, OLE is used not just for drag and drop (it's used by automatn.cpp). // #if wxUSE_DRAG_AND_DROP #if !defined(__GNUWIN32__) && !defined(__SC__) && !defined(__SALFORDC__) -#include + #include #endif -// #endif - #include #include -#if defined(__WIN95__) && !defined(__GNUWIN32__) +#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) #include #endif -// use debug CRT functions for memory leak detections in VC++ if we're not -// using wxWindows own methods -#if defined(__WXDEBUG__) && defined(_MSC_VER) && !wxUSE_GLOBAL_MEMORY_OPERATORS && !defined(__NO_VC_CRTDBG__) - #define wxUSE_VC_CRTDBG -#else - #undef wxUSE_VC_CRTDBG -#endif - -#ifdef wxUSE_VC_CRTDBG - // VC++ uses this macro as debug/release mode indicator - #ifndef _DEBUG - #define _DEBUG - #endif - - /* Need to undef new if including crtdbg.h */ - #ifdef new - #undef new - #endif - - #include - - #if defined(__WXDEBUG__) && wxUSE_GLOBAL_MEMORY_OPERATORS && wxUSE_DEBUG_NEW_ALWAYS - #define new new(__FILE__,__LINE__) - #endif -#endif // wxUSE_VC_CRTDBG +#include "wx/msw/msvcrt.h" extern char *wxBuffer; extern char *wxOsVersion; @@ -116,15 +91,15 @@ char wxMDIChildFrameClassName[] = "wxMDIChildFrameClass"; char wxPanelClassName[] = "wxPanelClass"; char wxCanvasClassName[] = "wxCanvasClass"; -HICON wxSTD_FRAME_ICON = NULL; -HICON wxSTD_MDICHILDFRAME_ICON = NULL; -HICON wxSTD_MDIPARENTFRAME_ICON = NULL; +HICON wxSTD_FRAME_ICON = (HICON) NULL; +HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL; +HICON wxSTD_MDIPARENTFRAME_ICON = (HICON) NULL; -HICON wxDEFAULT_FRAME_ICON = NULL; -HICON wxDEFAULT_MDICHILDFRAME_ICON = NULL; -HICON wxDEFAULT_MDIPARENTFRAME_ICON = NULL; +HICON wxDEFAULT_FRAME_ICON = (HICON) NULL; +HICON wxDEFAULT_MDICHILDFRAME_ICON = (HICON) NULL; +HICON wxDEFAULT_MDIPARENTFRAME_ICON = (HICON) NULL; -HBRUSH wxDisableButtonBrush = 0; +HBRUSH wxDisableButtonBrush = (HBRUSH) 0; LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); @@ -140,8 +115,14 @@ LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); long wxApp::sm_lastMessageTime = 0; -#ifdef __WIN95__ - static HINSTANCE gs_hRichEdit = NULL; +#if defined(__WIN95__) && !defined(__TWIN32__) +#define wxUSE_RICHEDIT 1 +#else +#define wxUSE_RICHEDIT 0 +#endif + +#if wxUSE_RICHEDIT + static HINSTANCE gs_hRichEdit = (HINSTANCE) NULL; #endif //// Initialize @@ -156,13 +137,6 @@ bool wxApp::Initialize() wxBuffer = new char[1500]; -#ifdef wxUSE_VC_CRTDBG - // do check for memory leaks on program exit - // (another useful flag is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free - // deallocated memory which may be used to simulate low-memory condition) - _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); -#endif // debug build under MS VC++ - wxClassInfo::InitializeClasses(); #if wxUSE_RESOURCES @@ -183,12 +157,16 @@ bool wxApp::Initialize() #if defined(__WIN95__) InitCommonControls(); + +#if wxUSE_RICHEDIT gs_hRichEdit = LoadLibrary("RICHED32.DLL"); - if (gs_hRichEdit == NULL) + if (gs_hRichEdit == (HINSTANCE) NULL) { wxMessageBox("Could not initialise Rich Edit DLL"); } +#endif + #endif int iMsg = 96; @@ -214,7 +192,7 @@ bool wxApp::Initialize() wxFatalError(_("Cannot initialize OLE")); #endif -#if CTL3D +#if wxUSE_CTL3D if (!Ctl3dRegister(wxhInstance)) wxFatalError("Cannot register CTL3D"); @@ -247,9 +225,9 @@ bool wxApp::Initialize() wxWinHandleList = new wxList(wxKEY_INTEGER); - // This is to foil optimizations in Visual C++ that - // throw out dummy.obj. -#if defined(_MSC_VER) && !defined(WXMAKINGDLL) + // This is to foil optimizations in Visual C++ that throw out dummy.obj. + // PLEASE DO NOT ALTER THIS. +#if defined(__VISUALC__) && !defined(WXMAKINGDLL) extern char wxDummyChar; if (wxDummyChar) wxDummyChar++; #endif @@ -270,13 +248,13 @@ bool wxApp::RegisterWindowClasses() // Register the frame window class. WNDCLASS wndclass; // Structure used to register Windows class. - wndclass.style = CS_HREDRAW | CS_VREDRAW; + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wndclass.lpfnWndProc = (WNDPROC)wxWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = sizeof( DWORD ); // was 4 wndclass.hInstance = wxhInstance; - wndclass.hIcon = NULL; // wxSTD_FRAME_ICON; - wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndclass.hIcon = (HICON) NULL; // wxSTD_FRAME_ICON; + wndclass.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1) ; // wndclass.hbrBackground = GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; @@ -294,15 +272,15 @@ bool wxApp::RegisterWindowClasses() // Register the MDI frame window class. WNDCLASS wndclass1; // Structure used to register Windows class. - wndclass1.style = CS_HREDRAW | CS_VREDRAW; + wndclass1.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wndclass1.lpfnWndProc = (WNDPROC)wxWndProc; wndclass1.cbClsExtra = 0; wndclass1.cbWndExtra = sizeof( DWORD ); // was 4 wndclass1.hInstance = wxhInstance; - wndclass1.hIcon = NULL; // wxSTD_MDIPARENTFRAME_ICON; - wndclass1.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndclass1.hIcon = (HICON) NULL; // wxSTD_MDIPARENTFRAME_ICON; + wndclass1.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); // wndclass1.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1) ; - wndclass1.hbrBackground = NULL; + wndclass1.hbrBackground = (HBRUSH) NULL; wndclass1.lpszMenuName = NULL; wndclass1.lpszClassName = wxMDIFrameClassName; @@ -316,13 +294,13 @@ bool wxApp::RegisterWindowClasses() // Register the MDI child frame window class. WNDCLASS wndclass4; // Structure used to register Windows class. - wndclass4.style = CS_HREDRAW | CS_VREDRAW; + wndclass4.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wndclass4.lpfnWndProc = (WNDPROC)wxWndProc; wndclass4.cbClsExtra = 0; wndclass4.cbWndExtra = sizeof( DWORD ); // was 4 wndclass4.hInstance = wxhInstance; - wndclass4.hIcon = NULL; // wxSTD_MDICHILDFRAME_ICON; - wndclass4.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndclass4.hIcon = (HICON) NULL; // wxSTD_MDICHILDFRAME_ICON; + wndclass4.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); // TODO: perhaps this should be NULL so that Windows doesn't // paint the background itself (would OnEraseBackground duplicate // this?) @@ -341,15 +319,13 @@ bool wxApp::RegisterWindowClasses() // Register the panel window class. WNDCLASS wndclass2; // Structure used to register Windows class. memset(&wndclass2, 0, sizeof(WNDCLASS)); // start with NULL defaults - // Use CS_OWNDC to avoid messing about restoring the context - // for every graphic operation. - wndclass2.style = CS_HREDRAW | CS_VREDRAW; + wndclass2.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wndclass2.lpfnWndProc = (WNDPROC)wxWndProc; wndclass2.cbClsExtra = 0; wndclass2.cbWndExtra = sizeof( DWORD ); // was 4 wndclass2.hInstance = wxhInstance; - wndclass2.hIcon = NULL; - wndclass2.hCursor = NULL; + wndclass2.hIcon = (HICON) NULL; + wndclass2.hCursor = (HCURSOR) NULL; // wndclass2.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1) ; wndclass2.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH ); wndclass2.lpszMenuName = NULL; @@ -373,10 +349,10 @@ bool wxApp::RegisterWindowClasses() wndclass3.cbClsExtra = 0; wndclass3.cbWndExtra = sizeof( DWORD ); // was 4 wndclass3.hInstance = wxhInstance; - wndclass3.hIcon = NULL; - wndclass3.hCursor = NULL; + wndclass3.hIcon = (HICON) NULL; + wndclass3.hCursor = (HCURSOR) NULL; // wndclass3.hbrBackground = (HBRUSH)(COLOR_WINDOW+1) ; - wndclass3.hbrBackground = NULL; + wndclass3.hbrBackground = (HBRUSH) NULL; wndclass3.lpszMenuName = NULL; wndclass3.lpszClassName = wxCanvasClassName; if (!RegisterClass( &wndclass3)) @@ -402,7 +378,8 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) ::GetModuleFileName(wxhInstance, name, WXSIZEOF(name)); // GNUWIN32 already fills in the first arg with the application name. -#if !defined(__GNUWIN32__) + // JACS: apparently not now (b20 and above?) +#if 0 // !defined(__GNUWIN32__) args.Add(name); count ++; #endif @@ -467,6 +444,15 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) void wxApp::CleanUp() { //// COMMON CLEANUP + + // flush the logged messages if any + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL && pLog->HasPendingMessages() ) + pLog->Flush(); + + // One last chance for pending objects to be cleaned up + wxTheApp->DeletePendingObjects(); + wxModule::CleanUpModules(); #if wxUSE_WX_RESOURCES @@ -500,10 +486,14 @@ void wxApp::CleanUp() wxSetKeyboardHook(FALSE); #ifdef __WIN95__ - if (gs_hRichEdit != NULL) + +#if wxUSE_RICHEDIT + if (gs_hRichEdit != (HINSTANCE) NULL) FreeLibrary(gs_hRichEdit); #endif +#endif + #if wxUSE_PENWINDOWS wxCleanUpPenWin(); #endif @@ -529,7 +519,7 @@ void wxApp::CleanUp() ::OleUninitialize(); #endif -#if CTL3D +#if wxUSE_CTL3D Ctl3dUnregister(wxhInstance); #endif @@ -563,7 +553,7 @@ void wxApp::CleanUp() #if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL)) // temporarily disable this warning -#ifdef _MSC_VER +#ifdef __VISUALC__ #pragma warning(disable: 4715) // not all control paths return a value #endif // Visual C++ @@ -574,14 +564,19 @@ int wxEntry(WXHINSTANCE hInstance, int nCmdShow, bool enterLoop) { + // do check for memory leaks on program exit + // (another useful flag is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free + // deallocated memory which may be used to simulate low-memory condition) + wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); + // take everything into a try-except block in release build // FIXME other compilers must support Win32 SEH (structured exception // handling) too, just find the appropriate keyword in their docs! // Please note that it's _not_ the same as C++ exceptions! -#if !defined(__WXDEBUG__) && defined(_MSC_VER) +#if !defined(__WXDEBUG__) && defined(__VISUALC__) #define CATCH_PROGRAM_EXCEPTIONS - __try { + __try { #else #undef CATCH_PROGRAM_EXCEPTIONS #endif @@ -621,6 +616,9 @@ int wxEntry(WXHINSTANCE hInstance, { retValue = wxTheApp->OnRun(); } + else + // We want to initialize, but not run or exit immediately. + return 1; } //else: app initialization failed, so we skipped OnRun() @@ -643,12 +641,6 @@ int wxEntry(WXHINSTANCE hInstance, wxTheApp->OnExit(); - // flush the logged messages if any - wxLog *pLog = wxLog::GetActiveTarget(); - if ( pLog != NULL && pLog->HasPendingMessages() ) - pLog->Flush(); - - wxApp::CleanUp(); return retValue; @@ -669,7 +661,7 @@ int wxEntry(WXHINSTANCE hInstance, } // restore warning state -#ifdef _MSC_VER +#ifdef __VISUALC__ #pragma warning(default: 4715) // not all control paths return a value #endif // Visual C++ @@ -922,7 +914,7 @@ bool wxApp::ProcessMessage(WXMSG *Msg) // Try translations first; find the youngest window with // a translation table. - for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) + for (hWnd = msg->hwnd; hWnd != (HWND) NULL; hWnd = ::GetParent(hWnd)) { wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd); if (wnd) @@ -933,7 +925,7 @@ bool wxApp::ProcessMessage(WXMSG *Msg) } // Anyone for a non-translation message? Try youngest descendants first. - for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) + for (hWnd = msg->hwnd; hWnd != (HWND) NULL; hWnd = ::GetParent(hWnd)) { wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd); if (wnd) @@ -1033,7 +1025,7 @@ void wxApp::DeletePendingObjects() } } -void wxApp::OnEndSession(wxCloseEvent& event) +void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event)) { if (GetTopWindow()) GetTopWindow()->Close(TRUE); @@ -1136,6 +1128,6 @@ HINSTANCE wxGetInstance() // For some reason, with MSVC++ 1.5, WinMain isn't linked in properly // if in a separate file. So include it here to ensure it's linked. -#if (defined(_MSC_VER) && !defined(__WIN32__)) || defined(__GNUWIN32__) +#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__)) #include "main.cpp" #endif