Implemented GetAncestor and IsWindowVisible
authorDavid Welch <welch@cwcom.net>
Fri, 30 Aug 2002 02:47:37 +0000 (02:47 +0000)
committerDavid Welch <welch@cwcom.net>
Fri, 30 Aug 2002 02:47:37 +0000 (02:47 +0000)
Save and restore the trap frame around exceptions
Allow nested w32 callbacks

svn path=/trunk/; revision=3440

reactos/include/defines.h
reactos/include/win32k/ntuser.h
reactos/lib/user32/windows/window.c
reactos/ntoskrnl/ke/i386/trap.s
reactos/ntoskrnl/ps/w32call.c
reactos/subsys/win32k/ntuser/stubs.c
reactos/subsys/win32k/ntuser/window.c

index d768b22..29ab986 100644 (file)
@@ -49,7 +49,9 @@
 //#define STATUS_PENDING               (0x00000103L)
 #endif /* WIN32_NO_STATUS */
 
-
+#define GA_PARENT               (1)
+#define GA_ROOT                 (2)
+#define GA_ROOTOWNER            (3)
 
 /* CreateFile, GetFileAttributes, SetFileAttributes */
 
index 11ec169..34376fa 100644 (file)
@@ -509,11 +509,9 @@ NtUserGetAltTabInfo(
   DWORD Unknown4,
   DWORD Unknown5);
 
-DWORD
-STDCALL
-NtUserGetAncestor(
-  DWORD Unknown0,
-  DWORD Unknown1);
+HWND STDCALL
+NtUserGetAncestor(HWND hWnd, UINT Flags);
+
 
 DWORD
 STDCALL
index 49629f7..b9877fe 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: window.c,v 1.8 2002/07/17 21:04:54 dwelch Exp $
+/* $Id: window.c,v 1.9 2002/08/30 02:47:36 dwelch Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS user32.dll
@@ -541,10 +541,9 @@ GetAltTabInfoW(HWND hwnd,
 }
 
 HWND STDCALL
-GetAncestor(HWND hwnd,
-           UINT gaFlags)
+GetAncestor(HWND hwnd, UINT gaFlags)
 {
-  return (HWND)0;
+  return(NtUserGetAncestor(hwnd, gaFlags));
 }
 
 WINBOOL STDCALL
@@ -719,7 +718,15 @@ IsWindowUnicode(HWND hWnd)
 WINBOOL STDCALL
 IsWindowVisible(HWND hWnd)
 {
-  return FALSE;
+  while (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD)
+    {
+      if (!(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
+       {
+         return(FALSE);
+       }
+      hWnd = GetAncestor(hWnd, GA_PARENT);
+    }
+  return(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE);
 }
 
 WINBOOL STDCALL
index 27343e7..8d22ccd 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: trap.s,v 1.13 2002/07/17 21:04:55 dwelch Exp $
+/* $Id: trap.s,v 1.14 2002/08/30 02:47:36 dwelch Exp $
  *
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ke/i386/trap.s
@@ -40,14 +40,7 @@ _KiTrapEpilog:
        cmpl    $1, %eax       /* Check for v86 recovery */
        jne     _KiTrapRet
        jmp     _KiV86Complete
-_KiTrapRet:            
-       /* Get a pointer to the current thread */
-        movl   %fs:0x124, %esi
-       
-        /* Restore the old trap frame pointer */
-        movl   0x3c(%esp), %ebx
-       movl    %ebx, KTHREAD_TRAP_FRAME(%esi)
-       
+_KiTrapRet:                            
        /* Skip debug information and unsaved registers */
        addl    $0x30, %esp
        popl    %gs
@@ -138,21 +131,31 @@ _KiTrapProlog:
        pushl   $0     /* XXX: DebugArgMark */
        movl    0x60(%esp), %ebx
        pushl   %ebx   /* XXX: DebugEIP */
-       pushl   %ebp   /* XXX: DebugEBP */
-
+       pushl   %ebp   /* XXX: DebugEBP */      
+               
        /* Load the segment registers */
        movl    $KERNEL_DS, %ebx
        movl    %ebx, %ds
        movl    %ebx, %es
        movl    %ebx, %gs
-
+       
        /*  Set ES to kernel segment  */
        movw    $KERNEL_DS,%bx
        movw    %bx,%es
 
        movl    %esp, %ebx
-       movl    %esp, %ebp
-       
+       movl    %esp, %ebp              
+
+       /* Save the old trap frame. */
+       cmpl    $0, %edi
+       je      .L7
+       movl    %ss:KTHREAD_TRAP_FRAME(%edi), %edx
+       pushl   %edx
+       jmp     .L8
+.L7:
+       pushl   $0
+.L8:   
+
        /* Save a pointer to the trap frame in the current KTHREAD */
        cmpl    $0, %edi
        je      .L6
@@ -166,6 +169,13 @@ _KiTrapProlog:
        addl    $4, %esp
        addl    $4, %esp
 
+       /* Get a pointer to the current thread */
+        movl   %fs:0x124, %esi
+       
+        /* Restore the old trap frame pointer */
+       popl    %ebx
+       movl    %ebx, KTHREAD_TRAP_FRAME(%esi)
+       
        /* Return to the caller */
        jmp     _KiTrapEpilog
 
index 6308fcd..652f0bf 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: w32call.c,v 1.1 2002/06/18 22:03:48 dwelch Exp $
+/* $Id: w32call.c,v 1.2 2002/08/30 02:47:37 dwelch Exp $
  *
  * COPYRIGHT:              See COPYING in the top level directory
  * PROJECT:                ReactOS kernel
@@ -43,6 +43,7 @@ typedef struct _NTW32CALL_SAVED_STATE
   PULONG CallerResultLength;
   PNTSTATUS CallbackStatus;
   PKTRAP_FRAME SavedTrapFrame;
+  PVOID SavedCallbackStack;
 } NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE;
 
 /* FUNCTIONS ***************************************************************/
@@ -63,6 +64,7 @@ NtCallbackReturn (PVOID               Result,
   KIRQL oldIrql;
   PNTW32CALL_SAVED_STATE State;
   PKTRAP_FRAME SavedTrapFrame;
+  PVOID SavedCallbackStack;
 
   Thread = PsGetCurrentThread();
   if (Thread->Tcb.CallbackStack == NULL)
@@ -71,12 +73,11 @@ NtCallbackReturn (PVOID             Result,
     }
 
   OldStack = (PULONG)Thread->Tcb.CallbackStack;
-  Thread->Tcb.CallbackStack = NULL;
 
   /*
    * Get the values that NtW32Call left on the inactive stack for us.
    */
-  State = (PNTW32CALL_SAVED_STATE)OldStack[0];
+  State = (PNTW32CALL_SAVED_STATE)OldStack[0];  
   CallbackStatus = State->CallbackStatus;
   CallerResultLength = State->CallerResultLength;
   CallerResult = State->CallerResult;
@@ -84,6 +85,7 @@ NtCallbackReturn (PVOID               Result,
   StackBase = State->SavedStackBase;
   StackLimit = State->SavedStackLimit;
   SavedTrapFrame = State->SavedTrapFrame;
+  SavedCallbackStack = State->SavedCallbackStack;
   
   /*
    * Copy the callback status and the callback result to NtW32Call
@@ -110,6 +112,7 @@ NtCallbackReturn (PVOID             Result,
   Thread->Tcb.StackBase = StackBase;
   Thread->Tcb.StackLimit = StackLimit;
   Thread->Tcb.TrapFrame = SavedTrapFrame;
+  Thread->Tcb.CallbackStack = SavedCallbackStack;
   KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack;
   KeStackSwitchAndRet((PVOID)(OldStack + 1));
 
@@ -199,14 +202,10 @@ NtW32Call (IN ULONG RoutineIndex,
   NTSTATUS CallbackStatus;
   NTW32CALL_SAVED_STATE SavedState;
 
-  DPRINT1("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n",
+  DPRINT("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n",
          RoutineIndex, Argument, ArgumentLength);
 
   Thread = PsGetCurrentThread();
-  if (Thread->Tcb.CallbackStack != NULL)
-    {
-      return(STATUS_UNSUCCESSFUL);
-    }
 
   /* Set up the new kernel and user environment. */
   StackSize = (ULONG)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit);  
@@ -233,6 +232,7 @@ NtW32Call (IN ULONG RoutineIndex,
   SavedState.CallerResultLength = ResultLength;
   SavedState.CallbackStatus = &CallbackStatus;
   SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame;
+  SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack;
   Thread->Tcb.InitialStack = Thread->Tcb.StackBase = NewStack + StackSize;
   Thread->Tcb.StackLimit = (ULONG)NewStack;
   Thread->Tcb.KernelStack = NewStack + StackSize - sizeof(KTRAP_FRAME);
index 70b8930..4332693 100644 (file)
@@ -654,17 +654,6 @@ NtUserGetAltTabInfo(
   return 0;
 }
 
-DWORD
-STDCALL
-NtUserGetAncestor(
-  DWORD Unknown0,
-  DWORD Unknown1)
-{
-  UNIMPLEMENTED
-
-  return 0;
-}
-
 DWORD
 STDCALL
 NtUserGetAsyncKeyState(
index 3ded832..f8efd30 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: window.c,v 1.11 2002/08/26 23:20:54 dwelch Exp $
+/* $Id: window.c,v 1.12 2002/08/30 02:47:37 dwelch Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
 
 /* FUNCTIONS *****************************************************************/
 
+HWND STDCALL
+NtUserGetAncestor(HWND hWnd, UINT Flags)
+{
+  if (W32kIsDesktopWindow(hWnd))
+    {
+      return(NULL);
+    }
+  if (Flags & GA_PARENT)
+    {
+      PWINDOW_OBJECT Window;
+      HWND hParent;
+
+      Window = W32kGetWindowObject(hWnd);
+      if (Window == NULL)
+       {
+         return(NULL);
+       }     
+
+      if (Window->Parent == NULL)
+       {
+         W32kReleaseWindowObject(Window);
+       }
+
+      hParent = Window->Parent->Self;
+
+      W32kReleaseWindowObject(Window);
+
+      return(hParent);
+    }
+  else
+    {
+      UNIMPLEMENTED;
+      return(NULL);
+    }
+}
+
 VOID
 W32kSetFocusWindow(HWND hWnd)
 {