[PATCH 6/7] win32u: Move get_scroll_info_ptr implementation from user32.

Jacek Caban wine at gitlab.winehq.org
Mon Jul 4 18:04:47 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

---
 dlls/user32/scroll.c         | 73 +-----------------------------------
 dlls/user32/user_main.c      |  7 ----
 dlls/win32u/defwnd.c         |  2 +-
 dlls/win32u/ntuser_private.h |  4 +-
 dlls/win32u/scroll.c         | 66 +++++++++++++++++++++++++++++---
 dlls/win32u/window.c         |  4 +-
 6 files changed, 66 insertions(+), 90 deletions(-)

diff --git a/dlls/user32/scroll.c b/dlls/user32/scroll.c
index 11c37ed6428..2543870b0eb 100644
--- a/dlls/user32/scroll.c
+++ b/dlls/user32/scroll.c
@@ -31,17 +31,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(scroll);
 
-typedef struct scroll_info SCROLLBAR_INFO, *LPSCROLLBAR_INFO;
-typedef struct scroll_bar_win_data SCROLLBAR_WNDDATA;
-
-/* data for window that has (one or two) scroll bars */
-typedef struct
-{
-    SCROLLBAR_INFO horz;
-    SCROLLBAR_INFO vert;
-} WINSCROLLBAR_INFO, *LPWINSCROLLBAR_INFO;
-
-#define SCROLLBAR_MAGIC 0x5c6011ba
 
   /* Overlap between arrows and thumb */
 #define SCROLL_ARROW_THUMB_OVERLAP 0
@@ -54,71 +43,11 @@ const struct builtin_class_descr SCROLL_builtin_class =
     L"ScrollBar",           /* name */
     CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style  */
     WINPROC_SCROLLBAR,      /* proc */
-    sizeof(SCROLLBAR_WNDDATA), /* extra */
+    sizeof(struct scroll_bar_win_data), /* extra */
     IDC_ARROW,              /* cursor */
     0                       /* brush */
 };
 
-/***********************************************************************
- *           SCROLL_GetInternalInfo
-
- * Returns pointer to internal SCROLLBAR_INFO structure for nBar
- * or NULL if failed (f.i. scroll bar does not exist yet)
- * If alloc is TRUE and the struct does not exist yet, create it.
- */
-SCROLLBAR_INFO *SCROLL_GetInternalInfo( HWND hwnd, INT nBar, BOOL alloc )
-{
-    SCROLLBAR_INFO *infoPtr = NULL;
-    WND *wndPtr = WIN_GetPtr( hwnd );
-
-    if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return NULL;
-    switch(nBar)
-    {
-        case SB_HORZ:
-            if (wndPtr->pScroll) infoPtr = &((LPWINSCROLLBAR_INFO)wndPtr->pScroll)->horz;
-            break;
-        case SB_VERT:
-            if (wndPtr->pScroll) infoPtr = &((LPWINSCROLLBAR_INFO)wndPtr->pScroll)->vert;
-            break;
-        case SB_CTL:
-            if (wndPtr->cbWndExtra >= sizeof(SCROLLBAR_WNDDATA))
-            {
-                SCROLLBAR_WNDDATA *data = (SCROLLBAR_WNDDATA*)wndPtr->wExtra;
-                if (data->magic == SCROLLBAR_MAGIC)
-                    infoPtr = &data->info;
-            }
-            if (!infoPtr) WARN("window is not a scrollbar control\n");
-            break;
-        case SB_BOTH:
-            WARN("with SB_BOTH\n");
-            break;
-    }
-
-    if (!infoPtr && alloc)
-    {
-        WINSCROLLBAR_INFO *winInfoPtr;
-
-        if (nBar != SB_HORZ && nBar != SB_VERT)
-            WARN("Cannot initialize nBar=%d\n",nBar);
-        else if ((winInfoPtr = HeapAlloc( GetProcessHeap(), 0, sizeof(WINSCROLLBAR_INFO) )))
-        {
-            /* Set default values */
-            winInfoPtr->horz.minVal = 0;
-            winInfoPtr->horz.curVal = 0;
-            winInfoPtr->horz.page = 0;
-            /* From MSDN and our own tests:
-             * max for a standard scroll bar is 100 by default. */
-            winInfoPtr->horz.maxVal = 100;
-            winInfoPtr->horz.flags  = ESB_ENABLE_BOTH;
-            winInfoPtr->vert = winInfoPtr->horz;
-            wndPtr->pScroll = winInfoPtr;
-            infoPtr = nBar == SB_HORZ ? &winInfoPtr->horz : &winInfoPtr->vert;
-        }
-    }
-    WIN_ReleasePtr( wndPtr );
-    return infoPtr;
-}
-
 
 /***********************************************************************
  *           SCROLL_DrawArrows
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index fb9ce74736d..26427bd2cf6 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -135,11 +135,6 @@ static void WINAPI unregister_imm( HWND hwnd )
     imm_unregister_window( hwnd );
 }
 
-static void CDECL free_win_ptr( WND *win )
-{
-    HeapFree( GetProcessHeap(), 0, win->pScroll );
-}
-
 static NTSTATUS try_finally( NTSTATUS (CDECL *func)( void *), void *arg,
                              void (CALLBACK *finally_func)( BOOL ))
 {
@@ -157,8 +152,6 @@ static const struct user_callbacks user_funcs =
     ImmProcessKey,
     ImmTranslateMessage,
     NtWaitForMultipleObjects,
-    free_win_ptr,
-    SCROLL_GetInternalInfo,
     notify_ime,
     post_dde_message,
     unpack_dde_message,
diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c
index 702673e0cdd..f44540f7f98 100644
--- a/dlls/win32u/defwnd.c
+++ b/dlls/win32u/defwnd.c
@@ -2379,7 +2379,7 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
             if (!win) return 0;
             free( win->text );
             win->text = NULL;
-            if (user_callbacks) user_callbacks->free_win_ptr( win );
+            free( win->pScroll );
             win->pScroll = NULL;
             release_win_ptr( win );
             break;
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index b2765a70a3d..fb6e5a5200b 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -35,8 +35,6 @@ struct user_callbacks
     BOOL (WINAPI *pImmProcessKey)(HWND, HKL, UINT, LPARAM, DWORD);
     BOOL (WINAPI *pImmTranslateMessage)(HWND, UINT, WPARAM, LPARAM);
     NTSTATUS (WINAPI *pNtWaitForMultipleObjects)(ULONG,const HANDLE*,BOOLEAN,BOOLEAN,const LARGE_INTEGER*);
-    void (CDECL *free_win_ptr)( struct tagWND *win );
-    struct scroll_info *(CDECL *get_scroll_info)( HWND hwnd, INT nBar, BOOL alloc );
     void (CDECL *notify_ime)( HWND hwnd, UINT param );
     BOOL (CDECL *post_dde_message)( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, DWORD dest_tid,
                                     DWORD type );
@@ -97,7 +95,7 @@ typedef struct tagWND
     POINT              min_pos;       /* Position for minimized window */
     POINT              max_pos;       /* Position for maximized window */
     WCHAR             *text;          /* Window text */
-    void              *pScroll;       /* Scroll-bar info */
+    struct win_scroll_bar_info *pScroll; /* Scroll-bar info */
     DWORD              dwStyle;       /* Window style (from CreateWindow) */
     DWORD              dwExStyle;     /* Extended style (from CreateWindowEx) */
     UINT_PTR           wIDmenu;       /* ID or hmenu (from CreateWindow) */
diff --git a/dlls/win32u/scroll.c b/dlls/win32u/scroll.c
index c4c26e3bc6e..cb6d4b7a7c9 100644
--- a/dlls/win32u/scroll.c
+++ b/dlls/win32u/scroll.c
@@ -62,13 +62,69 @@ static struct SCROLL_TRACKING_INFO g_tracking_info;
 /* Is the moving thumb being displayed? */
 static BOOL scroll_moving_thumb = FALSE;
 
+/* data for window that has (one or two) scroll bars */
+struct win_scroll_bar_info
+{
+    struct scroll_info horz;
+    struct scroll_info vert;
+};
+
+#define SCROLLBAR_MAGIC 0x5c6011ba
+
+
 static struct scroll_info *get_scroll_info_ptr( HWND hwnd, int bar, BOOL alloc )
 {
-    struct scroll_info *ret = NULL;
-    user_lock();
-    if (user_callbacks) ret = user_callbacks->get_scroll_info( hwnd, bar, alloc );
-    if (!ret) user_unlock();
-    return ret;
+    struct scroll_info *info = NULL;
+    WND *win = get_win_ptr( hwnd );
+
+    if (!win || win == WND_OTHER_PROCESS || win == WND_DESKTOP) return NULL;
+
+    switch (bar)
+    {
+    case SB_HORZ:
+        if (win->pScroll) info = &win->pScroll->horz;
+        break;
+    case SB_VERT:
+        if (win->pScroll) info = &win->pScroll->vert;
+        break;
+    case SB_CTL:
+        if (win->cbWndExtra >= sizeof(struct scroll_bar_win_data))
+        {
+            struct scroll_bar_win_data *data = (struct scroll_bar_win_data *)win->wExtra;
+            if (data->magic == SCROLLBAR_MAGIC) info = &data->info;
+        }
+        if (!info) WARN( "window is not a scrollbar control\n" );
+        break;
+    case SB_BOTH:
+        WARN( "with SB_BOTH\n" );
+        break;
+    }
+
+    if (!info && alloc)
+    {
+        struct win_scroll_bar_info *win_info;
+
+        if (bar != SB_HORZ && bar != SB_VERT)
+            WARN("Cannot initialize bar=%d\n",bar);
+        else if ((win_info = malloc( sizeof(struct win_scroll_bar_info) )))
+        {
+            /* Set default values */
+            win_info->horz.minVal = 0;
+            win_info->horz.curVal = 0;
+            win_info->horz.page = 0;
+            /* From MSDN and our own tests:
+             * max for a standard scroll bar is 100 by default. */
+            win_info->horz.maxVal = 100;
+            win_info->horz.flags  = ESB_ENABLE_BOTH;
+            win_info->vert = win_info->horz;
+            win->pScroll = win_info;
+            info = bar == SB_HORZ ? &win_info->horz : &win_info->vert;
+        }
+    }
+
+    if (info) user_lock();
+    release_win_ptr( win );
+    return info;
 }
 
 static void release_scroll_info_ptr( struct scroll_info *info )
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index de4779aee59..e7ccbf7a928 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -4662,7 +4662,7 @@ static void free_window_handle( HWND hwnd )
         }
         SERVER_END_REQ;
         user_unlock();
-        if (user_callbacks) user_callbacks->free_win_ptr( win );
+        free( win->pScroll );
         free( win->text );
         free( win );
     }
@@ -4865,7 +4865,7 @@ void destroy_thread_windows(void)
             register_window_surface( win->surface, NULL );
             window_surface_release( win->surface );
         }
-        if (user_callbacks) user_callbacks->free_win_ptr( win );
+        free( win->pScroll );
         free( win->text );
         free( win );
     }
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/374



More information about the wine-devel mailing list