From f96cd3187df78e121546df2a87432013d0b1a870 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Date: Fri, 21 Nov 2014 16:52:06 +0100
Subject: [PATCH] Improve diaglib.

- Fix prototype for glinfo() for Qt 4
- Add more event types and object type flags to event filter.

Change-Id: Ia4160b40486d054e860a339e7b5c9c28695330ae
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
---
 tests/manual/diaglib/eventfilter.cpp | 37 +++++++++++++++++++++++++++-
 tests/manual/diaglib/eventfilter.h   | 24 +++++++++++++++---
 tests/manual/diaglib/glinfo.cpp      |  2 +-
 3 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/tests/manual/diaglib/eventfilter.cpp b/tests/manual/diaglib/eventfilter.cpp
index f0573975f67..4968780e826 100644
--- a/tests/manual/diaglib/eventfilter.cpp
+++ b/tests/manual/diaglib/eventfilter.cpp
@@ -52,6 +52,8 @@ EventFilter::EventFilter(QObject *p)
 
 void EventFilter::init(EventCategories eventCategories)
 {
+    m_objectTypes = OtherType | QWidgetType | QWindowType;
+
     if (eventCategories & MouseEvents) {
         m_eventTypes << QEvent::MouseButtonPress << QEvent::MouseButtonRelease
             << QEvent::MouseButtonDblClick << QEvent::NonClientAreaMouseButtonPress
@@ -79,6 +81,13 @@ void EventFilter::init(EventCategories eventCategories)
         m_eventTypes << QEvent::KeyPress << QEvent::KeyRelease << QEvent::ShortcutOverride
             << QEvent::Shortcut;
     }
+    if (eventCategories & FocusEvents) {
+        m_eventTypes
+#if QT_VERSION >= 0x050000
+            << QEvent::FocusAboutToChange
+#endif
+            << QEvent::FocusIn << QEvent::FocusOut;
+    }
     if (eventCategories & GeometryEvents)
         m_eventTypes << QEvent::Move << QEvent::Resize;
     if (eventCategories & PaintEvents) {
@@ -88,18 +97,44 @@ void EventFilter::init(EventCategories eventCategories)
         m_eventTypes << QEvent::Expose;
 #endif
     }
+    if (eventCategories & StateChangeEvents) {
+        m_eventTypes
+            << QEvent::WindowStateChange
+            << QEvent::WindowBlocked << QEvent::WindowUnblocked
+#if QT_VERSION >= 0x050000
+            << QEvent::ApplicationStateChange
+#endif
+            << QEvent::ApplicationActivate << QEvent::ApplicationDeactivate;
+    }
     if (eventCategories & TimerEvents)
         m_eventTypes << QEvent::Timer << QEvent::ZeroTimerEvent;
     if (eventCategories & ObjectEvents) {
         m_eventTypes << QEvent::ChildAdded << QEvent::ChildPolished
             << QEvent::ChildRemoved << QEvent::Create << QEvent::Destroy;
     }
+    if (eventCategories & InputMethodEvents) {
+        m_eventTypes << QEvent::InputMethod;
+#if QT_VERSION >= 0x050000
+        m_eventTypes << QEvent::InputMethodQuery;
+#endif
+    }
+}
+
+static inline bool matchesType(const QObject *o, EventFilter::ObjectTypes types)
+{
+    if (o->isWidgetType())
+        return types & EventFilter::QWidgetType;
+#if QT_VERSION >= 0x050000
+    if (o->isWindowType())
+        return types & EventFilter::QWindowType;
+#endif
+    return types & EventFilter::OtherType;
 }
 
 bool EventFilter::eventFilter(QObject *o, QEvent *e)
 {
     static int n = 0;
-    if (m_eventTypes.contains(e->type())) {
+    if (matchesType(o, m_objectTypes) && m_eventTypes.contains(e->type())) {
         QDebug debug = qDebug().nospace();
         const QString on = o->objectName();
         debug << '#' << n++ << ' ' << o->metaObject()->className();
diff --git a/tests/manual/diaglib/eventfilter.h b/tests/manual/diaglib/eventfilter.h
index d87ac68b076..8d94c1308a0 100644
--- a/tests/manual/diaglib/eventfilter.h
+++ b/tests/manual/diaglib/eventfilter.h
@@ -52,25 +52,41 @@ public:
         TabletEvents       = 0x00008,
         DragAndDropEvents  = 0x00010,
         KeyEvents          = 0x00020,
-        GeometryEvents     = 0x00040,
-        PaintEvents        = 0x00080,
-        TimerEvents        = 0x00100,
-        ObjectEvents       = 0x00200
+        FocusEvents        = 0x00040,
+        GeometryEvents     = 0x00080,
+        PaintEvents        = 0x00100,
+        StateChangeEvents  = 0x00200,
+        InputMethodEvents  = 0x00400,
+        TimerEvents        = 0x00800,
+        ObjectEvents       = 0x01000,
+        AllEvents          = 0xFFFFF
     };
     Q_DECLARE_FLAGS(EventCategories, EventCategory)
 
+    enum ObjectType {
+        QWindowType = 0x1,
+        QWidgetType = 0x2,
+        OtherType   = 0x4
+    };
+    Q_DECLARE_FLAGS(ObjectTypes, ObjectType)
+
     explicit EventFilter(EventCategories eventCategories, QObject *p = 0);
     explicit EventFilter(QObject *p = 0);
 
     bool eventFilter(QObject *, QEvent *);
 
+    ObjectTypes objectTypes() const { return m_objectTypes; }
+    void setObjectTypes(ObjectTypes objectTypes) { m_objectTypes = objectTypes; }
+
 private:
     void init(EventCategories eventCategories);
 
     QList<QEvent::Type> m_eventTypes;
+    ObjectTypes m_objectTypes;
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(EventFilter::EventCategories)
+Q_DECLARE_OPERATORS_FOR_FLAGS(EventFilter::ObjectTypes)
 
 } // namespace QtDiag
 
diff --git a/tests/manual/diaglib/glinfo.cpp b/tests/manual/diaglib/glinfo.cpp
index cd30e46b451..a7eff208dec 100644
--- a/tests/manual/diaglib/glinfo.cpp
+++ b/tests/manual/diaglib/glinfo.cpp
@@ -102,7 +102,7 @@ static QString getGlString(GLenum name)
     return QString();
 }
 
-QString glInfo(const QWidget *)
+QString glInfo(const QObject *)
 {
     return getGlString(GL_VENDOR) + QLatin1Char('\n') + getGlString(GL_RENDERER);
 }
-- 
GitLab