Author: jimtabor
Date: Thu Jun  7 01:08:41 2012
New Revision: 56703

URL: http://svn.reactos.org/svn/reactos?rev=56703&view=rev
Log:
[Win32k]
- 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.

Modified:
    trunk/reactos/win32ss/user/ntuser/focus.c
    trunk/reactos/win32ss/user/ntuser/input.c

Modified: trunk/reactos/win32ss/user/ntuser/focus.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/focus.c?rev=56703&r1=56702&r2=56703&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/focus.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/focus.c [iso-8859-1] Thu Jun  7 01:08:41 
2012
@@ -595,8 +595,14 @@
          }
       }
 
-      /* 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;
 

Modified: trunk/reactos/win32ss/user/ntuser/input.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/input.c?rev=56703&r1=56702&r2=56703&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/input.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/input.c [iso-8859-1] Thu Jun  7 01:08:41 
2012
@@ -395,17 +395,17 @@
 }
 
 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 @@
         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 @@
         /* 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 @@
         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;
 }
 


Reply via email to