X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/57bac21f9d528432c1ecb195d6778a4ec4fc918d..64e360d381cfe0462094218554af9f611ad9a865:/windows.c diff --git a/windows.c b/windows.c index 64f6eae..f727869 100644 --- a/windows.c +++ b/windows.c @@ -195,6 +195,7 @@ struct frontend { HBRUSH *brushes; HPEN *pens; HRGN clip; + HMENU typemenu; UINT timer; DWORD timer_last_tickcount; int npresets; @@ -220,6 +221,8 @@ struct frontend { int xmin, ymin; }; +static void update_type_menu_tick(frontend *fe); + void fatal(char *fmt, ...) { char buf[2048]; @@ -398,12 +401,14 @@ static void win_text_colour(frontend *fe, int colour) if (fe->drawstatus == PRINTING) { int hatch; float r, g, b; - print_get_colour(fe->dr, colour, &hatch, &r, &g, &b); - if (fe->printcolour) - SetTextColor(fe->hdc, RGB(r * 255, g * 255, b * 255)); - else - SetTextColor(fe->hdc, - hatch == HATCH_CLEAR ? RGB(255,255,255) : RGB(0,0,0)); + print_get_colour(fe->dr, colour, fe->printcolour, &hatch, &r, &g, &b); + + /* + * Displaying text in hatched colours is not permitted. + */ + assert(hatch < 0); + + SetTextColor(fe->hdc, RGB(r * 255, g * 255, b * 255)); } else { SetTextColor(fe->hdc, fe->colours[colour]); } @@ -417,14 +422,10 @@ static void win_set_brush(frontend *fe, int colour) if (fe->drawstatus == PRINTING) { int hatch; float r, g, b; - print_get_colour(fe->dr, colour, &hatch, &r, &g, &b); + print_get_colour(fe->dr, colour, fe->printcolour, &hatch, &r, &g, &b); - if (fe->printcolour) { + if (hatch < 0) { br = CreateSolidBrush(RGB(r * 255, g * 255, b * 255)); - } else if (hatch == HATCH_SOLID) { - br = CreateSolidBrush(RGB(0,0,0)); - } else if (hatch == HATCH_CLEAR) { - br = CreateSolidBrush(RGB(255,255,255)); } else { #ifdef _WIN32_WCE /* @@ -469,18 +470,12 @@ static void win_set_pen(frontend *fe, int colour, int thin) float r, g, b; int width = thin ? 0 : fe->linewidth; - print_get_colour(fe->dr, colour, &hatch, &r, &g, &b); - if (fe->printcolour) - pen = CreatePen(PS_SOLID, width, - RGB(r * 255, g * 255, b * 255)); - else if (hatch == HATCH_SOLID) - pen = CreatePen(PS_SOLID, width, RGB(0, 0, 0)); - else if (hatch == HATCH_CLEAR) - pen = CreatePen(PS_SOLID, width, RGB(255,255,255)); - else { - assert(!"This shouldn't happen"); - pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - } + print_get_colour(fe->dr, colour, fe->printcolour, &hatch, &r, &g, &b); + /* + * Stroking in hatched colours is not permitted. + */ + assert(hatch < 0); + pen = CreatePen(PS_SOLID, width, RGB(r * 255, g * 255, b * 255)); } else { pen = fe->pens[colour]; } @@ -592,10 +587,11 @@ static void win_draw_text(void *handle, int x, int y, int fonttype, xy.y -= tm.tmAscent; } #ifndef _WIN32_WCE - if (GetTextExtentPoint32(fe->hdc, text, strlen(text), &size)) { + if (GetTextExtentPoint32(fe->hdc, text, strlen(text), &size)) #else - if (GetTextExtentPoint32(fe->hdc, wText, wcslen(wText), &size)) { + if (GetTextExtentPoint32(fe->hdc, wText, wcslen(wText), &size)) #endif + { if (align & ALIGN_HCENTRE) xy.x -= size.cx / 2; else if (align & ALIGN_HRIGHT) @@ -1621,7 +1617,10 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) if (thegame.can_configure) { AppendMenu(sub, MF_ENABLED, IDM_CONFIG, TEXT("&Custom...")); } - } + + fe->typemenu = sub; + } else + fe->typemenu = INVALID_HANDLE_VALUE; AppendMenu(menu, MF_SEPARATOR, 0, 0); #ifndef _WIN32_WCE @@ -1680,6 +1679,8 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) ShowWindow(fe->hwnd, SW_SHOWNORMAL); SetForegroundWindow(fe->hwnd); + update_type_menu_tick(fe); + midend_redraw(fe->me); return fe; @@ -2222,7 +2223,7 @@ static void about(frontend *fe) y += height/2; /* extra space before OK */ mkctrl(fe, width*2, maxwid+width*2, y, y+height*7/4, "BUTTON", - BS_PUSHBUTTON | BS_NOTIFY | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, + BS_PUSHBUTTON | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, "OK", IDOK); SendMessage(fe->cfgbox, WM_INITDIALOG, 0, 0); @@ -2465,10 +2466,10 @@ static int get_config(frontend *fe, int which) y += height/2; /* extra space before OK and Cancel */ mkctrl(fe, col1l, (col1l+col2r)/2-width, y, y+height*7/4, "BUTTON", - BS_PUSHBUTTON | BS_NOTIFY | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, + BS_PUSHBUTTON | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, "OK", IDOK); mkctrl(fe, (col1l+col2r)/2+width, col2r, y, y+height*7/4, "BUTTON", - BS_PUSHBUTTON | BS_NOTIFY | WS_TABSTOP, 0, "Cancel", IDCANCEL); + BS_PUSHBUTTON | WS_TABSTOP, 0, "Cancel", IDCANCEL); SendMessage(fe->cfgbox, WM_INITDIALOG, 0, 0); @@ -2636,10 +2637,31 @@ static void adjust_game_size(frontend *fe, RECT *proposed, int isedge, *wx_r = wx; *wy_r = wy; } +static void update_type_menu_tick(frontend *fe) +{ + int total, n, i; + + if (fe->typemenu == INVALID_HANDLE_VALUE) + return; + + total = GetMenuItemCount(fe->typemenu); + n = midend_which_preset(fe->me); + if (n < 0) + n = total - 1; /* "Custom" item */ + + for (i = 0; i < total; i++) { + int flag = (i == n ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(fe->typemenu, i, MF_BYPOSITION | flag); + } + + DrawMenuBar(fe->hwnd); +} + static void new_game_type(frontend *fe) { midend_new_game(fe->me); new_game_size(fe); + update_type_menu_tick(fe); } static int is_alt_pressed(void)