From: Baruch Rutman Date: Sat, 20 Oct 2018 08:53:14 +0000 (+0300) Subject: [NTUSER] Fix SetProcessDefaultLayout() (#1013) X-Git-Tag: 0.4.13-dev~760 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=123a7c80e0cc5f0d5736ab39464823473aa8a6a6 [NTUSER] Fix SetProcessDefaultLayout() (#1013) - Add a check in co_UserCreateWindowEx() for parentless windows, that checks the default layout direction; if it's LAYOUT_RTL add the WS_EX_LAYOUTRTL flag to the extended window styles. - Make the internal routine accepting also LAYOUT_LTR as a value for SetProcessDefaultLayout(). Limit receiving value to LAYOUT_ORIENTATIONMASK (and not just LAYOUT_RTL) or LAYOUT_LTR, as per written in: https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdefaultlayout Now all the applications that call SetProcessDefaultLayout() to mirror the layout get mirrored. This is based on Wine. --- diff --git a/win32ss/user/ntuser/simplecall.c b/win32ss/user/ntuser/simplecall.c index 179d58bcdec..67377de4a8c 100644 --- a/win32ss/user/ntuser/simplecall.c +++ b/win32ss/user/ntuser/simplecall.c @@ -342,7 +342,7 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT: { PPROCESSINFO ppi; - if (Param & LAYOUT_ORIENTATIONMASK) + if (Param & LAYOUT_ORIENTATIONMASK || Param == LAYOUT_LTR) { ppi = PsGetCurrentProcessWin32Process(); ppi->dwLayout = Param; diff --git a/win32ss/user/ntuser/window.c b/win32ss/user/ntuser/window.c index 7d6ac871558..a557c4d3387 100644 --- a/win32ss/user/ntuser/window.c +++ b/win32ss/user/ntuser/window.c @@ -2017,6 +2017,16 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, EngSetLastError(ERROR_TLW_WITH_WSCHILD); goto cleanup; /* WS_CHILD needs a parent, but WS_POPUP doesn't */ } + else if (Cs->lpszClass != (LPCWSTR)MAKEINTATOM(gpsi->atomSysClass[ICLS_DESKTOP]) && + (IS_INTRESOURCE(Cs->lpszClass) || + Cs->lpszClass != (LPCWSTR)MAKEINTATOM(gpsi->atomSysClass[ICLS_HWNDMESSAGE]) || + _wcsicmp(Cs->lpszClass, L"Message") != 0)) + { + if (pti->ppi->dwLayout & LAYOUT_RTL) + { + Cs->dwExStyle |= WS_EX_LAYOUTRTL; + } + } ParentWindow = hWndParent ? UserGetWindowObject(hWndParent): NULL; OwnerWindow = hWndOwner ? UserGetWindowObject(hWndOwner): NULL;