From 4212898822f1798dac0167e4f6a147bd8a3b3dcc Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 16 Feb 2012 12:24:32 +0100 Subject: Base active window handling on WM_SET/KILLFOCUS. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make it work for child windows, fixing the isActive() test of QWindow. Task-number: QTBUG-24185 Change-Id: I75597c2d322969f7e109d76e30b9b1f4b66c6e1e Reviewed-by: Samuel Rødal --- src/plugins/platforms/windows/qtwindowsglobal.h | 6 ++++++ src/plugins/platforms/windows/qwindowscontext.cpp | 9 ++++----- src/plugins/platforms/windows/qwindowswindow.cpp | 6 +++++- 3 files changed, 15 insertions(+), 6 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h index f044362299..3445a3c7a8 100644 --- a/src/plugins/platforms/windows/qtwindowsglobal.h +++ b/src/plugins/platforms/windows/qtwindowsglobal.h @@ -77,6 +77,8 @@ enum WindowsEventType // Simplify event types ResizeEvent = WindowEventFlag + 12, QuerySizeHints = WindowEventFlag + 15, CalculateSize = WindowEventFlag + 16, + FocusInEvent = WindowEventFlag + 17, + FocusOutEvent = WindowEventFlag + 18, MouseEvent = MouseEventFlag + 1, MouseWheelEvent = MouseEventFlag + 2, TouchEvent = TouchEventFlag + 1, @@ -170,6 +172,10 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI } case WM_GETOBJECT: return QtWindows::AccessibleObjectFromWindowRequest; + case WM_SETFOCUS: + return QtWindows::FocusInEvent; + case WM_KILLFOCUS: + return QtWindows::FocusOutEvent; case WM_DISPLAYCHANGE: return QtWindows::DisplayChangedEvent; default: diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 5f7dfb1b10..a257736d98 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -676,10 +676,6 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, } // Events without an associated QWindow or events we are not interested in. switch (et) { - case QtWindows::DeactivateApplicationEvent: - case QtWindows::DeactivateWindowEvent: - QWindowSystemInterface::handleWindowActivated(0); - return true; case QtWindows::InputMethodStartCompositionEvent: return QWindowsInputContext::instance()->startComposition(hwnd); case QtWindows::InputMethodCompositionEvent: @@ -773,9 +769,12 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, return d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result); case QtWindows::TouchEvent: return d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result); - case QtWindows::ActivateWindowEvent: + case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow(). QWindowSystemInterface::handleWindowActivated(platformWindow->window()); return true; + case QtWindows::FocusOutEvent: + QWindowSystemInterface::handleWindowActivated(0); + return true; case QtWindows::ShowEvent: platformWindow->handleShown(); return true; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 5d8de2e01d..28ef2c3b6c 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1220,8 +1220,12 @@ void QWindowsWindow::requestActivateWindow() { if (QWindowsContext::verboseWindows) qDebug() << __FUNCTION__ << this << window(); - if (m_data.hwnd) + // 'Active' state handling is based in focus since it needs to work for + // child windows as well. + if (m_data.hwnd) { SetForegroundWindow(m_data.hwnd); + SetFocus(m_data.hwnd); + } } bool QWindowsWindow::setKeyboardGrabEnabled(bool grab) -- cgit v1.2.3