X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7214297d16aed4c160c1cbef6b19f153ca065ab7..34636400a0018eba4a1f63dda18cf32e944b959e:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 21dd1dbecc..dc629191c1 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -93,14 +93,14 @@ extern char *wxOsVersion; extern wxList *wxWinHandleList; extern wxList WXDLLEXPORT wxPendingDelete; #if wxUSE_THREADS -extern wxList wxPendingEvents; -extern wxCriticalSection wxPendingEventsLocker; +extern wxList *wxPendingEvents; +extern wxCriticalSection *wxPendingEventsLocker; #endif extern void wxSetKeyboardHook(bool doIt); extern wxCursor *g_globalCursor; HINSTANCE wxhInstance = 0; -static MSG s_currentMsg; +MSG s_currentMsg; wxApp *wxTheApp = NULL; // FIXME why not const? and not static? @@ -150,8 +150,6 @@ LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); END_EVENT_TABLE() #endif -long wxApp::sm_lastMessageTime = 0; - //// Initialize bool wxApp::Initialize() { @@ -169,6 +167,13 @@ bool wxApp::Initialize() wxGetResource("wxWindows", "OsVersion", &wxOsVersion); #endif + // I'm annoyed ... I don't know where to put this and I don't want to + // create a module for that as it's part of the core. +#if wxUSE_THREADS + wxPendingEvents = new wxList(); + wxPendingEventsLocker = new wxCriticalSection(); +#endif + wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING); wxTheColourDatabase->Initialize(); @@ -199,18 +204,6 @@ bool wxApp::Initialize() int iMsg = 96; while (!SetMessageQueue(iMsg) && (iMsg -= 8)); - /* - DWORD dwOleVer; - dwOleVer = CoBuildVersion(); - - // check the OLE library version - if (rmm != HIWORD(dwOleVer)) - { - wxMessageBox("Incorrect version of OLE libraries."); - return FALSE; - } - */ - #if wxUSE_OLE // we need to initialize OLE library if ( FAILED(::OleInitialize(NULL)) ) @@ -238,11 +231,11 @@ bool wxApp::Initialize() // Create the brush for disabling bitmap buttons - LOGBRUSH lb ; + LOGBRUSH lb; lb.lbStyle = BS_PATTERN; - lb.lbHatch = (int)LoadBitmap( wxhInstance, "wxDISABLE_BUTTON_BITMAP" ) ; - wxDisableButtonBrush = ::CreateBrushIndirect( & lb ) ; - ::DeleteObject( (HGDIOBJ)lb.lbHatch ) ; + lb.lbHatch = (int)LoadBitmap( wxhInstance, "wxDISABLE_BUTTON_BITMAP" ); + wxDisableButtonBrush = ::CreateBrushIndirect( & lb ); + ::DeleteObject( (HGDIOBJ)lb.lbHatch ); #if wxUSE_PENWINDOWS wxRegisterPenWin(); @@ -265,131 +258,88 @@ bool wxApp::Initialize() return TRUE; } -//// RegisterWindowClasses +// --------------------------------------------------------------------------- +// RegisterWindowClasses +// --------------------------------------------------------------------------- bool wxApp::RegisterWindowClasses() { - /////////////////////////////////////////////////////////////////////// - // Register the frame window class. - WNDCLASS wndclass; // Structure used to register Windows class. + WNDCLASS wndclass; - wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; + // the fields which are common to all classes + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wndclass.lpfnWndProc = (WNDPROC)wxWndProc; wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = sizeof( DWORD ); // was 4 + wndclass.cbWndExtra = sizeof( DWORD ); // what is this DWORD used for? wndclass.hInstance = wxhInstance; - 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.hIcon = (HICON) NULL; + wndclass.hCursor = ::LoadCursor((HINSTANCE)NULL, IDC_ARROW); wndclass.lpszMenuName = NULL; + + // Register the frame window class. + wndclass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); #ifdef _MULTIPLE_INSTANCES sprintf( wxFrameClassName,"wxFrameClass%d", wxhInstance ); #endif wndclass.lpszClassName = wxFrameClassName; - if (!RegisterClass( &wndclass )) + if ( !RegisterClass(&wndclass) ) { - // wxFatalError("Can't register Frame Window class"); + wxLogLastError("RegisterClass(frame)"); + + return FALSE; } - /////////////////////////////////////////////////////////////////////// // Register the MDI frame window class. - WNDCLASS wndclass1; // Structure used to register Windows class. - - 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 = (HICON) NULL; // wxSTD_MDIPARENTFRAME_ICON; - wndclass1.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); - // wndclass1.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1) ; - wndclass1.hbrBackground = (HBRUSH) NULL; - wndclass1.lpszMenuName = NULL; - - wndclass1.lpszClassName = wxMDIFrameClassName; - if (!RegisterClass( &wndclass1 )) + wndclass.hbrBackground = (HBRUSH)NULL; // paint MDI frame ourselves + wndclass.lpszClassName = wxMDIFrameClassName; + + if ( !RegisterClass(&wndclass) ) { - // wxFatalError("Can't register MDI Frame window class"); - // return FALSE; + wxLogLastError("RegisterClass(MDI parent)"); + + return FALSE; } - /////////////////////////////////////////////////////////////////////// // Register the MDI child frame window class. - WNDCLASS wndclass4; // Structure used to register Windows class. - - 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 = (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?) - wndclass4.hbrBackground = (HBRUSH)(COLOR_WINDOW+1) ; - // wndclass4.hbrBackground = NULL; - wndclass4.lpszMenuName = NULL; - wndclass4.lpszClassName = wxMDIChildFrameClassName; - - if (!RegisterClass( &wndclass4 )) + wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wndclass.lpszClassName = wxMDIChildFrameClassName; + + if ( !RegisterClass(&wndclass) ) { - // wxFatalError("Can't register MDI child frame window class"); - // return FALSE; + wxLogLastError("RegisterClass(MDI child)"); + + return FALSE; } - /////////////////////////////////////////////////////////////////////// // Register the panel window class. - WNDCLASS wndclass2; // Structure used to register Windows class. - memset(&wndclass2, 0, sizeof(WNDCLASS)); // start with NULL defaults - 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 = (HICON) NULL; - wndclass2.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); - // wndclass2.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1) ; - wndclass2.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH ); - wndclass2.lpszMenuName = NULL; - wndclass2.lpszClassName = wxPanelClassName; - if (!RegisterClass( &wndclass2 )) + wndclass.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH ); + wndclass.lpszClassName = wxPanelClassName; + + if ( !RegisterClass(&wndclass) ) { - // wxFatalError("Can't register Panel Window class"); - // return FALSE; + wxLogLastError("RegisterClass(panel)"); + + return FALSE; } - /////////////////////////////////////////////////////////////////////// // Register the canvas and textsubwindow class name - WNDCLASS wndclass3; // Structure used to register Windows class. - memset(&wndclass3, 0, sizeof(WNDCLASS)); // start with NULL defaults - // Use CS_OWNDC to avoid messing about restoring the context - // for every graphic operation. - // wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS ; - // wxWin 2.0 - wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; - wndclass3.lpfnWndProc = (WNDPROC)wxWndProc; - wndclass3.cbClsExtra = 0; - wndclass3.cbWndExtra = sizeof( DWORD ); // was 4 - wndclass3.hInstance = wxhInstance; - wndclass3.hIcon = (HICON) NULL; - wndclass3.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW ); - // wndclass3.hbrBackground = (HBRUSH)(COLOR_WINDOW+1) ; - wndclass3.hbrBackground = (HBRUSH) NULL; - wndclass3.lpszMenuName = NULL; - wndclass3.lpszClassName = wxCanvasClassName; - if (!RegisterClass( &wndclass3)) + wndclass.hbrBackground = (HBRUSH)NULL; + wndclass.lpszClassName = wxCanvasClassName; + + if ( !RegisterClass(&wndclass) ) { - // wxFatalError("Can't register Canvas class"); - // return FALSE; + wxLogLastError("RegisterClass(canvas)"); + + return FALSE; } return TRUE; } -//// Convert Windows to argc, argv style +// --------------------------------------------------------------------------- +// Convert Windows to argc, argv style +// --------------------------------------------------------------------------- void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine) { @@ -466,6 +416,7 @@ void wxApp::CleanUp() { //// COMMON CLEANUP +#if wxUSE_LOG // flush the logged messages if any and install a 'safer' log target: the // default one (wxLogGui) can't be used after the resources are freed just // below and the user suppliedo ne might be even more unsafe (using any @@ -474,6 +425,7 @@ void wxApp::CleanUp() // this will flush the old messages if any delete wxLog::SetActiveTarget(new wxLogStderr); +#endif // wxUSE_LOG // One last chance for pending objects to be cleaned up wxTheApp->DeletePendingObjects(); @@ -493,7 +445,7 @@ void wxApp::CleanUp() delete g_globalCursor; g_globalCursor = NULL; - wxDeleteStockObjects() ; + wxDeleteStockObjects(); // Destroy all GDI lists, etc. wxDeleteStockLists(); @@ -538,7 +490,7 @@ void wxApp::CleanUp() DestroyIcon(wxDEFAULT_MDIPARENTFRAME_ICON); if ( wxDisableButtonBrush ) - ::DeleteObject( wxDisableButtonBrush ) ; + ::DeleteObject( wxDisableButtonBrush ); #if wxUSE_OLE ::OleUninitialize(); @@ -549,7 +501,16 @@ void wxApp::CleanUp() #endif if (wxWinHandleList) - delete wxWinHandleList ; + delete wxWinHandleList; + + // GL: I'm annoyed ... I don't know where to put this and I don't want to + // create a module for that as it's part of the core. +#if wxUSE_THREADS + delete wxPendingEvents; + delete wxPendingEventsLocker; + // If we don't do the following, we get an apparent memory leak. + ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker(); +#endif wxClassInfo::CleanUpClasses(); @@ -570,8 +531,10 @@ void wxApp::CleanUp() // wxDebugContext::SetStream(NULL, NULL); #endif +#if wxUSE_LOG // do it as the very last thing because everything else can log messages delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG } #if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL)) @@ -631,7 +594,7 @@ int wxEntry(WXHINSTANCE hInstance, // GUI-specific initialisation. In fact on Windows we don't have any, // but this call is provided for compatibility across platforms. - wxTheApp->OnInitGui() ; + wxTheApp->OnInitGui(); int retValue = 0; @@ -744,16 +707,11 @@ wxApp::wxApp() { m_topWindow = NULL; wxTheApp = this; - m_className = ""; - m_wantDebugOutput = TRUE ; - m_appName = ""; + m_wantDebugOutput = TRUE; + argc = 0; argv = NULL; -#ifdef __WXMSW__ m_printMode = wxPRINT_WINDOWS; -#else - m_printMode = wxPRINT_POSTSCRIPT; -#endif m_exitOnFrameDelete = TRUE; m_auto3D = TRUE; } @@ -860,7 +818,6 @@ bool wxApp::DoMessage() if ( !ProcessMessage((WXMSG *)&s_currentMsg) ) { ::TranslateMessage(&s_currentMsg); - wxApp::sm_lastMessageTime = s_currentMsg.time; /* MATTHEW: timeStamp impl. */ ::DispatchMessage(&s_currentMsg); } } @@ -899,11 +856,6 @@ int wxApp::MainLoop() DoMessage(); - - // If they are pending events, we must process them. -#if wxUSE_THREADS - ProcessPendingEvents(); -#endif } return s_currentMsg.wParam; @@ -921,9 +873,9 @@ bool wxApp::ProcessIdle() #if wxUSE_THREADS void wxApp::ProcessPendingEvents() - - wxNode *node = wxPendingEvents.First(); - wxCriticalSectionLocker locker(wxPendingEventsLocker); +{ + wxNode *node = wxPendingEvents->First(); + wxCriticalSectionLocker locker(*wxPendingEventsLocker); while (node) { @@ -932,7 +884,7 @@ void wxApp::ProcessPendingEvents() handler->ProcessPendingEvents(); delete node; - node = wxPendingEvents.First(); + node = wxPendingEvents->First(); } } #endif @@ -945,7 +897,7 @@ void wxApp::ExitMainLoop() bool wxApp::Pending() { - return (::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) != 0) ; + return (::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) != 0); } void wxApp::Dispatch() @@ -996,10 +948,12 @@ void wxApp::OnIdle(wxIdleEvent& event) // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); +#if wxUSE_LOG // flush the logged messages if any wxLog *pLog = wxLog::GetActiveTarget(); if ( pLog != NULL && pLog->HasPendingMessages() ) pLog->Flush(); +#endif // wxUSE_LOG // Send OnIdle events to all windows if ( SendIdleEvents() ) @@ -1009,6 +963,10 @@ void wxApp::OnIdle(wxIdleEvent& event) event.RequestMore(TRUE); } + // If they are pending events, we must process them. +#if wxUSE_THREADS + ProcessPendingEvents(); +#endif s_inOnIdle = FALSE; } @@ -1016,14 +974,14 @@ void wxApp::OnIdle(wxIdleEvent& event) bool wxApp::SendIdleEvents() { bool needMore = FALSE; - wxNode* node = wxTopLevelWindows.First(); + + wxWindowList::Node* node = wxTopLevelWindows.GetFirst(); while (node) { - wxWindow* win = (wxWindow*) node->Data(); + wxWindow* win = node->GetData(); if (SendIdleEvents(win)) needMore = TRUE; - - node = node->Next(); + node = node->GetNext(); } return needMore; @@ -1050,7 +1008,7 @@ bool wxApp::SendIdleEvents(wxWindow* win) node = node->Next(); } - return needMore ; + return needMore; } void wxApp::DeletePendingObjects() @@ -1097,8 +1055,8 @@ wxWindow* wxApp::GetTopWindow() const { if (m_topWindow) return m_topWindow; - else if (wxTopLevelWindows.Number() > 0) - return (wxWindow*) wxTopLevelWindows.First()->Data(); + else if (wxTopLevelWindows.GetCount() > 0) + return wxTopLevelWindows.GetFirst()->GetData(); else return NULL; } @@ -1164,6 +1122,10 @@ bool wxYield() if ( !wxTheApp->DoMessage() ) break; } + // If they are pending events, we must process them. +#if wxUSE_THREADS + wxTheApp->ProcessPendingEvents(); +#endif return TRUE; }