Fix forward navigation control on Linux.
[dorian] / trace.cpp
index f3a2bef..ee9ee59 100644 (file)
--- a/trace.cpp
+++ b/trace.cpp
@@ -1,11 +1,11 @@
-#include <stdio.h>
-#include <stdlib.h>
 #include <QEvent>
+#include <QFile>
 
 #include "trace.h"
 
 int Trace::indent;
 QtMsgType Trace::level = QtDebugMsg;
+QFile Trace::file;
 
 Trace::EventName Trace::eventTab[] = {
     {QEvent::None, "QEvent::None"},
@@ -204,7 +204,6 @@ Trace::EventName Trace::eventTab[] = {
     {QEvent::UngrabMouse, "QEvent::UngrabMouse"},
     {QEvent::GrabKeyboard, "QEvent::GrabKeyboard"},
     {QEvent::UngrabKeyboard, "QEvent::UngrabKeyboard"},
-    {QEvent::CocoaRequestModal, "QEvent::CocoaRequestModal"},
     {QEvent::MacGLClearDrawable, "QEvent::MacGLClearDrawable"},
 
     {QEvent::StateMachineSignal, "QEvent::StateMachineSignal"},
@@ -256,28 +255,41 @@ QString Trace::event(QEvent::Type t)
     }
 }
 
-const char *Trace::prefix()
+QString Trace::prefix()
 {
-    return (QTime::currentTime().toString("hh:mm:ss.zzz ") +
-        QString(" ").repeated(indent)).toAscii().constData();
+    return QTime::currentTime().toString("hh:mm:ss.zzz ") +
+            QString(" ").repeated(indent);
 }
 
 void Trace::messageHandler(QtMsgType type, const char *msg)
 {
     if (type >= Trace::level) {
+        QtMsgHandler oldHandler = qInstallMsgHandler(0);
         switch (type) {
         case QtDebugMsg:
-            fprintf(stderr, "%s%s\n", prefix(), msg);
+            qt_message_output(QtDebugMsg, (prefix()+msg).toUtf8().constData());
             break;
-        case QtWarningMsg:
-            fprintf(stderr, "Warning: %s\n", msg);
-            break;
-        case QtCriticalMsg:
-            fprintf(stderr, "Critical: %s\n", msg);
-            break;
-        case QtFatalMsg:
-            fprintf(stderr, "Fatal: %s\n", msg);
-            abort();
+        default:
+            qt_message_output(type, msg);
+        }
+        qInstallMsgHandler(oldHandler);
+        if (Trace::file.isOpen()) {
+            Trace::file.write((prefix() + msg + "\n").toUtf8());
+            Trace::file.flush();
         }
     }
 }
+
+void Trace::setFileName(const QString &fileName)
+{
+    Trace::file.close();
+    Trace::file.setFileName(fileName);
+    if (!fileName.isEmpty()) {
+        (void)Trace::file.open(QIODevice::WriteOnly);
+    }
+}
+
+QString Trace::fileName()
+{
+    return Trace::file.fileName();
+}