From 41eac6e25c767e3dba979ad15748b61b7dada17d Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 3 Dec 2021 12:56:30 +0100 Subject: [PATCH] win32u: Use NtUserCallOneParam instead of GDIRealizePalette. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/dc.c | 10 +++++++--- dlls/win32u/gdiobj.c | 2 +- dlls/win32u/ntgdi_private.h | 1 + dlls/win32u/palette.c | 7 ++++--- dlls/win32u/sysparams.c | 18 ++++++++++++++++++ dlls/win32u/win32u.spec | 3 +-- dlls/win32u/win32u_private.h | 3 +-- dlls/win32u/wrappers.c | 10 +++++----- include/ntuser.h | 8 ++++++++ 9 files changed, 46 insertions(+), 16 deletions(-) diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 1511c565194..705593ac6f7 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -22,7 +22,7 @@ */ #include "gdi_private.h" -#include "winternl.h" +#include "ntuser.h" #include "ddrawgdi.h" #include "winnls.h" @@ -2090,12 +2090,16 @@ BOOL WINAPI ScaleWindowExtEx( HDC hdc, INT x_num, INT x_denom, return NtGdiScaleWindowExtEx( hdc, x_num, x_denom, y_num, y_denom, size ); } +static UINT WINAPI realize_palette( HDC hdc ) +{ + return NtUserCallOneParam( HandleToUlong(hdc), NtUserRealizePalette ); +} + /* Pointers to USER implementation of SelectPalette/RealizePalette */ /* they will be patched by USER on startup */ extern HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg ); -extern UINT WINAPI GDIRealizePalette( HDC hdc ); HPALETTE (WINAPI *pfnSelectPalette)( HDC hdc, HPALETTE hpal, WORD bkgnd ) = GDISelectPalette; -UINT (WINAPI *pfnRealizePalette)( HDC hdc ) = GDIRealizePalette; +UINT (WINAPI *pfnRealizePalette)( HDC hdc ) = realize_palette; /*********************************************************************** * SelectPalette (GDI32.@) diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index e68c9126cd6..3dc87509313 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1168,6 +1168,7 @@ static struct unix_funcs unix_funcs = NtGdiUpdateColors, NtGdiWidenPath, NtUserActivateKeyboardLayout, + NtUserCallOneParam, NtUserCallTwoParam, NtUserChangeDisplaySettings, NtUserCountClipboardFormats, @@ -1187,7 +1188,6 @@ static struct unix_funcs unix_funcs = NtUserUnregisterHotKey, NtUserVkKeyScanEx, - GDIRealizePalette, GDISelectPalette, GetDCHook, MirrorRgn, diff --git a/dlls/win32u/ntgdi_private.h b/dlls/win32u/ntgdi_private.h index 8aaf8ba231d..0244882ce3e 100644 --- a/dlls/win32u/ntgdi_private.h +++ b/dlls/win32u/ntgdi_private.h @@ -403,6 +403,7 @@ extern HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg) DECL extern HPALETTE PALETTE_Init(void) DECLSPEC_HIDDEN; extern UINT get_palette_entries( HPALETTE hpalette, UINT start, UINT count, PALETTEENTRY *entries ) DECLSPEC_HIDDEN; +extern UINT realize_palette( HDC hdc ) DECLSPEC_HIDDEN; /* pen.c */ extern HPEN create_pen( INT style, INT width, COLORREF color ) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/palette.c b/dlls/win32u/palette.c index 8e9e51295bb..b59a196caff 100644 --- a/dlls/win32u/palette.c +++ b/dlls/win32u/palette.c @@ -539,16 +539,17 @@ HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg) /*********************************************************************** - * GDIRealizePalette (Not a Windows API) + * realize_palette */ -UINT WINAPI GDIRealizePalette( HDC hdc ) +UINT realize_palette( HDC hdc ) { UINT realized = 0; DC* dc = get_dc_ptr( hdc ); + TRACE( "%p\n", hdc ); if (!dc) return 0; - TRACE("%p...\n", hdc ); + /* FIXME: move primary palette handling from user32 */ if( dc->hPalette == get_stock_object( DEFAULT_PALETTE )) { diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index e0de4edc6e5..095a6cfe680 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1657,6 +1657,24 @@ void sysparams_init(void) } } +/*********************************************************************** + * NtUserCallOneParam (win32u.@) + */ +ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) +{ + switch(code) + { + case NtUserRealizePalette: + return realize_palette( UlongToHandle(arg) ); + default: + FIXME( "invalid code %u\n", code ); + return 0; + } +} + +/*********************************************************************** + * NtUserCallTwoParam (win32u.@) + */ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ) { switch(code) diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 8499d52e32c..8d1a1bbb234 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -779,7 +779,7 @@ @ stub NtUserCallMsgFilter @ stub NtUserCallNextHookEx @ stub NtUserCallNoParam -@ stub NtUserCallOneParam +@ stdcall NtUserCallOneParam(long long) @ stdcall NtUserCallTwoParam(long long long) @ stub NtUserCanBrokerForceForeground @ stub NtUserChangeClipboardChain @@ -1325,7 +1325,6 @@ @ stdcall SetDCHook(long ptr long) @ stdcall SetHookFlags(long long) @ stdcall GDISelectPalette(long long long) -@ stdcall GDIRealizePalette(long) @ cdecl __wine_make_gdi_object_system(long long) @ cdecl __wine_set_visible_region(long long ptr ptr ptr) diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 7fbc92cde7b..d6454b7ad47 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -195,6 +195,7 @@ struct unix_funcs BOOL (WINAPI *pNtGdiUpdateColors)( HDC hdc ); BOOL (WINAPI *pNtGdiWidenPath)( HDC hdc ); HKL (WINAPI *pNtUserActivateKeyboardLayout)( HKL layout, UINT flags ); + ULONG_PTR (WINAPI *pNtUserCallOneParam)( ULONG_PTR arg, ULONG code ); ULONG_PTR (WINAPI *pNtUserCallTwoParam)( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ); LONG (WINAPI *pNtUserChangeDisplaySettings)( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ); @@ -221,7 +222,6 @@ struct unix_funcs WORD (WINAPI *pNtUserVkKeyScanEx)( WCHAR chr, HKL layout ); /* Wine-specific functions */ - UINT (WINAPI *pGDIRealizePalette)( HDC hdc ); HPALETTE (WINAPI *pGDISelectPalette)( HDC hdc, HPALETTE hpal, WORD bkg ); DWORD_PTR (WINAPI *pGetDCHook)( HDC hdc, DCHOOKPROC *proc ); BOOL (WINAPI *pMirrorRgn)( HWND hwnd, HRGN hrgn ); @@ -241,7 +241,6 @@ struct unix_funcs struct window_surface *surface ); }; -UINT WINAPI GDIRealizePalette( HDC hdc ); HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg ); extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index a9a72eaa903..1ea45e42c21 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -601,6 +601,11 @@ HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags ) return unix_funcs->pNtUserActivateKeyboardLayout( layout, flags ); } +ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) +{ + return unix_funcs->pNtUserCallOneParam( arg, code ); +} + ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ) { return unix_funcs->pNtUserCallTwoParam( arg1, arg2, code ); @@ -697,11 +702,6 @@ WORD WINAPI NtUserVkKeyScanEx( WCHAR chr, HKL layout ) return unix_funcs->pNtUserVkKeyScanEx( chr, layout ); } -UINT WINAPI GDIRealizePalette( HDC hdc ) -{ - return unix_funcs->pGDIRealizePalette( hdc ); -} - HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD bkg ) { return unix_funcs->pGDISelectPalette( hdc, hpal, bkg ); diff --git a/include/ntuser.h b/include/ntuser.h index 3904daf5a82..3edfeab188e 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -39,6 +39,12 @@ struct enum_display_monitor_params LPARAM lparam; }; +/* NtUserCallOneParam codes, not compatible with Windows */ +enum +{ + NtUserRealizePalette, +}; + /* NtUserCallTwoParam codes, not compatible with Windows */ enum { @@ -78,6 +84,7 @@ C_ASSERT( sizeof(struct user_thread_info) <= sizeof(((TEB *)0)->Win32ClientInfo) HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags ); BOOL WINAPI NtUserAddClipboardFormatListener( HWND hwnd ); BOOL WINAPI NtUserAttachThreadInput( DWORD from, DWORD to, BOOL attach ); +ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ); ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ); LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ); @@ -128,6 +135,7 @@ BOOL WINAPI NtUserRemoveClipboardFormatListener( HWND hwnd ); HANDLE WINAPI NtUserRemoveProp( HWND hwnd, const WCHAR *str ); BOOL WINAPI NtUserScrollDC( HDC hdc, INT dx, INT dy, const RECT *scroll, const RECT *clip, HRGN ret_update_rgn, RECT *update_rect ); +HPALETTE WINAPI NtUserSelectPalette( HDC hdc, HPALETTE palette, WORD force_background ); BOOL WINAPI NtUserSetKeyboardState( BYTE *state ); BOOL WINAPI NtUserSetProcessWindowStation( HWINSTA handle ); BOOL WINAPI NtUserSetProp( HWND hwnd, const WCHAR *str, HANDLE handle );