DLL separation (1)

Dimitrie O. Paun dpaun at rogers.com
Thu Sep 19 01:04:14 CDT 2002


Conceptually, there is no need for the USER driver to know
anything about the caret when it's scrolling a window.

USER will hide the caret if need be, call the driver to
scroll the window, and then restore the caret.

In the process, we no longer need to export:
	CARET_GetRect
	WIN_IsWindowDrawable
from USER.

ChangeLog:
  Have USER deal with the caret when scrolling a window.

Index: dlls/user/user32.spec
===================================================================
RCS file: /var/cvs/wine/dlls/user/user32.spec,v
retrieving revision 1.52
diff -u -r1.52 user32.spec
--- dlls/user/user32.spec	6 Sep 2002 18:51:32 -0000	1.52
+++ dlls/user/user32.spec	19 Sep 2002 05:39:50 -0000
@@ -681,7 +681,6 @@
 # Wine dll separation hacks, these will go away, don't use them
 #
 @ cdecl CARET_GetHwnd() CARET_GetHwnd
-@ cdecl CARET_GetRect(ptr) CARET_GetRect
 @ cdecl CLIPBOARD_DeleteRecord(ptr long) CLIPBOARD_DeleteRecord
 @ cdecl CLIPBOARD_EmptyCache(long) CLIPBOARD_EmptyCache
 @ cdecl CLIPBOARD_GetFormatName(long ptr long) CLIPBOARD_GetFormatName
@@ -703,7 +702,6 @@
 @ cdecl WIN_FindWndPtr(long) WIN_FindWndPtr
 @ cdecl WIN_GetPtr(long) WIN_GetPtr
 @ cdecl WIN_Handle32(long) WIN_Handle32
-@ cdecl WIN_IsWindowDrawable(long long) WIN_IsWindowDrawable
 @ cdecl WIN_LinkWindow(long long long) WIN_LinkWindow
 @ cdecl WIN_ListChildren(long) WIN_ListChildren
 @ cdecl WIN_ListParents(long) WIN_ListParents
Index: dlls/x11drv/scroll.c
===================================================================
RCS file: /var/cvs/wine/dlls/x11drv/scroll.c,v
retrieving revision 1.8
diff -u -r1.8 scroll.c
--- dlls/x11drv/scroll.c	31 May 2002 23:40:57 -0000	1.8
+++ dlls/x11drv/scroll.c	19 Sep 2002 05:25:38 -0000
@@ -37,37 +37,6 @@
 
 
 /*************************************************************************
- *             fix_caret
- */
-static BOOL fix_caret(HWND hWnd, LPRECT lprc, UINT flags)
-{
-   HWND hCaret = CARET_GetHwnd();
-
-   if( hCaret )
-   {
-       RECT rc;
-       CARET_GetRect( &rc );
-       if( hCaret == hWnd ||
-          (flags & SW_SCROLLCHILDREN && IsChild(hWnd, hCaret)) )
-       {
-           POINT pt;
-           pt.x = rc.left;
-           pt.y = rc.top;
-           MapWindowPoints( hCaret, hWnd, (LPPOINT)&rc, 2 );
-           if( IntersectRect(lprc, lprc, &rc) )
-           {
-               HideCaret(0);
-               lprc->left = pt.x;
-               lprc->top = pt.y;
-               return TRUE;
-           }
-       }
-   }
-   return FALSE;
-}
-
-
-/*************************************************************************
  *		ScrollDC   (X11DRV.@)
  *
  * Only the hrgnUpdate is returned in device coordinates.
@@ -143,102 +112,83 @@
  *
  * Note: contrary to what the doc says, pixels that are scrolled from the
  *      outside of clipRect to the inside are NOT painted.
+ *
+ * Parameter are the same as in ScrollWindowEx, with the additional
+ * requirement that rect and clipRect are _valid_ pointers, to
+ * rectangles _within_ the client are. Moreover, there is something
+ * to scroll.
  */
 INT X11DRV_ScrollWindowEx( HWND hwnd, INT dx, INT dy,
                            const RECT *rect, const RECT *clipRect,
                            HRGN hrgnUpdate, LPRECT rcUpdate, UINT flags )
 {
-    INT  retVal = NULLREGION;
-    BOOL bCaret = FALSE, bOwnRgn = TRUE;
-    RECT rc, cliprc;
-
-    if (!WIN_IsWindowDrawable( hwnd, TRUE )) return ERROR;
-    hwnd = WIN_GetFullHandle( hwnd );
-
-    GetClientRect(hwnd, &rc);
-    if (rect) IntersectRect(&rc, &rc, rect);
-
-    if (clipRect) IntersectRect(&cliprc,&rc,clipRect);
-    else cliprc = rc;
-
-    if (!IsRectEmpty(&cliprc) && (dx || dy))
-    {
-        HDC   hDC;
-        BOOL  bUpdate = (rcUpdate || hrgnUpdate || flags & (SW_INVALIDATE | SW_ERASE));
-        HRGN  hrgnClip = CreateRectRgnIndirect(&cliprc);
-        HRGN  hrgnTemp;
-        RECT  caretrc;
-
-        TRACE( "%04x, %d,%d hrgnUpdate=%04x rcUpdate = %p rc=(%d,%d-%d,%d) %04x\n",
-               hwnd, dx, dy, hrgnUpdate, rcUpdate,
-               rc.left, rc.top, rc.right, rc.bottom, flags );
-        if (clipRect) TRACE( "cliprc = (%d,%d,%d,%d)\n",
-                             clipRect->left, clipRect->top,
-                             clipRect->right, clipRect->bottom );
-
-        caretrc = rc;
-        bCaret = fix_caret(hwnd, &caretrc, flags);
+    INT   retVal;
+    BOOL  bOwnRgn = TRUE;
+    BOOL  bUpdate = (rcUpdate || hrgnUpdate || flags & (SW_INVALIDATE | SW_ERASE));
+    HRGN  hrgnClip = CreateRectRgnIndirect(clipRect);
+    HRGN  hrgnTemp;
+    HDC   hDC;
+
+    TRACE( "%04x, %d,%d hrgnUpdate=%04x rcUpdate = %p rect=(%d,%d-%d,%d) %04x\n",
+           hwnd, dx, dy, hrgnUpdate, rcUpdate,
+           rect->left, rect->top, rect->right, rect->bottom, flags );
+    TRACE( "clipRect = (%d,%d,%d,%d)\n",
+           clipRect->left, clipRect->top, clipRect->right, clipRect->bottom );
 
-        if( hrgnUpdate ) bOwnRgn = FALSE;
-        else if( bUpdate ) hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 );
+    if( hrgnUpdate ) bOwnRgn = FALSE;
+    else if( bUpdate ) hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 );
 
-        hDC = GetDCEx( hwnd, 0, DCX_CACHE | DCX_USESTYLE );
-        if (hDC)
-        {
-            HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
-            X11DRV_StartGraphicsExposures( hDC );
-            X11DRV_ScrollDC( hDC, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate );
-            X11DRV_EndGraphicsExposures( hDC, hrgn );
-            ReleaseDC( hwnd, hDC );
-            if (bUpdate) CombineRgn( hrgnUpdate, hrgnUpdate, hrgn, RGN_OR );
-            else RedrawWindow( hwnd, NULL, hrgn, RDW_INVALIDATE | RDW_ERASE );
-            DeleteObject( hrgn );
-        }
+    hDC = GetDCEx( hwnd, 0, DCX_CACHE | DCX_USESTYLE );
+    if (hDC)
+    {
+        HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
+        X11DRV_StartGraphicsExposures( hDC );
+        X11DRV_ScrollDC( hDC, dx, dy, rect, clipRect, hrgnUpdate, rcUpdate );
+        X11DRV_EndGraphicsExposures( hDC, hrgn );
+        ReleaseDC( hwnd, hDC );
+        if (bUpdate) CombineRgn( hrgnUpdate, hrgnUpdate, hrgn, RGN_OR );
+        else RedrawWindow( hwnd, NULL, hrgn, RDW_INVALIDATE | RDW_ERASE );
+        DeleteObject( hrgn );
+    }
 
-        /* Take into account the fact that some damages may have occured during the scroll */
-        hrgnTemp = CreateRectRgn( 0, 0, 0, 0 );
-        if (GetUpdateRgn( hwnd, hrgnTemp, FALSE ) != NULLREGION)
-        {
-            OffsetRgn( hrgnTemp, dx, dy );
-            CombineRgn( hrgnTemp, hrgnTemp, hrgnClip, RGN_AND );
-            RedrawWindow( hwnd, NULL, hrgnTemp, RDW_INVALIDATE | RDW_ERASE );
-        }
-        DeleteObject( hrgnTemp );
+    /* Take into account the fact that some damages may have occured during the scroll */
+    hrgnTemp = CreateRectRgn( 0, 0, 0, 0 );
+    retVal = GetUpdateRgn( hwnd, hrgnTemp, FALSE );
+    if (retVal != NULLREGION)
+    {
+        OffsetRgn( hrgnTemp, dx, dy );
+        CombineRgn( hrgnTemp, hrgnTemp, hrgnClip, RGN_AND );
+        RedrawWindow( hwnd, NULL, hrgnTemp, RDW_INVALIDATE | RDW_ERASE );
+    }
+    DeleteObject( hrgnTemp );
 
-        if( flags & SW_SCROLLCHILDREN )
+    if( flags & SW_SCROLLCHILDREN )
+    {
+        HWND *list = WIN_ListChildren( hwnd );
+        if (list)
         {
-            HWND *list = WIN_ListChildren( hwnd );
-
-            if (list)
+            int i;
+            RECT r, dummy;
+            for (i = 0; list[i]; i++)
             {
-                int i;
-                RECT r, dummy;
-                for (i = 0; list[i]; i++)
-                {
-                    GetWindowRect( list[i], &r );
-                    MapWindowPoints( 0, hwnd, (POINT *)&r, 2 );
-                    if (!rect || IntersectRect(&dummy, &r, &rc))
-                        SetWindowPos( list[i], 0, r.left + dx, r.top  + dy, 0, 0,
-                                      SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE |
-                                      SWP_NOREDRAW | SWP_DEFERERASE );
-                }
-                HeapFree( GetProcessHeap(), 0, list );
+                GetWindowRect( list[i], &r );
+                MapWindowPoints( 0, hwnd, (POINT *)&r, 2 );
+                if (!rect || IntersectRect(&dummy, &r, rect))
+                    SetWindowPos( list[i], 0, r.left + dx, r.top  + dy, 0, 0,
+                                  SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE |
+                                  SWP_NOREDRAW | SWP_DEFERERASE );
             }
+            HeapFree( GetProcessHeap(), 0, list );
         }
-
-        if( flags & (SW_INVALIDATE | SW_ERASE) )
-            RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
-                          ((flags & SW_ERASE) ? RDW_ERASENOW : 0) |
-                          ((flags & SW_SCROLLCHILDREN) ? RDW_ALLCHILDREN : 0 ) );
-
-        if( bCaret )
-        {
-            SetCaretPos( caretrc.left + dx, caretrc.top + dy );
-            ShowCaret(0);
-        }
-
-        if( bOwnRgn && hrgnUpdate ) DeleteObject( hrgnUpdate );
-        DeleteObject( hrgnClip );
     }
+
+    if( flags & (SW_INVALIDATE | SW_ERASE) )
+        RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
+                      ((flags & SW_ERASE) ? RDW_ERASENOW : 0) |
+                      ((flags & SW_SCROLLCHILDREN) ? RDW_ALLCHILDREN : 0 ) );
+
+    if( bOwnRgn && hrgnUpdate ) DeleteObject( hrgnUpdate );
+    DeleteObject( hrgnClip );
+    
     return retVal;
 }
Index: windows/scroll.c
===================================================================
RCS file: /var/cvs/wine/windows/scroll.c,v
retrieving revision 1.36
diff -u -r1.36 scroll.c
--- windows/scroll.c	31 May 2002 23:06:54 -0000	1.36
+++ windows/scroll.c	19 Sep 2002 05:58:48 -0000
@@ -26,11 +26,43 @@
 #include "wine/winuser16.h"
 #include "winuser.h"
 #include "user.h"
+#include "win.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(scroll);
 
 /*************************************************************************
+ *             fix_caret
+ */
+static HWND fix_caret(HWND hWnd, LPRECT lprc, UINT flags)
+{
+   HWND hCaret = CARET_GetHwnd();
+
+   if( hCaret )
+   {
+       RECT rc;
+       CARET_GetRect( &rc );
+       if( hCaret == hWnd ||
+          (flags & SW_SCROLLCHILDREN && IsChild(hWnd, hCaret)) )
+       {
+           POINT pt;
+           pt.x = rc.left;
+           pt.y = rc.top;
+           MapWindowPoints( hCaret, hWnd, (LPPOINT)&rc, 2 );
+           if( IntersectRect(lprc, lprc, &rc) )
+           {
+               HideCaret(hCaret);
+               lprc->left = pt.x;
+               lprc->top = pt.y;
+               return hCaret;
+           }
+       }
+   }
+   return 0;
+}
+
+
+/*************************************************************************
  *		ScrollWindow (USER32.@)
  *
  */
@@ -89,8 +121,37 @@
                                HRGN hrgnUpdate, LPRECT rcUpdate,
                                UINT flags )
 {
-    if (USER_Driver.pScrollWindowEx)
-        return USER_Driver.pScrollWindowEx( hwnd, dx, dy, rect, clipRect,
-                                            hrgnUpdate, rcUpdate, flags );
-    return ERROR;
+    RECT rc, cliprc;
+    INT result;
+    
+    if (!WIN_IsWindowDrawable( hwnd, TRUE )) return ERROR;
+    hwnd = WIN_GetFullHandle( hwnd );
+
+    GetClientRect(hwnd, &rc);
+    if (rect) IntersectRect(&rc, &rc, rect);
+
+    if (clipRect) IntersectRect(&cliprc,&rc,clipRect);
+    else cliprc = rc;
+
+    if (!IsRectEmpty(&cliprc) && (dx || dy))
+    {
+        RECT caretrc = rc;
+        HWND hwndCaret = fix_caret(hwnd, &caretrc, flags);
+
+	if (USER_Driver.pScrollWindowEx)
+            result = USER_Driver.pScrollWindowEx( hwnd, dx, dy, &rc, &cliprc,
+                                                  hrgnUpdate, rcUpdate, flags );
+	else
+	    result = ERROR; /* FIXME: we should have a fallback implementation */
+	
+        if( hwndCaret )
+        {
+            SetCaretPos( caretrc.left + dx, caretrc.top + dy );
+            ShowCaret(hwndCaret);
+        }
+    }
+    else 
+	result = NULLREGION;
+    
+    return result;
 }





More information about the wine-patches mailing list