Signed-off-by: Gijs Vermeulen gijsvrm@codeweavers.com --- programs/wineconsole/wineconsole.c | 3 +++ server/console.c | 34 +++++++++++++++++++++++++----- server/protocol.def | 33 ++++++++++++++++------------- 3 files changed, 50 insertions(+), 20 deletions(-)
diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index 439099c37a..ebcfce1011 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -458,6 +458,9 @@ void WINECON_SetConfig(struct inner_data* data, const struct config_data* cf req->max_height = (r.bottom - r.top - GetSystemMetrics(SM_CYCAPTION)) / cfg->cell_height; req->font_width = cfg->cell_width; req->font_height = cfg->cell_height; + req->font_weight = cfg->font_weight; + req->font_pitch_family = FIXED_PITCH | FF_DONTCARE; + wine_server_add_data( req, cfg->face_name, lstrlenW(cfg->face_name) * sizeof(WCHAR) ); wine_server_call( req ); } SERVER_END_REQ; diff --git a/server/console.c b/server/console.c index 7d1fc5d268..d40da275e9 100644 --- a/server/console.c +++ b/server/console.c @@ -131,6 +131,9 @@ struct font_info { short int width; short int height; + short int weight; + short int pitch_family; + struct unicode_str face_name; };
struct screen_buffer @@ -433,6 +436,10 @@ static struct screen_buffer *create_console_output( struct console_input *consol screen_buffer->data = NULL; screen_buffer->font.width = 0; screen_buffer->font.height = 0; + screen_buffer->font.weight = FW_NORMAL; + screen_buffer->font.pitch_family = FIXED_PITCH | FF_DONTCARE; + screen_buffer->font.face_name.str = NULL; + screen_buffer->font.face_name.len = 0; memset( screen_buffer->color_map, 0, sizeof(screen_buffer->color_map) ); list_add_head( &screen_buffer_list, &screen_buffer->entry );
@@ -896,6 +903,8 @@ static int set_console_output_info( struct screen_buffer *screen_buffer, const struct set_console_output_info_request *req ) { struct console_renderer_event evt; + data_size_t font_name_len, offset; + WCHAR *font_name;
memset(&evt.u, 0, sizeof(evt.u)); if (req->mask & SET_CONSOLE_OUTPUT_INFO_CURSOR_GEOM) @@ -1039,15 +1048,29 @@ static int set_console_output_info( struct screen_buffer *screen_buffer, screen_buffer->max_width = req->max_width; screen_buffer->max_height = req->max_height; } + if (req->mask & SET_CONSOLE_OUTPUT_INFO_COLORTABLE) + { + memcpy( screen_buffer->color_map, get_req_data(), min( get_req_data_size(), sizeof(screen_buffer->color_map) )); + } if (req->mask & SET_CONSOLE_OUTPUT_INFO_FONT) { screen_buffer->font.width = req->font_width; screen_buffer->font.height = req->font_height; - } - if (req->mask & SET_CONSOLE_OUTPUT_INFO_COLORTABLE) - { - memcpy( screen_buffer->color_map, get_req_data(), - min( sizeof(screen_buffer->color_map), get_req_data_size() )); + screen_buffer->font.weight = req->font_weight; + screen_buffer->font.pitch_family = req->font_pitch_family; + offset = req->mask & SET_CONSOLE_OUTPUT_INFO_COLORTABLE ? sizeof(screen_buffer->color_map) : 0; + if (get_req_data_size() > offset) + { + font_name_len = (get_req_data_size() - offset) / sizeof(WCHAR) * sizeof(WCHAR); + font_name = mem_alloc( font_name_len ); + if (font_name) + { + memcpy( font_name, (char*)get_req_data() + offset, font_name_len ); + free( (WCHAR *)screen_buffer->font.face_name.str ); + screen_buffer->font.face_name.str = font_name; + screen_buffer->font.face_name.len = font_name_len; + } + } }
return 1; @@ -1183,6 +1206,7 @@ static void screen_buffer_destroy( struct object *obj ) } if (screen_buffer->fd) release_object( screen_buffer->fd ); free( screen_buffer->data ); + free( (WCHAR *)screen_buffer->font.face_name.str ); }
static struct fd *screen_buffer_get_fd( struct object *obj ) diff --git a/server/protocol.def b/server/protocol.def index 3a0df20bdb..4dc9a278ad 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1615,25 +1615,28 @@ struct console_renderer_event
/* Set info about a console (output only) */ @REQ(set_console_output_info) - obj_handle_t handle; /* handle to the console */ - int mask; /* setting mask (see below) */ - 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) */ + obj_handle_t handle; /* handle to the console */ + int mask; /* setting mask (see below) */ + 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 #define SET_CONSOLE_OUTPUT_INFO_CURSOR_GEOM 0x0001 #define SET_CONSOLE_OUTPUT_INFO_CURSOR_POS 0x0002