]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/msgout.cpp
position the popup on the correct screen (see #10462)
[wxWidgets.git] / src / common / msgout.cpp
index 9fabb4a987bc8e034d4a1be2ec76492138bcfa15..6e9c57a55833b60129bea45e0eba8f8daadcde51 100644 (file)
@@ -105,53 +105,48 @@ void wxMessageOutput::DoPrintfUtf8(const char *format, ...)
 // wxMessageOutputBest
 // ----------------------------------------------------------------------------
 
-#ifdef __WINDOWS__
-
-// check if we're running in a console under Windows
-static inline bool IsInConsole()
-{
-#ifdef __WXWINCE__
-    return false;
-#else // !__WXWINCE__
-    HANDLE hStdErr = ::GetStdHandle(STD_ERROR_HANDLE);
-    return hStdErr && hStdErr != INVALID_HANDLE_VALUE;
-#endif // __WXWINCE__/!__WXWINCE__
-}
-
-#endif // __WINDOWS__
-
 void wxMessageOutputBest::Output(const wxString& str)
 {
 #ifdef __WINDOWS__
-    if ( !IsInConsole() )
+    // decide whether to use console output or not
+    wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
+    const bool hasStderr = traits ? traits->CanUseStderr() : false;
+
+    if ( !(m_flags & wxMSGOUT_PREFER_MSGBOX) )
     {
-        ::MessageBox(NULL, str.wx_str(), _T("wxWidgets"),
-                     MB_ICONINFORMATION | MB_OK);
+        if ( hasStderr && traits->WriteToStderr(AppendLineFeedIfNeeded(str)) )
+            return;
     }
-    else
-#endif // __WINDOWS__/!__WINDOWS__
-    {
-        const wxWX2MBbuf buf = str.mb_str();
 
-        if ( buf )
-            fprintf(stderr, "%s", (const char*) buf);
-        else // print at least something
-            fprintf(stderr, "%s", (const char*) str.ToAscii());
-    }
+    ::MessageBox(NULL, str.t_str(), NULL, MB_ICONINFORMATION | MB_OK);
+#else // !__WINDOWS__
+    // TODO: use the native message box for the other ports too
+    wxMessageOutputStderr::Output(str);
+#endif // __WINDOWS__/!__WINDOWS__
 }
 
 // ----------------------------------------------------------------------------
 // wxMessageOutputStderr
 // ----------------------------------------------------------------------------
 
+wxString wxMessageOutputStderr::AppendLineFeedIfNeeded(const wxString& str)
+{
+    wxString strLF(str);
+    if ( strLF.empty() || *strLF.rbegin() != '\n' )
+        strLF += '\n';
+
+    return strLF;
+}
+
 void wxMessageOutputStderr::Output(const wxString& str)
 {
-    const wxWX2MBbuf buf = str.mb_str();
+    const wxString strWithLF = AppendLineFeedIfNeeded(str);
+    const wxWX2MBbuf buf = strWithLF.mb_str();
 
     if ( buf )
         fprintf(stderr, "%s", (const char*) buf);
     else // print at least something
-        fprintf(stderr, "%s", (const char*) str.ToAscii());
+        fprintf(stderr, "%s", (const char*) strWithLF.ToAscii());
 }
 
 // ----------------------------------------------------------------------------
@@ -160,17 +155,14 @@ void wxMessageOutputStderr::Output(const wxString& str)
 
 void wxMessageOutputDebug::Output(const wxString& str)
 {
-    wxString out(str);
-
 #if defined(__WXMSW__) && !defined(__WXMICROWIN__)
+    wxString out(AppendLineFeedIfNeeded(str));
     out.Replace(wxT("\t"), wxT("        "));
     out.Replace(wxT("\n"), wxT("\r\n"));
-    ::OutputDebugString(out.wx_str());
+    ::OutputDebugString(out.t_str());
 #else
-    wxFputs( out , stderr ) ;
-    if ( out.Right(1) != wxT("\n") )
-        wxFputs( wxT("\n") , stderr ) ;
-    fflush( stderr ) ;
+    // TODO: use native debug output function for the other ports too
+    wxMessageOutputStderr::Output(str);
 #endif // platform
 }
 
@@ -204,9 +196,8 @@ void wxMessageOutputMessageBox::Output(const wxString& str)
     out.Replace(wxT("\t"), wxT("        "));
 #endif
 
-    wxString title;
-    if ( wxTheApp )
-        title.Printf(_("%s message"), wxTheApp->GetAppDisplayName().c_str());
+    wxString title = wxT("wxWidgets") ;
+    if (wxTheApp) title = wxTheApp->GetAppDisplayName();
 
     ::wxMessageBox(out, title);
 }