]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
Eats EVT_CHAR events for WXK_ESCAPE, WXK_TAB, and WXK_RETURN since
[wxWidgets.git] / src / msw / app.cpp
index 2bb095e842902521a6bf400f2e5d7240fbe9abac..cb05b27011235e7e5fd6beb5f5f7921b8d58d48c 100644 (file)
     #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
-#endif
 
 #if wxUSE_OLE
     #include <ole2.h>
@@ -83,9 +86,8 @@
 #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 <shlwapi.h>
 #endif
 
 #include "wx/msw/msvcrt.h"
     #define _WIN32_IE 0x0200
 #endif
 
+#if _WIN32_IE >= 0x0300
+    #include <shlwapi.h>
+#endif
+
 // ---------------------------------------------------------------------------
 // global variables
 // ---------------------------------------------------------------------------
@@ -125,18 +131,16 @@ extern wxCursor *g_globalCursor;
 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
-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;
@@ -150,12 +154,6 @@ HBRUSH wxDisableButtonBrush = (HBRUSH) 0;
 
 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
 // ===========================================================================
@@ -164,7 +162,6 @@ LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
 // wxApp
 // ---------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
     BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
@@ -172,7 +169,6 @@ LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
         EVT_END_SESSION(wxApp::OnEndSession)
         EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
     END_EVENT_TABLE()
-#endif
 
 //// Initialize
 bool wxApp::Initialize()
@@ -525,11 +521,6 @@ void wxApp::CleanUp()
 
     wxSetKeyboardHook(FALSE);
 
-#if wxUSE_RICHEDIT
-    if (gs_hRichEdit != (HINSTANCE) NULL)
-        FreeLibrary(gs_hRichEdit);
-#endif
-
 #if wxUSE_PENWINDOWS
     wxCleanUpPenWin();
 #endif
@@ -924,12 +915,10 @@ int wxApp::MainLoop()
         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();
     }
 
@@ -948,12 +937,13 @@ bool wxApp::ProcessIdle()
 
 void wxApp::ExitMainLoop()
 {
+    // VZ: why not ::PostQuitMessage()?
     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()
@@ -971,19 +961,24 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg)
 {
     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.
+    wxWindow *wnd;
     for ( wnd = wndThis; wnd; wnd = wnd->GetParent() )
     {
         if ( wnd->MSWTranslateMessage(wxmsg) )
@@ -1112,52 +1107,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()
 {
@@ -1210,7 +1159,11 @@ int wxApp::GetComCtl32Version()
                     FARPROC theProc = ::GetProcAddress
                                         (
                                          hModuleComCtl32,
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x520)
+                                         "InitCommonControlsEx"
+#else
                                          _T("InitCommonControlsEx")
+#endif
                                         );
 
                     if ( !theProc )
@@ -1225,7 +1178,11 @@ int wxApp::GetComCtl32Version()
                         theProc = ::GetProcAddress
                                     (
                                      hModuleComCtl32,
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x520)
+                                     "InitializeFlatSB"
+#else
                                      _T("InitializeFlatSB")
+#endif
                                     );
                         if ( !theProc )
                         {
@@ -1262,6 +1219,10 @@ bool wxYield()
     while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
             msg.message != WM_QUIT )
     {
+#if wxUSE_THREADS
+        wxMutexGuiLeaveOrEnter();
+#endif // wxUSE_THREADS
+
         if ( !wxTheApp->DoMessage() )
             break;
     }
@@ -1320,6 +1281,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.
-#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__))
+#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL))
 #include "main.cpp"
 #endif