[PATCH v4 2/2] kernelbase: Implement SetConsoleScreenBufferInfoEx().

Aaro Altonen a.altonen at hotmail.com
Wed Mar 4 01:47:52 CST 2020


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47288
Signed-off-by: Aaro Altonen <a.altonen at hotmail.com>
---
v2:
- Removed an unnecessary check and added a print (thanks Gijs)
---
 dlls/kernel32/tests/console.c | 10 +++++-----
 dlls/kernelbase/console.c     | 33 ++++++++++++++++++++++++++++++---
 2 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 8f19161c9c..9698f11779 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -3167,24 +3167,24 @@ static void test_SetConsoleScreenBufferInfoEx(HANDLE std_output)
     SetLastError(0xdeadbeef);
     ret = pSetConsoleScreenBufferInfoEx(NULL, &info);
     ok(!ret, "got %d, expected zero\n", ret);
-    todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "got %u, expected 6\n", GetLastError());
+    ok(GetLastError() == ERROR_INVALID_HANDLE, "got %u, expected 6\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ret = pSetConsoleScreenBufferInfoEx(std_output, &info);
-    todo_wine ok(ret, "got %d, expected one\n", ret);
-    todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
+    ok(ret, "got %d, expected one\n", ret);
+    ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ret = pSetConsoleScreenBufferInfoEx(std_input, &info);
     ok(!ret, "got %d, expected zero\n", ret);
-    todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE || GetLastError() == ERROR_ACCESS_DENIED,
+    ok(GetLastError() == ERROR_INVALID_HANDLE || GetLastError() == ERROR_ACCESS_DENIED,
             "got %u, expected 5 or 6\n", GetLastError());
 
     info.cbSize = 0;
     SetLastError(0xdeadbeef);
     ret = pSetConsoleScreenBufferInfoEx(std_output, &info);
     ok(!ret, "got %d, expected zero\n", ret);
-    todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %u, expected 87\n", GetLastError());
+    ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %u, expected 87\n", GetLastError());
 
     CloseHandle(std_input);
 }
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 91e8129fbe..8ce9252413 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -1146,9 +1146,36 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleOutputCP( UINT cp )
 BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleScreenBufferInfoEx( HANDLE handle,
                                                             CONSOLE_SCREEN_BUFFER_INFOEX *info )
 {
-    FIXME( "(%p %p): stub!\n", handle, info );
-    SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
-    return FALSE;
+    BOOL ret;
+
+    TRACE("(%p, %p)\n", handle, info);
+
+    if (info->cbSize != sizeof(CONSOLE_SCREEN_BUFFER_INFOEX))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    SERVER_START_REQ(set_console_output_info)
+    {
+        req->handle     = console_handle_unmap(handle);
+        req->width      = info->dwSize.X;
+        req->height     = info->dwSize.Y;
+        req->cursor_x   = info->dwCursorPosition.X;
+        req->cursor_y   = info->dwCursorPosition.Y;
+        req->attr       = info->wAttributes;
+        req->win_left   = info->srWindow.Left;
+        req->win_top    = info->srWindow.Top;
+        req->win_right  = info->srWindow.Right;
+        req->win_bottom = info->srWindow.Bottom;
+        req->popup_attr = info->wPopupAttributes;
+        req->max_width  = min(info->dwMaximumWindowSize.X, info->dwSize.X);
+        req->max_height = min(info->dwMaximumWindowSize.Y, info->dwSize.Y);
+        ret = !wine_server_call_err(req);
+    }
+    SERVER_END_REQ;
+
+    return ret;
 }
 
 
-- 
2.25.1




More information about the wine-devel mailing list