[ros-diffs] [jimtabor] 51248: [User32|Win32k] - Working on wine win test_capture_4, pass all the tests in test_capture_4_proc but still waiting forever in MenuTrackMenu:WaitMessage!

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Mon Apr 4 07:18:55 UTC 2011


Author: jimtabor
Date: Mon Apr  4 07:18:54 2011
New Revision: 51248

URL: http://svn.reactos.org/svn/reactos?rev=51248&view=rev
Log:
[User32|Win32k]
- Working on wine win test_capture_4, pass all the tests in test_capture_4_proc but still waiting forever in MenuTrackMenu:WaitMessage!

Modified:
    trunk/reactos/dll/win32/user32/windows/menu.c
    trunk/reactos/dll/win32/user32/windows/message.c
    trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
    trunk/reactos/subsystems/win32/win32k/ntuser/misc.c

Modified: trunk/reactos/dll/win32/user32/windows/menu.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/menu.c?rev=51248&r1=51247&r2=51248&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] Mon Apr  4 07:18:54 2011
@@ -3207,8 +3207,10 @@
         fEndMenu = !fRemove;
     }
 
-    SetCapture(mt.OwnerWnd);
-    (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, mt.OwnerWnd);
+    /* owner may not be visible when tracking a popup, so use the menu itself */
+    capture_win = (wFlags & TPM_POPUPMENU) ? MenuInfo.Wnd : mt.OwnerWnd;
+    (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, capture_win); // 1
+    SetCapture(capture_win);                                          // 2
 
     FIXME("MenuTrackMenu 1\n");
     while (! fEndMenu)

Modified: trunk/reactos/dll/win32/user32/windows/message.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/message.c?rev=51248&r1=51247&r2=51248&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/message.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/message.c [iso-8859-1] Mon Apr  4 07:18:54 2011
@@ -2380,8 +2380,9 @@
 BOOL WINAPI
 ReleaseCapture(VOID)
 {
-  NtUserSetCapture(NULL);
-  return(TRUE);
+  HWND hwndPrev = NtUserSetCapture(NULL);
+  return(hwndPrev ? TRUE : FALSE);
+// return (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_RELEASECAPTURE);
 }
 
 

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/focus.c?rev=51248&r1=51247&r2=51248&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] Mon Apr  4 07:18:54 2011
@@ -546,6 +546,9 @@
    pti = PsGetCurrentThreadWin32Thread();
    ThreadQueue = pti->MessageQueue;
 
+   if (ThreadQueue->QF_flags & QF_CAPTURELOCKED)
+      return NULL;
+
    if ((Window = UserGetWindowObject(hWnd)))
    {
       if (Window->head.pti->MessageQueue != ThreadQueue)
@@ -553,7 +556,7 @@
          return NULL;
       }
    }
-
+   
    hWndPrev = MsqSetStateWindow(ThreadQueue, MSQ_STATE_CAPTURE, hWnd);
 
    if (hWndPrev)
@@ -563,19 +566,28 @@
          IntNotifyWinEvent(EVENT_SYSTEM_CAPTUREEND, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
    }
 
+   if (Window)
+      IntNotifyWinEvent(EVENT_SYSTEM_CAPTURESTART, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
+
+   if (hWndPrev && hWndPrev != hWnd)
+   {
+      if (ThreadQueue->MenuOwner && Window) ThreadQueue->QF_flags |= QF_CAPTURELOCKED;
+
+      co_IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd);
+
+      ThreadQueue->QF_flags &= ~QF_CAPTURELOCKED;
+   }
+
+   ThreadQueue->CaptureWindow = hWnd;
+
+   /// These are hacks!
    /* also remove other windows if not capturing anymore */
    if (hWnd == NULL)
    {
       MsqSetStateWindow(ThreadQueue, MSQ_STATE_MENUOWNER, NULL);
       MsqSetStateWindow(ThreadQueue, MSQ_STATE_MOVESIZE, NULL);
    }
-
-   if (Window)
-      IntNotifyWinEvent(EVENT_SYSTEM_CAPTURESTART, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
-
-   co_IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd);
-   ThreadQueue->CaptureWindow = hWnd;
-
+   ///
    return hWndPrev;
 }
 

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/misc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/misc.c?rev=51248&r1=51247&r2=51248&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/misc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/misc.c [iso-8859-1] Mon Apr  4 07:18:54 2011
@@ -179,7 +179,9 @@
    GUITHREADINFO SafeGui;
    PDESKTOP Desktop;
    PUSER_MESSAGE_QUEUE MsgQueue;
+   PTHREADINFO W32Thread;
    PETHREAD Thread = NULL;
+
    DECLARE_RETURN(BOOLEAN);
 
    DPRINT("Enter NtUserGetGUIThreadInfo\n");
@@ -198,7 +200,7 @@
       RETURN( FALSE);
    }
 
-   if(idThread)
+   if (idThread)
    {
       Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)idThread, &Thread);
       if(!NT_SUCCESS(Status))
@@ -206,24 +208,17 @@
          EngSetLastError(ERROR_ACCESS_DENIED);
          RETURN( FALSE);
       }
-      Desktop = ((PTHREADINFO)Thread->Tcb.Win32Thread)->rpdesk;
+      W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread;
+      Desktop = W32Thread->rpdesk;
    }
    else
-   {
-      /* get the foreground thread */
-      PTHREADINFO W32Thread = (PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread;
+   {  /* get the foreground thread */
+      Thread = PsGetCurrentThread();
+      W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread;
       Desktop = W32Thread->rpdesk;
-      if(Desktop)
-      {
-         MsgQueue = Desktop->ActiveMessageQueue;
-         if(MsgQueue)
-         {
-            Thread = MsgQueue->Thread;
-         }
-      }
-   }
-
-   if(!Thread || !Desktop)
+   }
+
+   if (!Thread || !Desktop )
    {
       if(idThread && Thread)
          ObDereferenceObject(Thread);
@@ -231,13 +226,21 @@
       RETURN( FALSE);
    }
 
-   MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue;
+   if ( W32Thread->MessageQueue )
+      MsgQueue = W32Thread->MessageQueue;
+   else
+   {
+      if ( Desktop ) MsgQueue = Desktop->ActiveMessageQueue;
+   }
+
    CaretInfo = MsgQueue->CaretInfo;
 
    SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0);
-   if(MsgQueue->MenuOwner)
+
+   if (MsgQueue->MenuOwner)
       SafeGui.flags |= GUI_INMENUMODE | MsgQueue->MenuState;
-   if(MsgQueue->MoveSize)
+
+   if (MsgQueue->MoveSize)
       SafeGui.flags |= GUI_INMOVESIZE;
 
    /* FIXME add flag GUI_16BITTASK */
@@ -254,7 +257,7 @@
    SafeGui.rcCaret.right = SafeGui.rcCaret.left + CaretInfo->Size.cx;
    SafeGui.rcCaret.bottom = SafeGui.rcCaret.top + CaretInfo->Size.cy;
 
-   if(idThread)
+   if (idThread)
       ObDereferenceObject(Thread);
 
    Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO));




More information about the Ros-diffs mailing list