Base active window handling on WM_SET/KILLFOCUS.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Thu, 16 Feb 2012 11:24:32 +0000 (12:24 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 17 Feb 2012 04:26:08 +0000 (05:26 +0100)
Make it work for child windows, fixing the isActive()
test of QWindow.

Task-number: QTBUG-24185
Change-Id: I75597c2d322969f7e109d76e30b9b1f4b66c6e1e
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/plugins/platforms/windows/qtwindowsglobal.h
src/plugins/platforms/windows/qwindowscontext.cpp
src/plugins/platforms/windows/qwindowswindow.cpp

index f044362..3445a3c 100644 (file)
@@ -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:
index 5f7dfb1..a257736 100644 (file)
@@ -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;
index 5d8de2e..28ef2c3 100644 (file)
@@ -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)