Jacek Caban : win32u: Move register_desktop_class implementation from user32.
Alexandre Julliard
julliard at winehq.org
Mon Aug 8 15:17:51 CDT 2022
Module: wine
Branch: master
Commit: fc0753f9184ba36ac87b42a1ee4f8b6febed8f68
URL: https://gitlab.winehq.org/wine/wine/-/commit/fc0753f9184ba36ac87b42a1ee4f8b6febed8f68
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jul 29 20:33:22 2022 +0200
win32u: Move register_desktop_class implementation from user32.
---
dlls/user32/class.c | 10 ------
dlls/user32/controls.h | 3 --
dlls/user32/desktop.c | 14 ---------
dlls/user32/message.c | 12 --------
dlls/user32/user_main.c | 1 -
dlls/win32u/class.c | 73 ++++++++++++++++++++++++++++++++++++++++++++
dlls/win32u/ntuser_private.h | 1 +
dlls/win32u/syscall.c | 2 ++
8 files changed, 76 insertions(+), 40 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index c18e48b257a..bb81e4551bc 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -332,16 +332,6 @@ BOOL WINAPI User32RegisterBuiltinClasses( const struct win_hook_params *params,
}
-/***********************************************************************
- * register_desktop_class
- */
-void register_desktop_class(void)
-{
- register_builtin( &DESKTOP_builtin_class );
- register_builtin( &MESSAGE_builtin_class );
-}
-
-
/***********************************************************************
* RegisterClassA (USER32.@)
*
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index a6c45ca1652..b004413113b 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -39,13 +39,11 @@ extern const struct builtin_class_descr BUTTON_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr COMBO_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr COMBOLBOX_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr DIALOG_builtin_class DECLSPEC_HIDDEN;
-extern const struct builtin_class_descr DESKTOP_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr EDIT_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr ICONTITLE_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr LISTBOX_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr MDICLIENT_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr MENU_builtin_class DECLSPEC_HIDDEN;
-extern const struct builtin_class_descr MESSAGE_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr SCROLL_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr STATIC_builtin_class DECLSPEC_HIDDEN;
extern const struct builtin_class_descr IME_builtin_class DECLSPEC_HIDDEN;
@@ -102,7 +100,6 @@ extern LRESULT StaticWndProc_common(HWND,UINT,WPARAM,LPARAM,BOOL) DECLSPEC_HIDDE
/* Class functions */
extern ATOM get_int_atom_value( UNICODE_STRING *name ) DECLSPEC_HIDDEN;
-extern void register_desktop_class(void) DECLSPEC_HIDDEN;
/* desktop */
extern BOOL update_wallpaper( const WCHAR *wallpaper, const WCHAR *pattern ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/desktop.c b/dlls/user32/desktop.c
index ca000972bc4..377c21d4f48 100644
--- a/dlls/user32/desktop.c
+++ b/dlls/user32/desktop.c
@@ -34,20 +34,6 @@ static SIZE bitmapSize;
static BOOL fTileWallPaper;
-/*********************************************************************
- * desktop class descriptor
- */
-const struct builtin_class_descr DESKTOP_builtin_class =
-{
- (LPCWSTR)DESKTOP_CLASS_ATOM, /* name */
- CS_DBLCLKS, /* style */
- WINPROC_DESKTOP, /* proc */
- 0, /* extra */
- 0, /* cursor */
- (HBRUSH)(COLOR_BACKGROUND+1) /* brush */
-};
-
-
/***********************************************************************
* DESKTOP_LoadBitmap
*/
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 65aa93d858c..42cab89da05 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -47,18 +47,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msg);
-/* Message class descriptor */
-const struct builtin_class_descr MESSAGE_builtin_class =
-{
- L"Message", /* name */
- 0, /* style */
- WINPROC_MESSAGE, /* proc */
- 0, /* extra */
- 0, /* cursor */
- 0 /* brush */
-};
-
-
/* pack a pointer into a 32/64 portable format */
static inline ULONGLONG pack_ptr( const void *ptr )
{
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index acbd93cccdd..133a7457bfd 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -220,7 +220,6 @@ static BOOL process_attach(void)
dpiaware_init();
winproc_init();
- register_desktop_class();
/* Initialize system colors and metrics */
SYSPARAMS_Init();
diff --git a/dlls/win32u/class.c b/dlls/win32u/class.c
index eab65b72ef6..84e923c5b0c 100644
--- a/dlls/win32u/class.c
+++ b/dlls/win32u/class.c
@@ -60,6 +60,17 @@ typedef struct tagCLASS
struct client_menu_name menu_name; /* Default menu name */
} CLASS;
+/* Built-in class descriptor */
+struct builtin_class_descr
+{
+ const char *name; /* class name */
+ UINT style; /* class style */
+ INT extra; /* window extra bytes */
+ ULONG_PTR cursor; /* cursor id */
+ HBRUSH brush; /* brush or system color */
+ enum builtin_winprocs proc;
+};
+
typedef struct tagWINDOWPROC
{
WNDPROC procA; /* ANSI window proc */
@@ -1050,6 +1061,59 @@ BOOL needs_ime_window( HWND hwnd )
return ret;
}
+static const struct builtin_class_descr desktop_builtin_class =
+{
+ .name = MAKEINTRESOURCEA(DESKTOP_CLASS_ATOM),
+ .style = CS_DBLCLKS,
+ .proc = WINPROC_DESKTOP,
+ .brush = (HBRUSH)(COLOR_BACKGROUND + 1),
+};
+
+static const struct builtin_class_descr message_builtin_class =
+{
+ .name = "Message",
+ .proc = WINPROC_MESSAGE,
+};
+
+/***********************************************************************
+ * register_builtin
+ *
+ * Register a builtin control class.
+ * This allows having both ANSI and Unicode winprocs for the same class.
+ */
+static void register_builtin( const struct builtin_class_descr *descr )
+{
+ UNICODE_STRING name, version = { .Length = 0 };
+ struct client_menu_name menu_name = { 0 };
+ WCHAR nameW[64];
+ WNDCLASSEXW class = {
+ .cbSize = sizeof(class),
+ .hInstance = user32_module,
+ .style = descr->style,
+ .cbWndExtra = descr->extra,
+ .hbrBackground = descr->brush,
+ .lpfnWndProc = BUILTIN_WINPROC( descr->proc ),
+ };
+
+ if (descr->cursor)
+ class.hCursor = LoadImageW( 0, (const WCHAR *)descr->cursor, IMAGE_CURSOR,
+ 0, 0, LR_SHARED | LR_DEFAULTSIZE );
+
+ if (IS_INTRESOURCE( descr->name ))
+ {
+ name.Buffer = (WCHAR *)descr->name;
+ name.Length = name.MaximumLength = 0;
+ }
+ else
+ {
+ asciiz_to_unicode( nameW, descr->name );
+ RtlInitUnicodeString( &name, nameW );
+ }
+
+ if (!NtUserRegisterClassExWOW( &class, &name, &version, &menu_name, 1, 0, NULL ) && class.hCursor)
+ NtUserDestroyCursor( class.hCursor, 0 );
+}
+
static void register_builtins(void)
{
void *ret_ptr;
@@ -1065,3 +1129,12 @@ void register_builtin_classes(void)
static pthread_once_t init_once = PTHREAD_ONCE_INIT;
pthread_once( &init_once, register_builtins );
}
+
+/***********************************************************************
+ * register_desktop_class
+ */
+void register_desktop_class(void)
+{
+ register_builtin( &desktop_builtin_class );
+ register_builtin( &message_builtin_class );
+}
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index 3ecd7424f77..e068ff849f3 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -249,6 +249,7 @@ struct dce *get_class_dce( struct tagCLASS *class ) DECLSPEC_HIDDEN;
struct dce *set_class_dce( struct tagCLASS *class, struct dce *dce ) DECLSPEC_HIDDEN;
BOOL needs_ime_window( HWND hwnd ) DECLSPEC_HIDDEN;
extern void register_builtin_classes(void) DECLSPEC_HIDDEN;
+extern void register_desktop_class(void) DECLSPEC_HIDDEN;
/* cursoricon.c */
HICON alloc_cursoricon_handle( BOOL is_icon ) DECLSPEC_HIDDEN;
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 532c08ef2e0..e36e7097047 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -29,6 +29,7 @@
#include "windef.h"
#include "winnt.h"
#include "ntgdi_private.h"
+#include "ntuser_private.h"
#include "ntuser.h"
#include "wine/unixlib.h"
@@ -318,6 +319,7 @@ static NTSTATUS init( void *dispatcher )
if ((status = gdi_init())) return status;
winstation_init();
sysparams_init();
+ register_desktop_class();
return STATUS_SUCCESS;
}
More information about the wine-cvs
mailing list