From 170cb0d9306387dd07d964921dc7f99e44050fba Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 11 Nov 2021 14:13:45 +0100 Subject: [PATCH] win32u: Move NtUserCountClipboardFormats implementation from user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/clipboard.c | 23 +-------------- dlls/user32/user32.spec | 2 +- dlls/win32u/Makefile.in | 1 + dlls/win32u/clipboard.c | 55 ++++++++++++++++++++++++++++++++++++ dlls/win32u/driver.c | 34 +++++++++++++++++++--- dlls/win32u/gdiobj.c | 1 + dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 3 ++ dlls/win32u/wrappers.c | 5 ++++ include/ntuser.h | 1 + 10 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 dlls/win32u/clipboard.c diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index a13085719a9..b9bcc184ca1 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -926,27 +926,6 @@ done: } -/************************************************************************** - * CountClipboardFormats (USER32.@) - */ -INT WINAPI CountClipboardFormats(void) -{ - INT count = 0; - - USER_Driver->pUpdateClipboard(); - - SERVER_START_REQ( get_clipboard_formats ) - { - wine_server_call( req ); - count = reply->count; - } - SERVER_END_REQ; - - TRACE("returning %d\n", count); - return count; -} - - /************************************************************************** * EnumClipboardFormats (USER32.@) */ @@ -1107,7 +1086,7 @@ INT WINAPI GetPriorityClipboardFormat(UINT *list, INT nCount) TRACE( "%p %u\n", list, nCount ); - if(CountClipboardFormats() == 0) + if (NtUserCountClipboardFormats() == 0) return 0; for (i = 0; i < nCount; i++) diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index e6906f025b7..87f4dc468bf 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -83,7 +83,7 @@ @ stdcall CopyIcon(long) @ stdcall CopyImage(long long long long long) @ stdcall CopyRect(ptr ptr) -@ stdcall CountClipboardFormats() +@ stdcall CountClipboardFormats() NtUserCountClipboardFormats @ stdcall CreateAcceleratorTableA(ptr long) @ stdcall CreateAcceleratorTableW(ptr long) @ stdcall CreateCaret(long long long long) diff --git a/dlls/win32u/Makefile.in b/dlls/win32u/Makefile.in index 92e1858b9bc..306a3302260 100644 --- a/dlls/win32u/Makefile.in +++ b/dlls/win32u/Makefile.in @@ -11,6 +11,7 @@ C_SRCS = \ bitblt.c \ bitmap.c \ brush.c \ + clipboard.c \ clipping.c \ dc.c \ dib.c \ diff --git a/dlls/win32u/clipboard.c b/dlls/win32u/clipboard.c new file mode 100644 index 00000000000..8d0e09fdb55 --- /dev/null +++ b/dlls/win32u/clipboard.c @@ -0,0 +1,55 @@ +/* + * WIN32 clipboard implementation + * + * Copyright 1994 Martin Ayotte + * Copyright 1996 Alex Korobka + * Copyright 1999 Noel Borthwick + * Copyright 2003 Ulrich Czekalla for CodeWeavers + * Copyright 2016 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#if 0 +#pragma makedep unix +#endif + +#include "win32u_private.h" +#include "wine/server.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(clipboard); + + +/************************************************************************** + * NtUserCountClipboardFormats (win32u.@) + */ +INT WINAPI NtUserCountClipboardFormats(void) +{ + INT count = 0; + + user_driver->pUpdateClipboard(); + + SERVER_START_REQ( get_clipboard_formats ) + { + wine_server_call( req ); + count = reply->count; + } + SERVER_END_REQ; + + TRACE( "returning %d\n", count ); + return count; +} diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index ae83749d10f..15e7d3701f7 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -56,7 +56,7 @@ struct d3dkmt_device struct list entry; /* List entry */ }; -static const struct user_driver_funcs *user_driver; +static const struct user_driver_funcs lazy_load_driver; static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); @@ -70,9 +70,10 @@ static pthread_mutex_t driver_lock = PTHREAD_MUTEX_INITIALIZER; */ const struct gdi_dc_funcs *get_display_driver(void) { - if (!user_driver) + if (user_driver == &lazy_load_driver) { - if (!user_callbacks || !user_callbacks->pGetDesktopWindow() || !user_driver) + if (!user_callbacks || !user_callbacks->pGetDesktopWindow() || + user_driver == &lazy_load_driver) { static struct user_driver_funcs empty_funcs; WARN( "failed to load the display driver, falling back to null driver\n" ); @@ -123,7 +124,7 @@ static BOOL CDECL nulldrv_Chord( PHYSDEV dev, INT left, INT top, INT right, INT static BOOL CDECL nulldrv_CreateCompatibleDC( PHYSDEV orig, PHYSDEV *pdev ) { - if (!user_driver || !user_driver->dc_funcs.pCreateCompatibleDC) return TRUE; + if (!user_driver->dc_funcs.pCreateCompatibleDC) return TRUE; return user_driver->dc_funcs.pCreateCompatibleDC( NULL, pdev ); } @@ -989,6 +990,31 @@ static void CDECL nulldrv_ThreadDetach( void ) { } +/********************************************************************** + * Lazy loading user driver + * + * Initial driver used before another driver is loaded. + * Each entry point simply loads the real driver and chains to it. + */ + +static const struct user_driver_funcs *load_driver(void) +{ + get_display_driver(); + return user_driver; +} + +static void CDECL loaderdrv_UpdateClipboard(void) +{ + load_driver()->pUpdateClipboard(); +} + +static const struct user_driver_funcs lazy_load_driver = +{ + .pUpdateClipboard = loaderdrv_UpdateClipboard, +}; + +const struct user_driver_funcs *user_driver = &lazy_load_driver; + /****************************************************************************** * __wine_set_display_driver (win32u.@) */ diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index c8dae928340..4737aa30cd2 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1167,6 +1167,7 @@ static struct unix_funcs unix_funcs = NtGdiUnrealizeObject, NtGdiUpdateColors, NtGdiWidenPath, + NtUserCountClipboardFormats, GDIRealizePalette, GDISelectPalette, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 8327e588b77..daea9cfe21a 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -803,7 +803,7 @@ @ stub NtUserConsoleControl @ stub NtUserConvertMemHandle @ stub NtUserCopyAcceleratorTable -@ stub NtUserCountClipboardFormats +@ stdcall NtUserCountClipboardFormats() @ stub NtUserCreateAcceleratorTable @ stub NtUserCreateActivationGroup @ stub NtUserCreateActivationObject diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index de3c69b9ed4..a78c7bb906b 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -194,6 +194,7 @@ struct unix_funcs BOOL (WINAPI *pNtGdiUnrealizeObject)( HGDIOBJ obj ); BOOL (WINAPI *pNtGdiUpdateColors)( HDC hdc ); BOOL (WINAPI *pNtGdiWidenPath)( HDC hdc ); + INT (WINAPI *pNtUserCountClipboardFormats)(void); /* Wine-specific functions */ UINT (WINAPI *pGDIRealizePalette)( HDC hdc ); @@ -229,6 +230,8 @@ extern HKEY reg_open_key( HKEY root, const WCHAR *name, ULONG name_len ) DECLSPE extern ULONG query_reg_ascii_value( HKEY hkey, const char *name, KEY_VALUE_PARTIAL_INFORMATION *info, ULONG size ) DECLSPEC_HIDDEN; +extern const struct user_driver_funcs *user_driver DECLSPEC_HIDDEN; + static inline WCHAR *win32u_wcsrchr( const WCHAR *str, WCHAR ch ) { WCHAR *ret = NULL; diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 922723903b9..d236fb6b2db 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -596,6 +596,11 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER return unix_funcs->pNtGdiDdDDISetVidPnSourceOwner( desc ); } +INT WINAPI NtUserCountClipboardFormats(void) +{ + return unix_funcs->pNtUserCountClipboardFormats(); +} + UINT WINAPI GDIRealizePalette( HDC hdc ) { return unix_funcs->pGDIRealizePalette( hdc ); diff --git a/include/ntuser.h b/include/ntuser.h index c05c743b553..de493b7a6d7 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -25,6 +25,7 @@ BOOL WINAPI NtUserCloseDesktop( HDESK handle ); BOOL WINAPI NtUserCloseWindowStation( HWINSTA handle ); +INT WINAPI NtUserCountClipboardFormats(void); HDESK WINAPI NtUserCreateDesktopEx( OBJECT_ATTRIBUTES *attr, UNICODE_STRING *device, DEVMODEW *devmode, DWORD flags, ACCESS_MASK access, ULONG heap_size );