[Win32k]
authorJames Tabor <james.tabor@reactos.org>
Thu, 7 Jun 2012 01:08:41 +0000 (01:08 +0000)
committerJames Tabor <james.tabor@reactos.org>
Thu, 7 Jun 2012 01:08:41 +0000 (01:08 +0000)
- Fast fix attach thread input. Tested with win Msg test_SetFocus, fixed the WM_ACTIVATE issue, still needs more testing. See bug 7098, used the test case and it works.

svn path=/trunk/; revision=56703

reactos/win32ss/user/ntuser/focus.c
reactos/win32ss/user/ntuser/input.c

index 284cb8f..6c3f0a8 100644 (file)
@@ -595,8 +595,14 @@ co_UserSetFocus(PWND Window)
          }
       }
 
-      /* check if the specified window can be set in the input data of a given queue */
-      if ( !Window || ThreadQueue == Window->head.pti->MessageQueue)
+      // Check again! SetActiveWindow could have set the focus via WM_ACTIVATE.
+      if (ThreadQueue->spwndFocus && ThreadQueue->spwndFocus == Window)
+      {
+         hWndPrev = UserHMGetHandle(ThreadQueue->spwndFocus);
+      }
+
+       /* check if the specified window can be set in the input data of a given queue */
+      if (ThreadQueue == Window->head.pti->MessageQueue)
          /* set the current thread focus window */
          ThreadQueue->spwndFocus = Window;
 
index 68326c7..8787b4a 100644 (file)
@@ -395,17 +395,17 @@ NtUserBlockInput(
 }
 
 BOOL FASTCALL
-UserAttachThreadInput(PTHREADINFO pti, PTHREADINFO ptiTo, BOOL fAttach)
+UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
 {
     PATTACHINFO pai;
 
     /* Can not be the same thread. */
-    if (pti == ptiTo) return FALSE;
+    if (ptiFrom == ptiTo) return FALSE;
 
     /* Do not attach to system threads or between different desktops. */
-    if (pti->TIF_flags & TIF_DONTATTACHQUEUE ||
+    if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE ||
             ptiTo->TIF_flags & TIF_DONTATTACHQUEUE ||
-            pti->rpdesk != ptiTo->rpdesk)
+            ptiFrom->rpdesk != ptiTo->rpdesk)
         return FALSE;
 
     /* If Attach set, allocate and link. */
@@ -415,9 +415,16 @@ UserAttachThreadInput(PTHREADINFO pti, PTHREADINFO ptiTo, BOOL fAttach)
         if (!pai) return FALSE;
 
         pai->paiNext = gpai;
-        pai->pti1 = pti;
+        pai->pti1 = ptiFrom;
         pai->pti2 = ptiTo;
         gpai = pai;
+        ERR("Attach Allocated! ptiFrom 0x%p  ptiTo 0x%p\n",ptiFrom,ptiTo);
+
+        ptiFrom->pqAttach = ptiFrom->MessageQueue;
+        ptiFrom->MessageQueue = ptiTo->MessageQueue;
+        // FIXME: conditions?
+        ptiFrom->MessageQueue->spwndActive = ptiFrom->pqAttach->spwndActive;
+        ptiFrom->MessageQueue->spwndFocus = ptiFrom->pqAttach->spwndFocus;
     }
     else /* If clear, unlink and free it. */
     {
@@ -430,7 +437,7 @@ UserAttachThreadInput(PTHREADINFO pti, PTHREADINFO ptiTo, BOOL fAttach)
         /* Search list and free if found or return false. */
         do
         {
-            if (pai->pti2 == ptiTo && pai->pti1 == pti) break;
+            if (pai->pti2 == ptiTo && pai->pti1 == ptiFrom) break;
             paiprev = pai;
             pai = pai->paiNext;
         } while (pai);
@@ -440,8 +447,19 @@ UserAttachThreadInput(PTHREADINFO pti, PTHREADINFO ptiTo, BOOL fAttach)
         if (paiprev) paiprev->paiNext = pai->paiNext;
 
         ExFreePoolWithTag(pai, USERTAG_ATTACHINFO);
-    }
+        ERR("Attach Free! ptiFrom 0x%p  ptiTo 0x%p\n",ptiFrom,ptiTo);
 
+        ptiFrom->MessageQueue = ptiFrom->pqAttach;
+        // FIXME: conditions?
+        ptiFrom->MessageQueue->spwndActive = NULL;
+        ptiFrom->MessageQueue->spwndFocus = NULL;
+        ptiFrom->pqAttach = NULL;
+    }
+    /* Note that key state, which can be ascertained by calls to the GetKeyState
+       or GetKeyboardState function, is reset after a call to AttachThreadInput.
+       ATM which one?
+     */
+    RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState));
     return TRUE;
 }