]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
Made VC++ makefiles and project files a bit more consistent
[wxWidgets.git] / src / msw / app.cpp
index 2bb095e842902521a6bf400f2e5d7240fbe9abac..42f473f2f58122cd21c0d6939b6869f0af212281 100644 (file)
     #include "wx/resource.h"
 #endif
 
     #include "wx/resource.h"
 #endif
 
-// OLE is used for drag-and-drop, clipboard, OLE Automation...
-#ifndef wxUSE_NORLANDER_HEADERS
-#if defined(__GNUWIN32__) || defined(__SC__) || defined(__SALFORDC__)
+#if wxUSE_TOOLTIPS
+    #include "wx/tooltip.h"
+#endif // wxUSE_TOOLTIPS
+
+// OLE is used for drag-and-drop, clipboard, OLE Automation..., but some
+// compilers don't support it (missing headers, libs, ...)
+#if defined(__GNUWIN32_OLD__) || defined(__SC__) || defined(__SALFORDC__)
     #undef wxUSE_OLE
 
     #define  wxUSE_OLE 0
 #endif // broken compilers
     #undef wxUSE_OLE
 
     #define  wxUSE_OLE 0
 #endif // broken compilers
-#endif
 
 #if wxUSE_OLE
     #include <ole2.h>
 
 #if wxUSE_OLE
     #include <ole2.h>
@@ -83,9 +86,8 @@
 #include <string.h>
 #include <ctype.h>
 
 #include <string.h>
 #include <ctype.h>
 
-#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
+#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) || defined(__TWIN32__))
     #include <commctrl.h>
     #include <commctrl.h>
-    #include <shlwapi.h>
 #endif
 
 #include "wx/msw/msvcrt.h"
 #endif
 
 #include "wx/msw/msvcrt.h"
     #define _WIN32_IE 0x0200
 #endif
 
     #define _WIN32_IE 0x0200
 #endif
 
+#if _WIN32_IE >= 0x0300
+    #include <shlwapi.h>
+#endif
+
 // ---------------------------------------------------------------------------
 // global variables
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // global variables
 // ---------------------------------------------------------------------------
@@ -120,23 +126,20 @@ extern wxChar *wxOsVersion;
 extern wxList *wxWinHandleList;
 extern wxList WXDLLEXPORT wxPendingDelete;
 extern void wxSetKeyboardHook(bool doIt);
 extern wxList *wxWinHandleList;
 extern wxList WXDLLEXPORT wxPendingDelete;
 extern void wxSetKeyboardHook(bool doIt);
-extern wxCursor *g_globalCursor;
 
 MSG s_currentMsg;
 wxApp *wxTheApp = NULL;
 
 
 MSG s_currentMsg;
 wxApp *wxTheApp = NULL;
 
-// FIXME why not const? and not static?
-
 // NB: all "NoRedraw" classes must have the same names as the "normal" classes
 //     with NR suffix - wxWindow::MSWCreate() supposes this
 // NB: all "NoRedraw" classes must have the same names as the "normal" classes
 //     with NR suffix - wxWindow::MSWCreate() supposes this
-wxChar wxFrameClassName[]         = wxT("wxFrameClass");
-wxChar wxFrameClassNameNoRedraw[] = wxT("wxFrameClassNR");
-wxChar wxMDIFrameClassName[]      = wxT("wxMDIFrameClass");
-wxChar wxMDIFrameClassNameNoRedraw[] = wxT("wxMDIFrameClassNR");
-wxChar wxMDIChildFrameClassName[] = wxT("wxMDIChildFrameClass");
-wxChar wxMDIChildFrameClassNameNoRedraw[] = wxT("wxMDIChildFrameClassNR");
-wxChar wxPanelClassName[]         = wxT("wxPanelClass");
-wxChar wxCanvasClassName[]        = wxT("wxCanvasClass");
+const wxChar *wxFrameClassName         = wxT("wxFrameClass");
+const wxChar *wxFrameClassNameNoRedraw = wxT("wxFrameClassNR");
+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 *wxCanvasClassName        = wxT("wxCanvasClass");
 
 HICON wxSTD_FRAME_ICON = (HICON) NULL;
 HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL;
 
 HICON wxSTD_FRAME_ICON = (HICON) NULL;
 HICON wxSTD_MDICHILDFRAME_ICON = (HICON) NULL;
@@ -150,12 +153,6 @@ HBRUSH wxDisableButtonBrush = (HBRUSH) 0;
 
 LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
 
 
 LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
 
-#if wxUSE_RICHEDIT
-    // the handle to richedit DLL and the version of the DLL loaded
-    static HINSTANCE gs_hRichEdit = (HINSTANCE)NULL;
-    static int gs_verRichEdit = -1;
-#endif
-
 // ===========================================================================
 // implementation
 // ===========================================================================
 // ===========================================================================
 // implementation
 // ===========================================================================
@@ -164,7 +161,6 @@ LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
 // wxApp
 // ---------------------------------------------------------------------------
 
 // wxApp
 // ---------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
     BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
     IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
     BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
@@ -172,7 +168,6 @@ LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
         EVT_END_SESSION(wxApp::OnEndSession)
         EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
     END_EVENT_TABLE()
         EVT_END_SESSION(wxApp::OnEndSession)
         EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
     END_EVENT_TABLE()
-#endif
 
 //// Initialize
 bool wxApp::Initialize()
 
 //// Initialize
 bool wxApp::Initialize()
@@ -232,8 +227,6 @@ bool wxApp::Initialize()
     Ctl3dAutoSubclass(wxhInstance);
 #endif
 
     Ctl3dAutoSubclass(wxhInstance);
 #endif
 
-    g_globalCursor = new wxCursor;
-
     // VZ: these icons are not in wx.rc anyhow (but should they?)!
 #if 0
     wxSTD_FRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_FRAME"));
     // VZ: these icons are not in wx.rc anyhow (but should they?)!
 #if 0
     wxSTD_FRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_FRAME"));
@@ -501,13 +494,6 @@ void wxApp::CleanUp()
     //  wxDefaultResourceTable->ClearTable();
 #endif
 
     //  wxDefaultResourceTable->ClearTable();
 #endif
 
-    // Indicate that the cursor can be freed, so that cursor won't be deleted
-    // by deleting the bitmap list before g_globalCursor goes out of scope
-    // (double deletion of the cursor).
-    wxSetCursor(wxNullCursor);
-    delete g_globalCursor;
-    g_globalCursor = NULL;
-
     wxDeleteStockObjects();
 
     // Destroy all GDI lists, etc.
     wxDeleteStockObjects();
 
     // Destroy all GDI lists, etc.
@@ -525,11 +511,6 @@ void wxApp::CleanUp()
 
     wxSetKeyboardHook(FALSE);
 
 
     wxSetKeyboardHook(FALSE);
 
-#if wxUSE_RICHEDIT
-    if (gs_hRichEdit != (HINSTANCE) NULL)
-        FreeLibrary(gs_hRichEdit);
-#endif
-
 #if wxUSE_PENWINDOWS
     wxCleanUpPenWin();
 #endif
 #if wxUSE_PENWINDOWS
     wxCleanUpPenWin();
 #endif
@@ -583,7 +564,7 @@ void wxApp::CleanUp()
     // wxDebugContext, too.
     if (wxDebugContext::CountObjectsLeft(TRUE) > 0)
     {
     // wxDebugContext, too.
     if (wxDebugContext::CountObjectsLeft(TRUE) > 0)
     {
-        wxLogDebug(wxT("There were memory leaks."));
+        wxLogMessage(wxT("There were memory leaks."));
         wxDebugContext::Dump();
         wxDebugContext::PrintStatistics();
     }
         wxDebugContext::Dump();
         wxDebugContext::PrintStatistics();
     }
@@ -924,12 +905,10 @@ int wxApp::MainLoop()
         wxMutexGuiLeaveOrEnter();
 #endif // wxUSE_THREADS
 
         wxMutexGuiLeaveOrEnter();
 #endif // wxUSE_THREADS
 
-        while ( !::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) &&
-                ProcessIdle() )
-        {
-        }
-
+        while ( !Pending() && ProcessIdle() )
+            ;
 
 
+        // a message came or no more idle processing to do
         DoMessage();
     }
 
         DoMessage();
     }
 
@@ -948,12 +927,13 @@ bool wxApp::ProcessIdle()
 
 void wxApp::ExitMainLoop()
 {
 
 void wxApp::ExitMainLoop()
 {
+    // VZ: why not ::PostQuitMessage()?
     m_keepGoing = FALSE;
 }
 
 bool wxApp::Pending()
 {
     m_keepGoing = FALSE;
 }
 
 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()
 }
 
 void wxApp::Dispatch()
@@ -971,19 +951,24 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg)
 {
     MSG *msg = (MSG *)wxmsg;
     HWND hWnd = msg->hwnd;
 {
     MSG *msg = (MSG *)wxmsg;
     HWND hWnd = msg->hwnd;
-    wxWindow *wndThis = wxFindWinFromHandle((WXHWND)hWnd), *wnd;
+    wxWindow *wndThis = wxGetWindowFromHWND((WXHWND)hWnd);
 
 
-    // for some composite controls (like a combobox), wndThis might be NULL
-    // because the subcontrol is not a wxWindow, but only the control itself
-    // is - try to catch this case
-    while ( hWnd && !wndThis )
+#if wxUSE_TOOLTIPS
+    // we must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to
+    // popup the tooltip bubbles
+    if ( wndThis && (msg->message == WM_MOUSEMOVE) )
     {
     {
-        hWnd = ::GetParent(hWnd);
-        wndThis = wxFindWinFromHandle((WXHWND)hWnd);
+        wxToolTip *tt = wndThis->GetToolTip();
+        if ( tt )
+        {
+            tt->RelayEvent(wxmsg);
+        }
     }
     }
+#endif // wxUSE_TOOLTIPS
 
     // Try translations first; find the youngest window with
     // a translation table.
 
     // Try translations first; find the youngest window with
     // a translation table.
+    wxWindow *wnd;
     for ( wnd = wndThis; wnd; wnd = wnd->GetParent() )
     {
         if ( wnd->MSWTranslateMessage(wxmsg) )
     for ( wnd = wndThis; wnd; wnd = wnd->GetParent() )
     {
         if ( wnd->MSWTranslateMessage(wxmsg) )
@@ -1010,14 +995,21 @@ void wxApp::OnIdle(wxIdleEvent& event)
 
     s_inOnIdle = TRUE;
 
 
     s_inOnIdle = 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
     // '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();
+    wxLog::FlushActive();
 #endif // wxUSE_LOG
 
     // Send OnIdle events to all windows
 #endif // wxUSE_LOG
 
     // Send OnIdle events to all windows
@@ -1028,11 +1020,6 @@ void wxApp::OnIdle(wxIdleEvent& event)
         event.RequestMore(TRUE);
     }
 
         event.RequestMore(TRUE);
     }
 
-    // If they are pending events, we must process them: pending events are
-    // either events to the threads other than main or events posted with
-    // wxPostEvent() functions
-    ProcessPendingEvents();
-
     s_inOnIdle = FALSE;
 }
 
     s_inOnIdle = FALSE;
 }
 
@@ -1112,52 +1099,6 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event)
     }
 }
 
     }
 }
 
-#if wxUSE_RICHEDIT
-
-/* static */
-bool wxApp::InitRichEdit(int version)
-{
-    wxCHECK_MSG( version >= 1 && version <= 3, FALSE,
-                 _T("incorrect richedit control version requested") );
-
-    if ( version <= gs_verRichEdit )
-    {
-        // we've already got this or better
-        return TRUE;
-    }
-
-    if ( gs_hRichEdit )
-    {
-        ::FreeLibrary(gs_hRichEdit);
-    }
-
-    // always try load riched20.dll first - like this we won't have to reload
-    // it later if we're first asked for RE 1 and then for RE 2 or 3
-    wxString dllname = _T("riched20.dll");
-    gs_hRichEdit = ::LoadLibrary(dllname);
-    if ( !gs_hRichEdit && (version == 1) )
-    {
-        // fall back to RE 1
-        dllname = _T("riched32.dll");
-        gs_hRichEdit = ::LoadLibrary(dllname);
-    }
-
-    if ( !gs_hRichEdit )
-    {
-        wxLogSysError(_("Could not load Rich Edit DLL '%s'"), dllname.c_str());
-
-        gs_verRichEdit = -1;
-
-        return FALSE;
-    }
-
-    gs_verRichEdit = version;
-
-    return TRUE;
-}
-
-#endif // wxUSE_RICHEDIT
-
 /* static */
 int wxApp::GetComCtl32Version()
 {
 /* static */
 int wxApp::GetComCtl32Version()
 {
@@ -1210,7 +1151,11 @@ int wxApp::GetComCtl32Version()
                     FARPROC theProc = ::GetProcAddress
                                         (
                                          hModuleComCtl32,
                     FARPROC theProc = ::GetProcAddress
                                         (
                                          hModuleComCtl32,
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x520)
+                                         "InitCommonControlsEx"
+#else
                                          _T("InitCommonControlsEx")
                                          _T("InitCommonControlsEx")
+#endif
                                         );
 
                     if ( !theProc )
                                         );
 
                     if ( !theProc )
@@ -1225,7 +1170,11 @@ int wxApp::GetComCtl32Version()
                         theProc = ::GetProcAddress
                                     (
                                      hModuleComCtl32,
                         theProc = ::GetProcAddress
                                     (
                                      hModuleComCtl32,
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x520)
+                                     "InitializeFlatSB"
+#else
                                      _T("InitializeFlatSB")
                                      _T("InitializeFlatSB")
+#endif
                                     );
                         if ( !theProc )
                         {
                                     );
                         if ( !theProc )
                         {
@@ -1255,13 +1204,20 @@ void wxExit()
 // Yield to incoming messages
 bool wxYield()
 {
 // Yield to incoming messages
 bool wxYield()
 {
+    // disable log flushing from here because a call to wxYield() shouldn't
+    // normally result in message boxes popping up &c
+    wxLog::Suspend();
+
     // we don't want to process WM_QUIT from here - it should be processed in
     // the main event loop in order to stop it
     // we don't want to process WM_QUIT from here - it should be processed in
     // the main event loop in order to stop it
-
     MSG msg;
     while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
             msg.message != WM_QUIT )
     {
     MSG msg;
     while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
             msg.message != WM_QUIT )
     {
+#if wxUSE_THREADS
+        wxMutexGuiLeaveOrEnter();
+#endif // wxUSE_THREADS
+
         if ( !wxTheApp->DoMessage() )
             break;
     }
         if ( !wxTheApp->DoMessage() )
             break;
     }
@@ -1269,6 +1225,9 @@ bool wxYield()
     // If they are pending events, we must process them.
     wxTheApp->ProcessPendingEvents();
 
     // If they are pending events, we must process them.
     wxTheApp->ProcessPendingEvents();
 
+    // let the logs be flashed again
+    wxLog::Resume();
+
     return TRUE;
 }
 
     return TRUE;
 }
 
@@ -1320,6 +1279,6 @@ wxApp::GetStdIcon(int which) const
 
 // 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.
 
 // 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__))
+#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL))
 #include "main.cpp"
 #endif
 #include "main.cpp"
 #endif