[PATCH v2 6/7] win32u: Move get_scroll_info_ptr implementation from user32.
Jacek Caban
wine at gitlab.winehq.org
Tue Jul 5 02:08:36 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 54517311731..9453df9dedd 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