X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/899e7ff54c5c345cac62818d4d13feb1aca790f1..96c92647f055deba9bfbf91f1198ab5d3b06cae4:/windows.c diff --git a/windows.c b/windows.c index 2aa8016..6b90023 100644 --- a/windows.c +++ b/windows.c @@ -74,6 +74,11 @@ void debug_printf(char *fmt, ...) } #endif +#define WINFLAGS (WS_OVERLAPPEDWINDOW &~ \ + (WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED)) + +static void new_game_size(frontend *fe); + struct font { HFONT font; int type; @@ -1042,9 +1047,7 @@ static void check_window_size(frontend *fe, int *px, int *py) r.left = r.top = 0; r.right = x; r.bottom = y + sy; - AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~ - (WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED), - TRUE, 0); + AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0); SetWindowPos(fe->hwnd, NULL, 0, 0, r.right - r.left, r.bottom - r.top, SWP_NOMOVE | SWP_NOZORDER); } @@ -1059,12 +1062,35 @@ static void check_window_size(frontend *fe, int *px, int *py) *py = y; } +static void get_max_puzzle_size(frontend *fe, int *x, int *y) +{ + RECT r, sr; + + if (SystemParametersInfo(SPI_GETWORKAREA, 0, &sr, FALSE)) { + *x = sr.right - sr.left; + *y = sr.bottom - sr.top; + r.left = 100; + r.right = 200; + r.top = 100; + r.bottom = 200; + AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0); + *x -= r.right - r.left - 100; + *y -= r.bottom - r.top - 100; + } else { + *x = *y = INT_MAX; + } + + if (fe->statusbar != NULL) { + GetWindowRect(fe->statusbar, &sr); + *y -= sr.bottom - sr.top; + } +} + static frontend *new_window(HINSTANCE inst, char *game_id, char **error) { frontend *fe; int x, y; RECT r; - HDC hdc; fe = snew(frontend); @@ -1115,17 +1141,24 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) fe->brushes[i] = CreateSolidBrush(fe->colours[i]); fe->pens[i] = CreatePen(PS_SOLID, 1, fe->colours[i]); } + sfree(colours); } - x = y = INT_MAX; /* find puzzle's preferred size */ + if (midend_wants_statusbar(fe->me)) { + fe->statusbar = CreateWindowEx(0, STATUSCLASSNAME, "ooh", + WS_CHILD | WS_VISIBLE, + 0, 0, 0, 0, /* status bar does these */ + NULL, NULL, inst, NULL); + } else + fe->statusbar = NULL; + + get_max_puzzle_size(fe, &x, &y); midend_size(fe->me, &x, &y, FALSE); r.left = r.top = 0; r.right = x; r.bottom = y; - AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~ - (WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED), - TRUE, 0); + AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0); fe->hwnd = CreateWindowEx(0, thegame.name, thegame.name, WS_OVERLAPPEDWINDOW &~ @@ -1136,6 +1169,7 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) if (midend_wants_statusbar(fe->me)) { RECT sr; + DestroyWindow(fe->statusbar); fe->statusbar = CreateWindowEx(0, STATUSCLASSNAME, "ooh", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, /* status bar does these */ @@ -1227,12 +1261,10 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) SetMenu(fe->hwnd, bar); } + fe->bitmap = NULL; + new_game_size(fe); /* initialises fe->bitmap */ check_window_size(fe, &x, &y); - hdc = GetDC(fe->hwnd); - fe->bitmap = CreateCompatibleBitmap(hdc, x, y); - ReleaseDC(fe->hwnd, hdc); - SetWindowLong(fe->hwnd, GWL_USERDATA, (LONG)fe); ShowWindow(fe->hwnd, SW_NORMAL); @@ -1847,16 +1879,13 @@ static void new_game_size(frontend *fe) HDC hdc; int x, y; - x = y = INT_MAX; + get_max_puzzle_size(fe, &x, &y); midend_size(fe->me, &x, &y, FALSE); r.left = r.top = 0; r.right = x; r.bottom = y; - AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~ - (WS_THICKFRAME | WS_MAXIMIZEBOX | - WS_OVERLAPPED), - TRUE, 0); + AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0); if (fe->statusbar != NULL) { GetWindowRect(fe->statusbar, &sr); @@ -1874,7 +1903,7 @@ static void new_game_size(frontend *fe) SetWindowPos(fe->statusbar, NULL, 0, y, x, sr.bottom - sr.top, SWP_NOZORDER); - DeleteObject(fe->bitmap); + if (fe->bitmap) DeleteObject(fe->bitmap); hdc = GetDC(fe->hwnd); fe->bitmap = CreateCompatibleBitmap(hdc, x, y);