summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-05-11 11:34:28 +0200
committerQt by Nokia <qt-info@nokia.com>2012-05-11 15:11:20 +0200
commite3bbfe00d1f71ba21889eec438e9438c0ee35c0a (patch)
tree8ad9ef83a5d8404144256e6851ef064e2dd4282e /src/plugins/platforms/windows
parent0909c01b2f5d3a466fe6094a501a2893170e2616 (diff)
Windows: Compress Window Activation events.
If the next active window is already known at the time a focus out is received, pass it to QWindowSystemInterface. Fixes a test and Qt Creator's locator bar. Task-number: QTBUG-24186 Task-number: QTCREATORBUG-1 Change-Id: I0aed4c386c08ed182555c95640e1637c5b67f5ce Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp33
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.h1
2 files changed, 30 insertions, 4 deletions
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index f44ce38c73..0a1ca138ad 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -259,6 +259,7 @@ struct QWindowsContextPrivate {
const HRESULT m_oleInitializeResult;
const QByteArray m_eventType;
EventFilter m_eventFilters[EventFilterTypeCount];
+ QWindow *m_lastActiveWindow;
};
QWindowsContextPrivate::QWindowsContextPrivate() :
@@ -266,7 +267,8 @@ QWindowsContextPrivate::QWindowsContextPrivate() :
m_displayContext(GetDC(0)),
m_defaultDPI(GetDeviceCaps(m_displayContext,LOGPIXELSY)),
m_oleInitializeResult(OleInitialize(NULL)),
- m_eventType(QByteArrayLiteral("windows_generic_MSG"))
+ m_eventType(QByteArrayLiteral("windows_generic_MSG")),
+ m_lastActiveWindow(0)
{
#ifndef Q_OS_WINCE
QWindowsContext::user32dll.init();
@@ -819,10 +821,8 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::TouchEvent:
return d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result);
case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow().
- QWindowSystemInterface::handleWindowActivated(platformWindow->window());
- return true;
case QtWindows::FocusOutEvent:
- QWindowSystemInterface::handleWindowActivated(0);
+ handleFocusEvent(et, platformWindow);
return true;
case QtWindows::ShowEvent:
platformWindow->handleShown();
@@ -850,6 +850,31 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
return false;
}
+/* Compress activation events. If the next focus window is already known
+ * at the time the current one receives focus-out, pass that to
+ * QWindowSystemInterface instead of sending 0 and ignore its consecutive
+ * focus-in event.
+ * This helps applications that do handling in focus-out events. */
+void QWindowsContext::handleFocusEvent(QtWindows::WindowsEventType et,
+ QWindowsWindow *platformWindow)
+{
+ QWindow *nextActiveWindow = 0;
+ if (et == QtWindows::FocusInEvent) {
+ nextActiveWindow = platformWindow->window();
+ } else {
+ // Focus out: Is the next window known and different
+ // from the receiving the focus out.
+ if (const HWND nextActiveHwnd = GetActiveWindow())
+ if (QWindowsWindow *nextActivePlatformWindow = findPlatformWindow(nextActiveHwnd))
+ if (nextActivePlatformWindow != platformWindow)
+ nextActiveWindow = nextActivePlatformWindow->window();
+ }
+ if (nextActiveWindow != d->m_lastActiveWindow) {
+ d->m_lastActiveWindow = nextActiveWindow;
+ QWindowSystemInterface::handleWindowActivated(nextActiveWindow);
+ }
+}
+
/*!
\brief Windows functions for actual windows.
diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h
index 983f9409c9..123eb6602d 100644
--- a/src/plugins/platforms/windows/qwindowscontext.h
+++ b/src/plugins/platforms/windows/qwindowscontext.h
@@ -179,6 +179,7 @@ public:
static QByteArray comErrorString(HRESULT hr);
private:
+ void handleFocusEvent(QtWindows::WindowsEventType et, QWindowsWindow *w);
void unregisterWindowClasses();
QScopedPointer<QWindowsContextPrivate> d;