}
#endif
+#define WINFLAGS (WS_OVERLAPPEDWINDOW &~ \
+ (WS_THICKFRAME | WS_MAXIMIZEBOX | WS_OVERLAPPED))
+
+static void new_game_size(frontend *fe);
+
struct font {
HFONT font;
int type;
HPEN oldpen;
char *help_path;
int help_has_contents;
- char *laststatus;
enum { DRAWING, PRINTING, NOTHING } drawstatus;
DOCINFO di;
int printcount, printw, printh, printsolns, printcurr, printcolour;
static void win_status_bar(void *handle, char *text)
{
frontend *fe = (frontend *)handle;
- char *rewritten;
-
- assert(fe->drawstatus == DRAWING);
- rewritten = midend_rewrite_statusbar(fe->me, text);
- if (!fe->laststatus || strcmp(rewritten, fe->laststatus)) {
- SetWindowText(fe->statusbar, rewritten);
- sfree(fe->laststatus);
- fe->laststatus = rewritten;
- } else {
- sfree(rewritten);
- }
+ SetWindowText(fe->statusbar, text);
}
static blitter *win_blitter_new(void *handle, int w, int h)
int width = thin ? 0 : fe->linewidth;
print_get_colour(fe->dr, colour, &hatch, &r, &g, &b);
- /* FIXME: line thickness here */
if (fe->printcolour)
pen = CreatePen(PS_SOLID, width,
RGB(r * 255, g * 255, b * 255));
frontend *fe = (frontend *)handle;
assert(fe->drawstatus != DRAWING);
- /*
- * The MSDN web site sample code doesn't bother to call EndDoc
- * if an error occurs half way through printing. I expect doing
- * so would cause the erroneous document to actually be
- * printed, or something equally undesirable.
- */
+
if (fe->drawstatus == NOTHING)
return;
}
fe->fontstart = 0;
+ /*
+ * The MSDN web site sample code doesn't bother to call EndDoc
+ * if an error occurs half way through printing. I expect doing
+ * so would cause the erroneous document to actually be
+ * printed, or something equally undesirable.
+ */
if (fe->drawstatus == NOTHING)
return;
pd.nFromPage = pd.nToPage = 0xFFFF;
pd.nMinPage = pd.nMaxPage = 1;
- if (!PrintDlg(&pd))
+ if (!PrintDlg(&pd)) {
+ document_free(doc);
return;
+ }
/*
* Now pd.hDC is a device context for the printer.
fe->drawstatus = PRINTING;
fe->hdc = pd.hDC;
- fe->dr = drawing_init(&win_drawing, fe);
+ fe->dr = drawing_new(&win_drawing, NULL, fe);
document_print(doc, fe->dr);
drawing_free(fe->dr);
fe->dr = NULL;
fe->drawstatus = NOTHING;
DeleteDC(pd.hDC);
+ document_free(doc);
}
void deactivate_timer(frontend *fe)
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);
}
*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);
fe->fonts = NULL;
fe->nfonts = fe->fontsize = 0;
- fe->laststatus = NULL;
-
{
int i, ncolours;
float *colours;
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 &~
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 */
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);
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);
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);