win32u: Move NtUserInternalGetWindowText implementation from user32.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2022-03-08 14:23:37 +01:00 committed by Alexandre Julliard
parent a5ba63b80a
commit 90c13be9dd
13 changed files with 68 additions and 32 deletions

View File

@ -173,7 +173,7 @@ static inline WCHAR *get_button_text( HWND hwnd )
{
static const INT len = 512;
WCHAR *buffer = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) );
if (buffer) InternalGetWindowText( hwnd, buffer, len + 1 );
if (buffer) NtUserInternalGetWindowText( hwnd, buffer, len + 1 );
return buffer;
}

View File

@ -452,7 +452,7 @@ static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
buf[0] = '&';
buf[1] = '0' + visible;
buf[2] = ' ';
InternalGetWindowText(ci->child[i], buf + 3, ARRAY_SIZE(buf) - 3);
NtUserInternalGetWindowText(ci->child[i], buf + 3, ARRAY_SIZE(buf) - 3);
TRACE("Adding %p, id %u %s\n", ci->child[i], id, debugstr_w(buf));
AppendMenuW(ci->hWindowMenu, MF_STRING, id, buf);
@ -1911,7 +1911,7 @@ static INT_PTR WINAPI MDI_MoreWindowsDlgProc (HWND hDlg, UINT iMsg, WPARAM wPara
{
WCHAR buffer[MDI_MAXTITLELENGTH];
if (!InternalGetWindowText(ci->child[i], buffer, ARRAY_SIZE(buffer)))
if (!NtUserInternalGetWindowText(ci->child[i], buffer, ARRAY_SIZE(buffer)))
continue;
SendMessageW(hListBox, LB_ADDSTRING, 0, (LPARAM)buffer );
SendMessageW(hListBox, LB_SETITEMDATA, i, (LPARAM)ci->child[i] );

View File

@ -2186,7 +2186,7 @@ static void SPY_GetWndName( SPY_INSTANCE *sp_e )
SPY_GetClassName( sp_e );
len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, ARRAY_SIZE(sp_e->wnd_name));
len = NtUserInternalGetWindowText( sp_e->msg_hwnd, sp_e->wnd_name, ARRAY_SIZE(sp_e->wnd_name) );
if(!len) /* get class name */
{
LPWSTR dst = sp_e->wnd_name;

View File

@ -635,7 +635,7 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
if (!(text = HeapAlloc( GetProcessHeap(), 0, buf_size * sizeof(WCHAR) )))
goto no_TextOut;
while ((len = InternalGetWindowText( hwnd, text, buf_size )) == buf_size - 1)
while ((len = NtUserInternalGetWindowText( hwnd, text, buf_size )) == buf_size - 1)
{
buf_size *= 2;
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))

View File

@ -8308,6 +8308,11 @@ static void test_gettext(void)
ok( !strcmp(buf, "blah"), "got %s\n", buf );
ok( num_gettext_msgs == 0, "got %u WM_GETTEXT messages\n", num_gettext_msgs );
bufW[0] = 0xcc;
buf_len = InternalGetWindowText( hwnd, bufW, ARRAYSIZE(bufW) );
ok( buf_len == ARRAYSIZE("caption") - 1, "expected a nonempty window text\n" );
ok( !lstrcmpW( bufW, L"caption" ), "got %s\n", debugstr_w(bufW) );
g_wm_gettext_override.enabled = FALSE;
/* same for W window */

View File

@ -446,7 +446,7 @@
@ stdcall InsertMenuItemW(long long long ptr)
@ stdcall InsertMenuW(long long long long ptr)
@ stdcall InternalGetWindowIcon(ptr long)
@ stdcall InternalGetWindowText(long ptr long)
@ stdcall InternalGetWindowText(long ptr long) NtUserInternalGetWindowText
@ stdcall IntersectRect(ptr ptr ptr)
@ stdcall InvalidateRect(long ptr long)
@ stdcall InvalidateRgn(long long long)

View File

@ -2037,7 +2037,7 @@ HWND WINAPI FindWindowExW( HWND parent, HWND child, LPCWSTR className, LPCWSTR t
{
while (list[i])
{
if (InternalGetWindowText( list[i], buffer, len + 1 ))
if (NtUserInternalGetWindowText( list[i], buffer, len + 1 ))
{
if (!wcsicmp( buffer, title )) break;
}
@ -2944,30 +2944,6 @@ INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount )
}
/*******************************************************************
* InternalGetWindowText (USER32.@)
*/
INT WINAPI InternalGetWindowText(HWND hwnd,LPWSTR lpString,INT nMaxCount )
{
WND *win;
if (nMaxCount <= 0) return 0;
if (!(win = WIN_GetPtr( hwnd ))) return 0;
if (win == WND_DESKTOP) lpString[0] = 0;
else if (win != WND_OTHER_PROCESS)
{
if (win->text) lstrcpynW( lpString, win->text, nMaxCount );
else lpString[0] = 0;
WIN_ReleasePtr( win );
}
else
{
get_server_window_text( hwnd, lpString, nMaxCount );
}
return lstrlenW(lpString);
}
/*******************************************************************
* GetWindowTextW (USER32.@)
*/

View File

@ -139,6 +139,7 @@ static void * const syscalls[] =
NtUserGetSystemDpiForProcess,
NtUserGetThreadDesktop,
NtUserInitializeClientPfnArrays,
NtUserInternalGetWindowText,
NtUserNotifyWinEvent,
NtUserOpenDesktop,
NtUserOpenInputDesktop,

View File

@ -1045,7 +1045,7 @@
@ stub NtUserInjectTouchInput
@ stub NtUserInteractiveControlQueryUsage
@ stub NtUserInternalGetWindowIcon
@ stub NtUserInternalGetWindowText
@ stdcall -syscall NtUserInternalGetWindowText(long ptr long)
@ stub NtUserInternalToUnicode
@ stub NtUserInvalidateRect
@ stub NtUserInvalidateRgn

View File

@ -425,6 +425,49 @@ NTSTATUS WINAPI NtUserBuildHwndList( HDESK desktop, ULONG unk2, ULONG unk3, ULON
return STATUS_SUCCESS;
}
/* Retrieve the window text from the server. */
static data_size_t get_server_window_text( HWND hwnd, WCHAR *text, data_size_t count )
{
data_size_t len = 0, needed = 0;
SERVER_START_REQ( get_window_text )
{
req->handle = wine_server_user_handle( hwnd );
if (count) wine_server_set_reply( req, text, (count - 1) * sizeof(WCHAR) );
if (!wine_server_call_err( req ))
{
needed = reply->length;
len = wine_server_reply_size(reply);
}
}
SERVER_END_REQ;
if (text) text[len / sizeof(WCHAR)] = 0;
return needed;
}
/*******************************************************************
* NtUserInternalGetWindowText (win32u.@)
*/
INT WINAPI NtUserInternalGetWindowText( HWND hwnd, WCHAR *text, INT count )
{
WND *win;
if (count <= 0) return 0;
if (!(win = get_win_ptr( hwnd ))) return 0;
if (win == WND_DESKTOP) text[0] = 0;
else if (win != WND_OTHER_PROCESS)
{
if (win->text) lstrcpynW( text, win->text, count );
else text[0] = 0;
release_win_ptr( win );
}
else
{
get_server_window_text( hwnd, text, count );
}
return lstrlenW(text);
}
/*****************************************************************************
* NtUserCallHwnd (win32u.@)
*/

View File

@ -124,6 +124,7 @@
SYSCALL_ENTRY( NtUserGetSystemDpiForProcess ) \
SYSCALL_ENTRY( NtUserGetThreadDesktop ) \
SYSCALL_ENTRY( NtUserInitializeClientPfnArrays ) \
SYSCALL_ENTRY( NtUserInternalGetWindowText ) \
SYSCALL_ENTRY( NtUserNotifyWinEvent ) \
SYSCALL_ENTRY( NtUserOpenDesktop ) \
SYSCALL_ENTRY( NtUserOpenInputDesktop ) \

View File

@ -214,6 +214,15 @@ NTSTATUS WINAPI wow64_NtUserBuildHwndList( UINT *args )
return status;
}
NTSTATUS WINAPI wow64_NtUserInternalGetWindowText( UINT *args )
{
HWND hwnd = get_handle( &args );
WCHAR *text = get_ptr( &args );
INT count = get_ulong( &args );
return NtUserInternalGetWindowText( hwnd, text, count );
}
NTSTATUS WINAPI wow64_NtUserGetLayeredWindowAttributes( UINT *args )
{
HWND hwnd = get_handle( &args );

View File

@ -312,6 +312,7 @@ BOOL WINAPI NtUserGetUpdatedClipboardFormats( UINT *formats, UINT size, UINT
NTSTATUS WINAPI NtUserInitializeClientPfnArrays( const struct user_client_procs *client_procsA,
const struct user_client_procs *client_procsW,
const void *client_workers, HINSTANCE user_module );
INT WINAPI NtUserInternalGetWindowText( HWND hwnd, WCHAR *text, INT count );
BOOL WINAPI NtUserIsClipboardFormatAvailable( UINT format );
UINT WINAPI NtUserMapVirtualKeyEx( UINT code, UINT type, HKL layout );
void WINAPI NtUserNotifyWinEvent( DWORD event, HWND hwnd, LONG object_id, LONG child_id );