Fix forward navigation control on Linux.
[dorian] / trace.cpp
index 0ba8199..ee9ee59 100644 (file)
--- a/trace.cpp
+++ b/trace.cpp
@@ -1,8 +1,11 @@
 #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"},
@@ -201,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"},
@@ -224,3 +226,70 @@ Trace::EventName Trace::eventTab[] = {
 
     {0, 0}
 };
+
+Trace::Trace(const QString &s): name(s)
+{
+    messageHandler(QtDebugMsg, QString(">%1").arg(name).toAscii().constData());
+    indent++;
+}
+
+Trace::~Trace()
+{
+    if (--indent < 0) {
+        indent = 0;
+    }
+    messageHandler(QtDebugMsg, QString("<%1").arg(name).toAscii().constData());
+}
+
+QString Trace::event(QEvent::Type t)
+{
+    for (int i = 0; eventTab[i].name; i++) {
+        if (eventTab[i].type == t) {
+            return eventTab[i].name;
+        }
+    }
+    if (t >= QEvent::User) {
+        return QString("QEvent::User+%1").arg(t - QEvent::User);
+    } else {
+        return QString("Unknown event %1").arg(t);
+    }
+}
+
+QString Trace::prefix()
+{
+    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:
+            qt_message_output(QtDebugMsg, (prefix()+msg).toUtf8().constData());
+            break;
+        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();
+}