X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eb5e4d9ac1527441fe107460c7fee93092175a3e..83911a5a4d3be63141419b4401259093514794a3:/src/msw/app.cpp?ds=sidebyside diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 480bb9b54d..bb05dd8873 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -117,7 +117,9 @@ #define _WIN32_IE 0x0200 #endif -#if _WIN32_IE >= 0x0300 && !defined(__MINGW32__) +#if _WIN32_IE >= 0x0300 && \ + (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \ + !defined(__CYGWIN__) #include #endif @@ -136,16 +138,12 @@ wxApp *wxTheApp = NULL; // NB: all "NoRedraw" classes must have the same names as the "normal" classes // with NR suffix - wxWindow::MSWCreate() supposes this -const wxChar *wxFrameClassName = wxT("wxFrameClass"); -const wxChar *wxFrameClassNameNoRedraw = wxT("wxFrameClassNR"); +const wxChar *wxCanvasClassName = wxT("wxWindowClass"); +const wxChar *wxCanvasClassNameNR = wxT("wxWindowClassNR"); const wxChar *wxMDIFrameClassName = wxT("wxMDIFrameClass"); const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR"); const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass"); const wxChar *wxMDIChildFrameClassNameNoRedraw = wxT("wxMDIChildFrameClassNR"); -const wxChar *wxPanelClassName = wxT("wxPanelClass"); -const wxChar *wxPanelClassNameNR = wxT("wxPanelClassNR"); -const wxChar *wxCanvasClassName = wxT("wxCanvasClass"); -const wxChar *wxCanvasClassNameNR = wxT("wxCanvasClassNR"); HICON wxSTD_FRAME_ICON = (HICON) NULL; HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL; @@ -193,8 +191,8 @@ END_EVENT_TABLE() bool wxApp::Initialize() { // the first thing to do is to check if we're trying to run an Unicode - // program under Win9x - if so, abort right now as it has no chance to - // work + // 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 ) { @@ -213,12 +211,6 @@ bool wxApp::Initialize() } #endif // wxUSE_UNICODE && !wxUSE_UNICODE_MSLU - // Some people may wish to use this, but - // probably it shouldn't be here by default. -#ifdef __WXDEBUG__ - // wxRedirectIOToConsole(); -#endif - wxBuffer = new wxChar[1500]; // FIXME wxClassInfo::InitializeClasses(); @@ -252,9 +244,11 @@ bool wxApp::Initialize() ; #endif // Win16 +#if wxUSE_OLE // we need to initialize OLE library if ( FAILED(::OleInitialize(NULL)) ) wxLogError(_("Cannot initialize OLE")); +#endif #endif // wxUSE_OLE @@ -326,6 +320,7 @@ bool wxApp::Initialize() bool wxApp::RegisterWindowClasses() { WNDCLASS wndclass; + wxZeroMemory(wndclass); // for each class we register one with CS_(V|H)REDRAW style and one // without for windows created with wxNO_FULL_REDRAW_ON_REPAINT flag @@ -334,34 +329,26 @@ bool wxApp::RegisterWindowClasses() // the fields which are common to all classes wndclass.lpfnWndProc = (WNDPROC)wxWndProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = sizeof( DWORD ); // VZ: what is this DWORD used for? wndclass.hInstance = wxhInstance; - 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); - wndclass.lpszClassName = wxFrameClassName; + wndclass.lpszClassName = wxCanvasClassName; wndclass.style = styleNormal; if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(frame)")); - - return FALSE; } // "no redraw" frame - wndclass.lpszClassName = wxFrameClassNameNoRedraw; + wndclass.lpszClassName = wxCanvasClassNameNR; wndclass.style = styleNoRedraw; if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(no redraw frame)")); - - return FALSE; } // Register the MDI frame window class. @@ -372,8 +359,6 @@ bool wxApp::RegisterWindowClasses() if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(MDI parent)")); - - return FALSE; } // "no redraw" MDI frame @@ -383,8 +368,6 @@ bool wxApp::RegisterWindowClasses() if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(no redraw MDI parent frame)")); - - return FALSE; } // Register the MDI child frame window class. @@ -395,8 +378,6 @@ bool wxApp::RegisterWindowClasses() if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(MDI child)")); - - return FALSE; } // "no redraw" MDI child frame @@ -406,51 +387,6 @@ bool wxApp::RegisterWindowClasses() if ( !RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(no redraw MDI child)")); - - return FALSE; - } - - // Register the panel window class. - wndclass.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH ); - wndclass.lpszClassName = wxPanelClassName; - wndclass.style = styleNormal; - - if ( !RegisterClass(&wndclass) ) - { - wxLogLastError(wxT("RegisterClass(panel)")); - - return FALSE; - } - - // Register the no redraw panel window class. - wndclass.lpszClassName = wxPanelClassNameNR; - wndclass.style = styleNoRedraw; - - if ( !RegisterClass(&wndclass) ) - { - wxLogLastError(wxT("RegisterClass(no redraw panel)")); - - return FALSE; - } - - // Register the canvas and textsubwindow class name - wndclass.hbrBackground = (HBRUSH)NULL; - wndclass.lpszClassName = wxCanvasClassName; - - if ( !RegisterClass(&wndclass) ) - { - wxLogLastError(wxT("RegisterClass(canvas)")); - - return FALSE; - } - - wndclass.lpszClassName = wxCanvasClassNameNR; - wndclass.style = styleNoRedraw; - if ( !RegisterClass(&wndclass) ) - { - wxLogLastError(wxT("RegisterClass(no redraw canvas)")); - - return FALSE; } return TRUE; @@ -465,24 +401,8 @@ bool wxApp::UnregisterWindowClasses() bool retval = TRUE; #ifndef __WXMICROWIN__ - // frame window class. - if ( !UnregisterClass(wxFrameClassName, wxhInstance) ) - { - wxLogLastError(wxT("UnregisterClass(frame)")); - - retval = FALSE; - } - - // "no redraw" frame - if ( !UnregisterClass(wxFrameClassNameNoRedraw, wxhInstance) ) - { - wxLogLastError(wxT("UnregisterClass(no redraw frame)")); - - return FALSE; - } - // MDI frame window class. - if ( !UnregisterClass(wxMDIFrameClassName, wxhInstance) ) + if ( !::UnregisterClass(wxMDIFrameClassName, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(MDI parent)")); @@ -490,7 +410,7 @@ bool wxApp::UnregisterWindowClasses() } // "no redraw" MDI frame - if ( !UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) ) + if ( !::UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(no redraw MDI parent frame)")); @@ -498,7 +418,7 @@ bool wxApp::UnregisterWindowClasses() } // MDI child frame window class. - if ( !UnregisterClass(wxMDIChildFrameClassName, wxhInstance) ) + if ( !::UnregisterClass(wxMDIChildFrameClassName, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(MDI child)")); @@ -506,45 +426,29 @@ bool wxApp::UnregisterWindowClasses() } // "no redraw" MDI child frame - if ( !UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) ) + if ( !::UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(no redraw MDI child)")); retval = FALSE; } - // panel window class. - if ( !UnregisterClass(wxPanelClassName, wxhInstance) ) - { - wxLogLastError(wxT("UnregisterClass(panel)")); - - retval = FALSE; - } - - // no redraw panel window class. - if ( !UnregisterClass(wxPanelClassNameNR, wxhInstance) ) - { - wxLogLastError(wxT("UnregisterClass(no redraw panel)")); - - retval = FALSE; - } - - // canvas and textsubwindow class name - if ( !UnregisterClass(wxCanvasClassName, wxhInstance) ) + // canvas class name + if ( !::UnregisterClass(wxCanvasClassName, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(canvas)")); retval = FALSE; } - if ( !UnregisterClass(wxCanvasClassNameNR, wxhInstance) ) + if ( !::UnregisterClass(wxCanvasClassNameNR, wxhInstance) ) { wxLogLastError(wxT("UnregisterClass(no redraw canvas)")); retval = FALSE; } -#endif - // __WXMICROWIN__ +#endif // __WXMICROWIN__ + return retval; } @@ -571,7 +475,9 @@ void wxApp::ConvertToStandardCommandArgs(const char* lpCmdLine) wxString name; wxFileName::SplitPath(argv[0], NULL, &name, NULL); - SetAppName(name); + // but don't override the name already set by the user code, if any + if ( GetAppName().empty() ) + SetAppName(name); // copy all the other arguments to wxApp::argv[] for ( int i = 1; i < argc; i++ ) @@ -795,32 +701,20 @@ int wxEntry(WXHINSTANCE hInstance, // we can't simply double-click on the error message and get to that // line in the source. So VC++ at least, let's have a sensible default. #ifdef __VISUALC__ +#if wxUSE_LOG wxLog::SetTimestamp(NULL); -#endif - - int retValue = 0; - - // it is common to create a modal dialog in OnInit() (to ask/notify the - // user about something) but it wouldn't work if we don't change the - // "exit on delete last frame" flag here as when this dialog is - // deleted, the app would terminate (it was the last top level window - // as the main frame wasn't created yet!), so disable this behaviour - // temproarily - bool exitOnLastFrameDelete = wxTheApp->GetExitOnFrameDelete(); - wxTheApp->SetExitOnFrameDelete(FALSE); +#endif // wxUSE_LOG +#endif // __VISUALC__ // init the app - retValue = wxEntryInitGui() && wxTheApp->OnInit() ? 0 : -1; - - // restore the old flag value - wxTheApp->SetExitOnFrameDelete(exitOnLastFrameDelete); + int retValue = wxEntryInitGui() && wxTheApp->OnInit() ? 0 : -1; if ( retValue == 0 ) { if ( enterLoop ) { // run the main loop - retValue = wxTheApp->OnRun(); + wxTheApp->OnRun(); } else { @@ -847,7 +741,7 @@ int wxEntry(WXHINSTANCE hInstance, } } - wxTheApp->OnExit(); + retValue = wxTheApp->OnExit(); wxEntryCleanup(); @@ -1008,16 +902,12 @@ bool wxApp::DoMessage() { s_hadGuiLock = TRUE; - size_t count = s_aSavedMessages.Count(); + size_t count = s_aSavedMessages.GetCount(); for ( size_t n = 0; n < count; n++ ) { MSG& msg = s_aSavedMessages[n]; - if ( !ProcessMessage((WXMSG *)&msg) ) - { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } + DoMessage((WXMSG *)&msg); } s_aSavedMessages.Empty(); @@ -1087,8 +977,8 @@ bool wxApp::ProcessIdle() void wxApp::ExitMainLoop() { - // VZ: why not ::PostQuitMessage()? - m_keepGoing = FALSE; + // this will set m_keepGoing to FALSE a bit later + ::PostQuitMessage(0); } bool wxApp::Pending() @@ -1178,15 +1068,21 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) return FALSE; } +// this is a temporary hack and will be replaced by using wxEventLoop in the +// future +// +// it is needed to allow other event loops (currently only one: the modal +// dialog one) to reset the OnIdle() semaphore because otherwise OnIdle() +// wouldn't do anything while a modal dialog shown from OnIdle() call is shown. +bool wxIsInOnIdleFlag = FALSE; + void wxApp::OnIdle(wxIdleEvent& event) { - static bool s_inOnIdle = FALSE; - // Avoid recursion (via ProcessEvent default case) - if ( s_inOnIdle ) + if ( wxIsInOnIdleFlag ) return; - s_inOnIdle = TRUE; + 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 @@ -1221,7 +1117,7 @@ void wxApp::OnIdle(wxIdleEvent& event) event.RequestMore(TRUE); } - s_inOnIdle = FALSE; + wxIsInOnIdleFlag = FALSE; } // Send idle event to all top-level windows @@ -1244,33 +1140,31 @@ bool wxApp::SendIdleEvents() // Send idle event to window and all subwindows bool wxApp::SendIdleEvents(wxWindow* win) { - bool needMore = FALSE; - wxIdleEvent event; event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event); - if (event.MoreRequested()) - needMore = TRUE; + bool needMore = event.MoreRequested(); - wxNode* node = win->GetChildren().First(); - while (node) + wxWindowList::Node *node = win->GetChildren().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; } void wxApp::DeletePendingObjects() { - wxNode *node = wxPendingDelete.First(); + wxNode *node = wxPendingDelete.GetFirst(); while (node) { - wxObject *obj = (wxObject *)node->Data(); + wxObject *obj = node->GetData(); delete obj; @@ -1279,7 +1173,7 @@ void wxApp::DeletePendingObjects() // Deleting one object may have deleted other pending // objects, so start from beginning of list again. - node = wxPendingDelete.First(); + node = wxPendingDelete.GetFirst(); } } @@ -1406,9 +1300,11 @@ bool wxApp::Yield(bool onlyIfNeeded) // MT-FIXME static bool s_inYield = FALSE; +#if wxUSE_LOG // disable log flushing from here because a call to wxYield() shouldn't // normally result in message boxes popping up &c wxLog::Suspend(); +#endif // wxUSE_LOG if ( s_inYield ) { @@ -1439,8 +1335,10 @@ bool wxApp::Yield(bool onlyIfNeeded) // if there are pending events, we must process them. ProcessPendingEvents(); +#if wxUSE_LOG // let the logs be flashed again wxLog::Resume(); +#endif // wxUSE_LOG s_inYield = FALSE; @@ -1485,31 +1383,8 @@ void wxWakeUpIdle() //----------------------------------------------------------------------------- -wxIcon -wxApp::GetStdIcon(int which) const -{ - switch(which) - { - case wxICON_INFORMATION: - return wxIcon("wxICON_INFO"); - - case wxICON_QUESTION: - return wxIcon("wxICON_QUESTION"); - - case wxICON_EXCLAMATION: - return wxIcon("wxICON_WARNING"); - - default: - wxFAIL_MSG(wxT("requested non existent standard icon")); - // still fall through - - case wxICON_HAND: - return wxIcon("wxICON_ERROR"); - } -} - // 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(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL)) +#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__WINE__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL)) #include "main.cpp" #endif