diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-09-06 18:49:18 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-09-06 18:49:18 +0000 |
| commit | aec9667f00937fcbc110cc6f9a370499e864a6e9 (patch) | |
| tree | 537d21f6bd6d3fa61c08d07543bb34872f667eed | |
| parent | 7096df54deb2b8d3ef230dad4b4e905574236eda (diff) | |
| download | puzzles-aec9667f00937fcbc110cc6f9a370499e864a6e9.zip puzzles-aec9667f00937fcbc110cc6f9a370499e864a6e9.tar.gz puzzles-aec9667f00937fcbc110cc6f9a370499e864a6e9.tar.bz2 puzzles-aec9667f00937fcbc110cc6f9a370499e864a6e9.tar.xz | |
Take the Windows taskbar into account when deciding on the maximum
size of the puzzle window. This has involved some _completely
stupid_ window manipulation: in order to figure out in advance how
big I want my main window to be, I first have to _create_ the status
bar so I know how tall it is; but since I can't reparent it into my
main window after I've created it, I then have to throw that status
bar away and create a new one. *sigh*
[originally from svn r6276]
| -rw-r--r-- | windows.c | 55 |
1 files changed, 43 insertions, 12 deletions
@@ -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,6 +1062,30 @@ 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; @@ -1118,15 +1145,20 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) 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); + } + + 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 &~ @@ -1137,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 */ @@ -1228,6 +1261,7 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) SetMenu(fe->hwnd, bar); } + new_game_size(fe); check_window_size(fe, &x, &y); hdc = GetDC(fe->hwnd); @@ -1848,16 +1882,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); |