Jacek Caban : win32u: Move primary palette handling from user32.
Alexandre Julliard
julliard at winehq.org
Thu Feb 17 15:33:59 CST 2022
Module: wine
Branch: master
Commit: 4b0c0a6b23378d46f580591655c7e613a6808afc
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4b0c0a6b23378d46f580591655c7e613a6808afc
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 17 15:43:40 2022 +0100
win32u: Move primary palette handling from user32.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/user_main.c | 72 +++-----------------------------------------
dlls/win32u/ntuser_private.h | 1 +
dlls/win32u/palette.c | 26 ++++++++++++++--
3 files changed, 29 insertions(+), 70 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index 8ca55b283f7..ea30772067d 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -44,10 +44,6 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
};
static CRITICAL_SECTION user_section = { &critsect_debug, -1, 0, 0, 0, 0 };
-static HPALETTE (WINAPI *pfnGDISelectPalette)( HDC hdc, HPALETTE hpal, WORD bkgnd );
-static UINT (WINAPI *pfnGDIRealizePalette)( HDC hdc );
-static HPALETTE hPrimaryPalette;
-
static DWORD exiting_thread_id;
extern void WDML_NotifyThreadDetach(void);
@@ -86,69 +82,11 @@ void USER_CheckNotLock(void)
/***********************************************************************
- * UserSelectPalette (Not a Windows API)
+ * UserRealizePalette (USER32.@)
*/
-static HPALETTE WINAPI UserSelectPalette( HDC hDC, HPALETTE hPal, BOOL bForceBackground )
+UINT WINAPI UserRealizePalette( HDC hdc )
{
- WORD wBkgPalette = 1;
-
- if (!bForceBackground && (hPal != GetStockObject(DEFAULT_PALETTE)))
- {
- HWND hwnd = WindowFromDC( hDC );
- if (hwnd)
- {
- HWND hForeground = NtUserGetForegroundWindow();
- /* set primary palette if it's related to current active */
- if (hForeground == hwnd || IsChild(hForeground,hwnd))
- {
- wBkgPalette = 0;
- hPrimaryPalette = hPal;
- }
- }
- }
- return pfnGDISelectPalette( hDC, hPal, wBkgPalette);
-}
-
-
-/***********************************************************************
- * UserRealizePalette (USER32.@)
- */
-UINT WINAPI UserRealizePalette( HDC hDC )
-{
- UINT realized = pfnGDIRealizePalette( hDC );
-
- /* do not send anything if no colors were changed */
- if (realized && GetCurrentObject( hDC, OBJ_PAL ) == hPrimaryPalette)
- {
- /* send palette change notification */
- HWND hWnd = WindowFromDC( hDC );
- if (hWnd) SendMessageTimeoutW( HWND_BROADCAST, WM_PALETTECHANGED, (WPARAM)hWnd, 0,
- SMTO_ABORTIFHUNG, 2000, NULL );
- }
- return realized;
-}
-
-
-/***********************************************************************
- * palette_init
- *
- * Patch the function pointers in GDI for SelectPalette and RealizePalette
- */
-static void palette_init(void)
-{
- void **ptr;
- HMODULE module = GetModuleHandleA( "gdi32" );
- if (!module)
- {
- ERR( "cannot get GDI32 handle\n" );
- return;
- }
- if ((ptr = (void**)GetProcAddress( module, "pfnSelectPalette" )))
- pfnGDISelectPalette = InterlockedExchangePointer( ptr, UserSelectPalette );
- else ERR( "cannot find pfnSelectPalette in GDI32\n" );
- if ((ptr = (void**)GetProcAddress( module, "pfnRealizePalette" )))
- pfnGDIRealizePalette = InterlockedExchangePointer( ptr, UserRealizePalette );
- else ERR( "cannot find pfnRealizePalette in GDI32\n" );
+ return NtUserCallOneParam( HandleToUlong(hdc), NtUserRealizePalette );
}
@@ -212,6 +150,7 @@ static const struct user_callbacks user_funcs =
{
GetDesktopWindow,
GetWindowRect,
+ IsChild,
RedrawWindow,
SendMessageTimeoutW,
WindowFromDC,
@@ -240,9 +179,6 @@ static BOOL process_attach(void)
/* Initialize system colors and metrics */
SYSPARAMS_Init();
- /* Setup palette function pointers */
- palette_init();
-
return TRUE;
}
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index f0e0f8835bf..e9d19744976 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -28,6 +28,7 @@ struct user_callbacks
{
HWND (WINAPI *pGetDesktopWindow)(void);
BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
+ BOOL (WINAPI *pIsChild)( HWND, HWND );
BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
HWND (WINAPI *pWindowFromDC)( HDC );
diff --git a/dlls/win32u/palette.c b/dlls/win32u/palette.c
index 1c2f2c70434..d09fc9d4d73 100644
--- a/dlls/win32u/palette.c
+++ b/dlls/win32u/palette.c
@@ -508,12 +508,22 @@ static BOOL PALETTE_DeleteObject( HGDIOBJ handle )
*/
HPALETTE WINAPI NtUserSelectPalette( HDC hdc, HPALETTE hpal, WORD bkg )
{
+ BOOL is_primary = FALSE;
HPALETTE ret = 0;
DC *dc;
TRACE("%p %p\n", hdc, hpal );
- /* FIXME: move primary palette handling from user32 */
+ if (!bkg && hpal != get_stock_object( DEFAULT_PALETTE ))
+ {
+ HWND hwnd = user_callbacks->pWindowFromDC( hdc );
+ if (hwnd)
+ {
+ /* set primary palette if it's related to current active */
+ HWND foreground = NtUserGetForegroundWindow();
+ is_primary = foreground == hwnd || user_callbacks->pIsChild( foreground, hwnd );
+ }
+ }
if (get_gdi_object_type(hpal) != NTGDI_OBJ_PAL)
{
@@ -524,7 +534,7 @@ HPALETTE WINAPI NtUserSelectPalette( HDC hdc, HPALETTE hpal, WORD bkg )
{
ret = dc->hPalette;
dc->hPalette = hpal;
- if (!bkg) hPrimaryPalette = hpal;
+ if (is_primary) hPrimaryPalette = hpal;
release_dc_ptr( dc );
}
return ret;
@@ -536,6 +546,7 @@ HPALETTE WINAPI NtUserSelectPalette( HDC hdc, HPALETTE hpal, WORD bkg )
*/
UINT realize_palette( HDC hdc )
{
+ BOOL is_primary = FALSE;
UINT realized = 0;
DC* dc = get_dc_ptr( hdc );
@@ -559,12 +570,23 @@ UINT realize_palette( HDC hdc )
(dc->hPalette == hPrimaryPalette) );
palPtr->unrealize = physdev->funcs->pUnrealizePalette;
GDI_ReleaseObj( dc->hPalette );
+ is_primary = dc->hPalette == hPrimaryPalette;
}
}
else TRACE(" skipping (hLastRealizedPalette = %p)\n", hLastRealizedPalette);
release_dc_ptr( dc );
TRACE(" realized %i colors.\n", realized );
+
+ /* do not send anything if no colors were changed */
+ if (realized && is_primary)
+ {
+ /* send palette change notification */
+ HWND hwnd = user_callbacks->pWindowFromDC( hdc );
+ if (hwnd) user_callbacks->pSendMessageTimeoutW( HWND_BROADCAST, WM_PALETTECHANGED,
+ HandleToUlong(hwnd), 0, SMTO_ABORTIFHUNG,
+ 2000, NULL );
+ }
return realized;
}
More information about the wine-cvs
mailing list