Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47620 Signed-off-by: Gijs Vermeulen gijsvrm@codeweavers.com --- dlls/kernel32/console.c | 50 +++++++++++++++++++++++++++++++++++-- dlls/kernel32/kernel32.spec | 2 +- server/console.c | 17 +++++++++++-- server/protocol.def | 31 ++++++++++++----------- 4 files changed, 81 insertions(+), 19 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index a698e53efe..7f7c843d66 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -1639,17 +1639,33 @@ BOOL WINAPI SetConsoleKeyShortcuts(BOOL set, BYTE keys, VOID *a, DWORD b) }
-BOOL WINAPI GetCurrentConsoleFont(HANDLE hConsole, BOOL maxwindow, LPCONSOLE_FONT_INFO fontinfo) +BOOL WINAPI GetCurrentConsoleFontEx(HANDLE hConsole, BOOL maxwindow, CONSOLE_FONT_INFOEX *fontinfo) { BOOL ret; + void *data; + size_t color_map_size = 16 * sizeof(unsigned int); + size_t face_name_len = sizeof(fontinfo->FaceName) - sizeof(WCHAR);
- memset(fontinfo, 0, sizeof(CONSOLE_FONT_INFO)); + if (fontinfo->cbSize != sizeof(CONSOLE_FONT_INFOEX)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + data = HeapAlloc(GetProcessHeap(), 0, face_name_len + color_map_size); + if (!data) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + }
SERVER_START_REQ(get_console_output_info) { req->handle = console_handle_unmap(hConsole); + wine_server_set_reply(req, data, face_name_len + color_map_size); if ((ret = !wine_server_call_err(req))) { + fontinfo->nFont = 0; if (maxwindow) { fontinfo->dwFontSize.X = min(reply->width, reply->max_width); @@ -1660,9 +1676,39 @@ BOOL WINAPI GetCurrentConsoleFont(HANDLE hConsole, BOOL maxwindow, LPCONSOLE_FON fontinfo->dwFontSize.X = reply->win_right - reply->win_left + 1; fontinfo->dwFontSize.Y = reply->win_bottom - reply->win_top + 1; } + if (wine_server_reply_size(reply) > color_map_size) + { + face_name_len = min(face_name_len, wine_server_reply_size(reply) - color_map_size); + memcpy(fontinfo->FaceName, (char *)data + color_map_size, face_name_len); + fontinfo->FaceName[face_name_len / sizeof(WCHAR)] = 0; + } + else + fontinfo->FaceName[0] = 0; + fontinfo->FontFamily = reply->font_pitch_family; + fontinfo->FontWeight = reply->font_weight; } } SERVER_END_REQ; + + HeapFree(GetProcessHeap(), 0, data); + + return ret; +} + +BOOL WINAPI GetCurrentConsoleFont(HANDLE hConsole, BOOL maxwindow, CONSOLE_FONT_INFO *fontinfo) +{ + BOOL ret; + CONSOLE_FONT_INFOEX res; + + res.cbSize = sizeof(CONSOLE_FONT_INFOEX); + + ret = GetCurrentConsoleFontEx(hConsole, maxwindow, &res); + if(ret) + { + fontinfo->nFont = res.nFont; + fontinfo->dwFontSize.X = res.dwFontSize.X; + fontinfo->dwFontSize.Y = res.dwFontSize.Y; + } return ret; }
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 5d543f1eb5..28c3b83a06 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -623,7 +623,7 @@ @ stdcall GetCurrencyFormatW(long long wstr ptr ptr long) @ stdcall -import GetCurrentActCtx(ptr) @ stdcall GetCurrentConsoleFont(long long ptr) -# @ stub GetCurrentConsoleFontEx +@ stdcall GetCurrentConsoleFontEx(long long ptr) @ stdcall -import GetCurrentDirectoryA(long ptr) @ stdcall -import GetCurrentDirectoryW(long ptr) @ stdcall GetCurrentPackageFamilyName(ptr ptr) diff --git a/server/console.c b/server/console.c index d40da275e9..f746cdf3b3 100644 --- a/server/console.c +++ b/server/console.c @@ -1755,6 +1755,8 @@ DECL_HANDLER(set_console_output_info) DECL_HANDLER(get_console_output_info) { struct screen_buffer *screen_buffer; + void *data; + data_size_t total;
if ((screen_buffer = (struct screen_buffer *)get_handle_obj( current->process, req->handle, FILE_READ_PROPERTIES, &screen_buffer_ops))) @@ -1775,8 +1777,19 @@ DECL_HANDLER(get_console_output_info) reply->max_height = screen_buffer->max_height; reply->font_width = screen_buffer->font.width; reply->font_height = screen_buffer->font.height; - set_reply_data( screen_buffer->color_map, - min( sizeof(screen_buffer->color_map), get_reply_max_size() )); + reply->font_weight = screen_buffer->font.weight; + reply->font_pitch_family = screen_buffer->font.pitch_family; + total = min( sizeof(screen_buffer->color_map) + screen_buffer->font.face_name.len, get_reply_max_size() ); + if (total) + { + data = set_reply_data_size( total ); + memcpy( data, screen_buffer->color_map, min( total, sizeof(screen_buffer->color_map) )); + if (screen_buffer->font.face_name.len && total > sizeof(screen_buffer->color_map)) + { + memcpy( (char *)data + sizeof(screen_buffer->color_map), screen_buffer->font.face_name.str, + min( total - sizeof(screen_buffer->color_map), screen_buffer->font.face_name.len )); + } + } release_object( screen_buffer ); } } diff --git a/server/protocol.def b/server/protocol.def index 4dc9a278ad..950c6d0525 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1651,25 +1651,28 @@ struct console_renderer_event
/* Get info about a console (output only) */ @REQ(get_console_output_info) - obj_handle_t handle; /* handle to the console */ + obj_handle_t handle; /* handle to the console */ @REPLY - short int cursor_size; /* size of cursor (percentage filled) */ - short int cursor_visible;/* cursor visibility flag */ - short int cursor_x; /* position of cursor (x, y) */ + short int cursor_size; /* size of cursor (percentage filled) */ + short int cursor_visible; /* cursor visibility flag */ + short int cursor_x; /* position of cursor (x, y) */ short int cursor_y; - short int width; /* width of the screen buffer */ - short int height; /* height of the screen buffer */ - short int attr; /* default fill attributes (screen colors) */ - short int popup_attr; /* pop-up color attributes */ - short int win_left; /* window actually displayed by renderer */ - short int win_top; /* the rect area is expressed within the */ - short int win_right; /* boundaries of the screen buffer */ + short int width; /* width of the screen buffer */ + short int height; /* height of the screen buffer */ + short int attr; /* default fill attributes (screen colors) */ + short int popup_attr; /* pop-up color attributes */ + short int win_left; /* window actually displayed by renderer */ + short int win_top; /* the rect area is expressed within the */ + short int win_right; /* boundaries of the screen buffer */ short int win_bottom; - short int max_width; /* maximum size (width x height) for the window */ + short int max_width; /* maximum size (width x height) for the window */ short int max_height; - short int font_width; /* font size (width x height) */ + short int font_width; /* font size (width x height) */ short int font_height; - VARARG(colors,uints); /* color table */ + short int font_weight; /* font weight */ + short int font_pitch_family; /* font pitch & family */ + VARARG(colors,uints); /* color table */ + VARARG(face_name,unicode_str); /* font face name */ @END
/* Add input records to a console input queue */