[PATCH 4/8] win32u: Move process default layout handling from user32.
Jacek Caban
wine at gitlab.winehq.org
Wed Jun 15 06:44:35 CDT 2022
From: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
dlls/user32/class.c | 4 ++++
dlls/user32/win.c | 20 ++++----------------
dlls/win32u/sysparams.c | 8 ++++++++
dlls/win32u/win32u_private.h | 1 +
dlls/win32u/window.c | 1 +
include/ntuser.h | 12 ++++++++++++
6 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 620477f1b14..76e2688bb82 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -309,6 +309,8 @@ static void load_uxtheme(void)
*/
BOOL WINAPI User32RegisterBuiltinClasses( const struct win_hook_params *params, ULONG size )
{
+ DWORD layout;
+
register_builtin( &BUTTON_builtin_class );
register_builtin( &COMBO_builtin_class );
register_builtin( &COMBOLBOX_builtin_class );
@@ -322,6 +324,8 @@ BOOL WINAPI User32RegisterBuiltinClasses( const struct win_hook_params *params,
register_builtin( &STATIC_builtin_class );
register_builtin( &IME_builtin_class );
+ GetProcessDefaultLayout( &layout ); /* make sure that process layout is initialized */
+
/* Load uxtheme.dll so that standard scrollbars and dialogs are hooked for theming support */
load_uxtheme();
return TRUE;
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 99753791f09..9d19376fe44 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -36,8 +36,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(win);
-static DWORD process_layout = ~0u;
-
/***********************************************************************
* get_user_handle_ptr
@@ -626,15 +624,6 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
}
}
- /* FIXME: move to win32u */
- if (!cs->hwndParent && className != (const WCHAR *)DESKTOP_CLASS_ATOM &&
- (IS_INTRESOURCE(className) || wcsicmp( className, L"Message" )))
- {
- DWORD layout;
- GetProcessDefaultLayout( &layout );
- if (layout & LAYOUT_RTL) cs->dwExStyle |= WS_EX_LAYOUTRTL;
- }
-
menu = cs->hMenu;
if (!menu && info.lpszMenuName && (cs->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
menu = LoadMenuW( cs->hInstance, info.lpszMenuName );
@@ -1610,7 +1599,8 @@ BOOL WINAPI GetProcessDefaultLayout( DWORD *layout )
SetLastError( ERROR_NOACCESS );
return FALSE;
}
- if (process_layout == ~0u)
+ *layout = NtUserGetProcessDefaultLayout();
+ if (*layout == ~0u)
{
WCHAR *str, buffer[MAX_PATH];
DWORD i, version_layout = 0;
@@ -1640,9 +1630,8 @@ BOOL WINAPI GetProcessDefaultLayout( DWORD *layout )
done:
HeapFree( GetProcessHeap(), 0, data );
- process_layout = version_layout;
+ NtUserSetProcessDefaultLayout( *layout = version_layout );
}
- *layout = process_layout;
return TRUE;
}
@@ -1654,8 +1643,7 @@ BOOL WINAPI GetProcessDefaultLayout( DWORD *layout )
*/
BOOL WINAPI SetProcessDefaultLayout( DWORD layout )
{
- process_layout = layout;
- return TRUE;
+ return NtUserSetProcessDefaultLayout( layout );
}
#ifdef _WIN64
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 1c1d9ddc621..d4ab352ccbd 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -360,6 +360,7 @@ union sysparam_all_entry
static UINT system_dpi;
static RECT work_area;
+DWORD process_layout = ~0u;
static HDC display_dc;
static pthread_mutex_t display_dc_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -4714,6 +4715,9 @@ ULONG_PTR WINAPI NtUserCallNoParam( ULONG code )
case NtUserCallNoParam_GetInputState:
return get_input_state();
+ case NtUserCallNoParam_GetProcessDefaultLayout:
+ return process_layout;
+
case NtUserCallNoParam_ReleaseCapture:
return release_capture();
@@ -4805,6 +4809,10 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code )
case NtUserCallOneParam_SetCaretBlinkTime:
return set_caret_blink_time( arg );
+ case NtUserCallOneParam_SetProcessDefaultLayout:
+ process_layout = arg;
+ return TRUE;
+
/* temporary exports */
case NtUserCallHooks:
{
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index d1bc382f031..23343c413dc 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -424,6 +424,7 @@ extern LRESULT send_message_timeout( HWND hwnd, UINT msg, WPARAM wparam, LPARAM
/* sysparams.c */
extern BOOL enable_thunk_lock DECLSPEC_HIDDEN;
+extern DWORD process_layout DECLSPEC_HIDDEN;
extern HBRUSH get_55aa_brush(void) DECLSPEC_HIDDEN;
extern DWORD get_dialog_base_units(void) DECLSPEC_HIDDEN;
extern LONG get_char_dimensions( HDC hdc, TEXTMETRICW *metric, LONG *height ) DECLSPEC_HIDDEN;
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 5575b9a0381..431686bdcaa 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -5126,6 +5126,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name,
(class_name->Length != sizeof(messageW) ||
wcsnicmp( class_name->Buffer, messageW, ARRAYSIZE(messageW) )))
{
+ if (process_layout & LAYOUT_RTL) cs.dwExStyle |= WS_EX_LAYOUTRTL;
parent = get_desktop_window();
}
}
diff --git a/include/ntuser.h b/include/ntuser.h
index cf8a909493b..1f3cc2f2e7e 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -725,6 +725,7 @@ enum
NtUserCallNoParam_GetDesktopWindow,
NtUserCallNoParam_GetDialogBaseUnits,
NtUserCallNoParam_GetInputState,
+ NtUserCallNoParam_GetProcessDefaultLayout,
NtUserCallNoParam_ReleaseCapture,
/* temporary exports */
NtUserExitingThread,
@@ -751,6 +752,11 @@ static inline BOOL NtUserGetInputState(void)
return NtUserCallNoParam( NtUserCallNoParam_GetInputState );
}
+static inline DWORD NtUserGetProcessDefaultLayout(void)
+{
+ return NtUserCallNoParam( NtUserCallNoParam_GetProcessDefaultLayout );
+}
+
static inline BOOL NtUserReleaseCapture(void)
{
return NtUserCallNoParam( NtUserCallNoParam_ReleaseCapture );
@@ -780,6 +786,7 @@ enum
NtUserCallOneParam_MessageBeep,
NtUserCallOneParam_RealizePalette,
NtUserCallOneParam_SetCaretBlinkTime,
+ NtUserCallOneParam_SetProcessDefaultLayout,
/* temporary exports */
NtUserCallHooks,
NtUserGetDeskPattern,
@@ -898,6 +905,11 @@ static inline UINT NtUserRealizePalette( HDC hdc )
return NtUserCallOneParam( HandleToUlong(hdc), NtUserCallOneParam_RealizePalette );
}
+static inline UINT NtUserSetProcessDefaultLayout( DWORD layout )
+{
+ return NtUserCallOneParam( layout, NtUserCallOneParam_SetProcessDefaultLayout );
+}
+
/* NtUserCallTwoParam codes, not compatible with Windows */
enum
{
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/250
More information about the wine-devel
mailing list