mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
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]
This commit is contained in:
55
windows.c
55
windows.c
@ -74,6 +74,11 @@ void debug_printf(char *fmt, ...)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define WINFLAGS (WS_OVERLAPPEDWINDOW &~ \
|
||||||
|
(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED))
|
||||||
|
|
||||||
|
static void new_game_size(frontend *fe);
|
||||||
|
|
||||||
struct font {
|
struct font {
|
||||||
HFONT font;
|
HFONT font;
|
||||||
int type;
|
int type;
|
||||||
@ -1042,9 +1047,7 @@ static void check_window_size(frontend *fe, int *px, int *py)
|
|||||||
r.left = r.top = 0;
|
r.left = r.top = 0;
|
||||||
r.right = x;
|
r.right = x;
|
||||||
r.bottom = y + sy;
|
r.bottom = y + sy;
|
||||||
AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~
|
AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0);
|
||||||
(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED),
|
|
||||||
TRUE, 0);
|
|
||||||
SetWindowPos(fe->hwnd, NULL, 0, 0, r.right - r.left, r.bottom - r.top,
|
SetWindowPos(fe->hwnd, NULL, 0, 0, r.right - r.left, r.bottom - r.top,
|
||||||
SWP_NOMOVE | SWP_NOZORDER);
|
SWP_NOMOVE | SWP_NOZORDER);
|
||||||
}
|
}
|
||||||
@ -1059,6 +1062,30 @@ static void check_window_size(frontend *fe, int *px, int *py)
|
|||||||
*py = y;
|
*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)
|
static frontend *new_window(HINSTANCE inst, char *game_id, char **error)
|
||||||
{
|
{
|
||||||
frontend *fe;
|
frontend *fe;
|
||||||
@ -1118,15 +1145,20 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error)
|
|||||||
sfree(colours);
|
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);
|
midend_size(fe->me, &x, &y, FALSE);
|
||||||
|
|
||||||
r.left = r.top = 0;
|
r.left = r.top = 0;
|
||||||
r.right = x;
|
r.right = x;
|
||||||
r.bottom = y;
|
r.bottom = y;
|
||||||
AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~
|
AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0);
|
||||||
(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED),
|
|
||||||
TRUE, 0);
|
|
||||||
|
|
||||||
fe->hwnd = CreateWindowEx(0, thegame.name, thegame.name,
|
fe->hwnd = CreateWindowEx(0, thegame.name, thegame.name,
|
||||||
WS_OVERLAPPEDWINDOW &~
|
WS_OVERLAPPEDWINDOW &~
|
||||||
@ -1137,6 +1169,7 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error)
|
|||||||
|
|
||||||
if (midend_wants_statusbar(fe->me)) {
|
if (midend_wants_statusbar(fe->me)) {
|
||||||
RECT sr;
|
RECT sr;
|
||||||
|
DestroyWindow(fe->statusbar);
|
||||||
fe->statusbar = CreateWindowEx(0, STATUSCLASSNAME, "ooh",
|
fe->statusbar = CreateWindowEx(0, STATUSCLASSNAME, "ooh",
|
||||||
WS_CHILD | WS_VISIBLE,
|
WS_CHILD | WS_VISIBLE,
|
||||||
0, 0, 0, 0, /* status bar does these */
|
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);
|
SetMenu(fe->hwnd, bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new_game_size(fe);
|
||||||
check_window_size(fe, &x, &y);
|
check_window_size(fe, &x, &y);
|
||||||
|
|
||||||
hdc = GetDC(fe->hwnd);
|
hdc = GetDC(fe->hwnd);
|
||||||
@ -1848,16 +1882,13 @@ static void new_game_size(frontend *fe)
|
|||||||
HDC hdc;
|
HDC hdc;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
x = y = INT_MAX;
|
get_max_puzzle_size(fe, &x, &y);
|
||||||
midend_size(fe->me, &x, &y, FALSE);
|
midend_size(fe->me, &x, &y, FALSE);
|
||||||
|
|
||||||
r.left = r.top = 0;
|
r.left = r.top = 0;
|
||||||
r.right = x;
|
r.right = x;
|
||||||
r.bottom = y;
|
r.bottom = y;
|
||||||
AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW &~
|
AdjustWindowRectEx(&r, WINFLAGS, TRUE, 0);
|
||||||
(WS_THICKFRAME | WS_MAXIMIZEBOX |
|
|
||||||
WS_OVERLAPPED),
|
|
||||||
TRUE, 0);
|
|
||||||
|
|
||||||
if (fe->statusbar != NULL) {
|
if (fe->statusbar != NULL) {
|
||||||
GetWindowRect(fe->statusbar, &sr);
|
GetWindowRect(fe->statusbar, &sr);
|
||||||
|
Reference in New Issue
Block a user