aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2005-09-06 18:49:18 +0000
committerSimon Tatham <anakin@pobox.com>2005-09-06 18:49:18 +0000
commitaec9667f00937fcbc110cc6f9a370499e864a6e9 (patch)
tree537d21f6bd6d3fa61c08d07543bb34872f667eed
parent7096df54deb2b8d3ef230dad4b4e905574236eda (diff)
downloadpuzzles-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.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/windows.c b/windows.c
index 3983d9b..72d0120 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,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);