wineconsole: Properly handle (user)-window resizing wrt the console.
This commit is contained in:
parent
544dbb518e
commit
70f24d6cc1
|
@ -778,6 +778,7 @@ static void WCUSER_Paint(const struct inner_data* data)
|
||||||
{
|
{
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
|
||||||
|
if (data->in_set_config) return; /* in order to avoid some flicker */
|
||||||
BeginPaint(data->hWnd, &ps);
|
BeginPaint(data->hWnd, &ps);
|
||||||
BitBlt(ps.hdc, 0, 0,
|
BitBlt(ps.hdc, 0, 0,
|
||||||
data->curcfg.win_width * data->curcfg.cell_width,
|
data->curcfg.win_width * data->curcfg.cell_width,
|
||||||
|
@ -1329,6 +1330,10 @@ static LRESULT CALLBACK WCUSER_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
if (!HIWORD(lParam)) return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
if (!HIWORD(lParam)) return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
||||||
WCUSER_SetMenuDetails(data, GetSystemMenu(data->hWnd, FALSE));
|
WCUSER_SetMenuDetails(data, GetSystemMenu(data->hWnd, FALSE));
|
||||||
break;
|
break;
|
||||||
|
case WM_SIZE:
|
||||||
|
WINECON_ResizeWithContainer(data, LOWORD(lParam) / data->curcfg.cell_width,
|
||||||
|
HIWORD(lParam) / data->curcfg.cell_height);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ struct inner_data {
|
||||||
HANDLE hSynchro; /* waitable handle signalled by server when something in server has been modified */
|
HANDLE hSynchro; /* waitable handle signalled by server when something in server has been modified */
|
||||||
HWND hWnd; /* handle of 'user' window or NULL for 'curses' */
|
HWND hWnd; /* handle of 'user' window or NULL for 'curses' */
|
||||||
INT nCmdShow; /* argument of WinMain */
|
INT nCmdShow; /* argument of WinMain */
|
||||||
|
BOOL in_set_config; /* to handle re-entrant calls to WINECON_SetConfig */
|
||||||
|
|
||||||
int (*fnMainLoop)(struct inner_data* data);
|
int (*fnMainLoop)(struct inner_data* data);
|
||||||
void (*fnPosCursor)(const struct inner_data* data);
|
void (*fnPosCursor)(const struct inner_data* data);
|
||||||
|
@ -77,6 +78,7 @@ struct inner_data {
|
||||||
|
|
||||||
/* from wineconsole.c */
|
/* from wineconsole.c */
|
||||||
extern void WINECON_Fatal(const char* msg);
|
extern void WINECON_Fatal(const char* msg);
|
||||||
|
extern void WINECON_ResizeWithContainer(struct inner_data* data, int width, int height);
|
||||||
extern int WINECON_GetHistorySize(HANDLE hConIn);
|
extern int WINECON_GetHistorySize(HANDLE hConIn);
|
||||||
extern int WINECON_GetHistoryMode(HANDLE hConIn);
|
extern int WINECON_GetHistoryMode(HANDLE hConIn);
|
||||||
extern BOOL WINECON_GetConsoleTitle(HANDLE hConIn, WCHAR* buffer, size_t len);
|
extern BOOL WINECON_GetConsoleTitle(HANDLE hConIn, WCHAR* buffer, size_t len);
|
||||||
|
|
|
@ -81,6 +81,34 @@ static void WINECON_FetchCells(struct inner_data* data, int upd_tp, int upd_bm)
|
||||||
data->fnRefresh(data, upd_tp, upd_bm);
|
data->fnRefresh(data, upd_tp, upd_bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* WINECON_ResizeWithContainer
|
||||||
|
*
|
||||||
|
* For console embedded in a container (e.g. user in a win32 window, or (n)curses
|
||||||
|
* in a TERM, perform resize of console (screen buffer and window) to fit in
|
||||||
|
* (new) container size.
|
||||||
|
*/
|
||||||
|
void WINECON_ResizeWithContainer(struct inner_data* data, int width, int height)
|
||||||
|
{
|
||||||
|
struct config_data cfg;
|
||||||
|
|
||||||
|
if (data->in_set_config) return;
|
||||||
|
|
||||||
|
cfg = data->curcfg;
|
||||||
|
cfg.win_width = width;
|
||||||
|
cfg.win_height = height;
|
||||||
|
|
||||||
|
/* auto size screen-buffer if it's now smaller than window */
|
||||||
|
if (cfg.sb_width < cfg.win_width) cfg.sb_width = cfg.win_width;
|
||||||
|
if (cfg.sb_height < cfg.win_height) cfg.sb_height = cfg.win_height;
|
||||||
|
|
||||||
|
/* and reset window pos so that we don't display outside of the screen-buffer */
|
||||||
|
if (cfg.win_pos.X + cfg.win_width > cfg.sb_width) cfg.win_pos.X = cfg.sb_width - cfg.win_width;
|
||||||
|
if (cfg.win_pos.Y + cfg.win_height > cfg.sb_height) cfg.win_pos.Y = cfg.sb_height - cfg.win_height;
|
||||||
|
|
||||||
|
WINECON_SetConfig(data, &cfg);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* WINECON_SetHistorySize
|
* WINECON_SetHistorySize
|
||||||
*
|
*
|
||||||
|
@ -336,6 +364,8 @@ int WINECON_GrabChanges(struct inner_data* data)
|
||||||
*/
|
*/
|
||||||
void WINECON_SetConfig(struct inner_data* data, const struct config_data* cfg)
|
void WINECON_SetConfig(struct inner_data* data, const struct config_data* cfg)
|
||||||
{
|
{
|
||||||
|
if (data->in_set_config) return;
|
||||||
|
data->in_set_config = TRUE;
|
||||||
if (data->curcfg.cursor_size != cfg->cursor_size ||
|
if (data->curcfg.cursor_size != cfg->cursor_size ||
|
||||||
data->curcfg.cursor_visible != cfg->cursor_visible)
|
data->curcfg.cursor_visible != cfg->cursor_visible)
|
||||||
{
|
{
|
||||||
|
@ -467,6 +497,7 @@ void WINECON_SetConfig(struct inner_data* data, const struct config_data* cf
|
||||||
* in order to get data correctly updated
|
* in order to get data correctly updated
|
||||||
*/
|
*/
|
||||||
WINECON_GrabChanges(data);
|
WINECON_GrabChanges(data);
|
||||||
|
data->in_set_config = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
|
|
Loading…
Reference in New Issue