From cc344a98d2d8e6185b3177d4a52d68adfedf8f03 Mon Sep 17 00:00:00 2001 From: H.G.Muller Date: Tue, 7 Apr 2020 11:44:05 +0200 Subject: [PATCH] Allow printing of arbitrary messages in clocks A new front-end routine SetClockMessage() can now be used to specify an arbitrary message for display in the mentioned clock. Once specified as a non-empty string, this message will overrule the time string when the clocks are refreshed though their normal routines. --- dialogs.c | 13 +++++++++++-- frontend.h | 1 + gtk/xboard.c | 14 +++++++++----- winboard/winboard.c | 25 +++++++++++++++++++------ xaw/xboard.c | 5 ++++- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/dialogs.c b/dialogs.c index 84b63fc..4fa93c3 100644 --- a/dialogs.c +++ b/dialogs.c @@ -3022,30 +3022,39 @@ SlavePopUp () SlaveResize(dualOptions+3); } +static char clockMsg[2][MSG_SIZ]; + void DisplayWhiteClock (long timeRemaining, int highlight) { + int m = (clockMsg[0][0] != 0); // printing message prevails over printing color:time if(appData.noGUI) return; if(twoBoards && partnerUp) { DisplayTimerLabel(&dualOptions[0], _("White"), timeRemaining, highlight); return; } - DisplayTimerLabel(&mainOptions[W_WHITE], _("White"), timeRemaining, highlight); + DisplayTimerLabel(&mainOptions[W_WHITE], m ? clockMsg[0] : _("White"), timeRemaining, highlight + 2*m); if(highlight) SetClockIcon(0); } void DisplayBlackClock (long timeRemaining, int highlight) { + int m = (clockMsg[1][0] != 0); if(appData.noGUI) return; if(twoBoards && partnerUp) { DisplayTimerLabel(&dualOptions[1], _("Black"), timeRemaining, highlight); return; } - DisplayTimerLabel(&mainOptions[W_BLACK], _("Black"), timeRemaining, highlight); + DisplayTimerLabel(&mainOptions[W_BLACK], m ? clockMsg[1] : _("Black"), timeRemaining, highlight + 2*m); if(highlight) SetClockIcon(1); } +void +SetClockMessage (int n, char *msg) +{ + safeStrCpy(clockMsg[n], msg, MSG_SIZ); +} //--------------------------------------------- diff --git a/frontend.h b/frontend.h index 2147dbc..e801e7e 100644 --- a/frontend.h +++ b/frontend.h @@ -120,6 +120,7 @@ int StopClockTimer P((void)); void StartClockTimer P((long millisec)); void DisplayWhiteClock P((long timeRemaining, int highlight)); void DisplayBlackClock P((long timeRemaining, int highlight)); +void SetClockMessage P((int color, char *msg)); void UpdateLogos P((int display)); int LoadGameTimerRunning P((void)); diff --git a/gtk/xboard.c b/gtk/xboard.c index 8d3909a..04f188d 100644 --- a/gtk/xboard.c +++ b/gtk/xboard.c @@ -2136,6 +2136,15 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) char bgcolor[10]; char fgcolor[10]; + if(highlight > 1) { // kludge to force message printing + highlight &= 1; + snprintf(buf, MSG_SIZ, " %s", color); + } else if (appData.clockMode) { + snprintf(buf, MSG_SIZ, "%s:_%s", color, TimeString(timer)); + } else { + snprintf(buf, MSG_SIZ, "%s ", color); + } + if (highlight) { strcpy(bgcolor, "black"); strcpy(fgcolor, "white"); @@ -2154,11 +2163,6 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) gdk_color_parse( bgcolor, &col ); gtk_widget_modify_bg(gtk_widget_get_parent(opt->handle), GTK_STATE_NORMAL, &col); - if (appData.clockMode) { - snprintf(buf, MSG_SIZ, "%s:_%s", color, TimeString(timer)); - } else { - snprintf(buf, MSG_SIZ, "%s ", color); - } p = strchr(buf, '_'); if(p) *p = (two ? '\n' : ' '); markup = g_markup_printf_escaped("%s", appData.clockFont, bgcolor, fgcolor, buf); diff --git a/winboard/winboard.c b/winboard/winboard.c index 39af55b..58508d6 100644 --- a/winboard/winboard.c +++ b/winboard/winboard.c @@ -2070,6 +2070,7 @@ static int TranslatePieceToFontPiece( int piece ) case WhiteLance: + return PM_WL; case WhiteFalcon: return PM_WV; @@ -6486,6 +6487,7 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) appData.icsActive = FALSE; } else { MessageBox(hDlg, _("Choose an option, or cancel to exit"), + _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return TRUE; } @@ -7087,6 +7089,7 @@ HMENU LoadIcsTextMenu(IcsTextMenuEntry *e) { HMENU hmenu, h; + int i = 0; hmenu = LoadMenu(hInst, "TextMenu"); h = GetSubMenu(hmenu, 0); @@ -7772,13 +7775,14 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight, HFONT oldFont; if (twoBoards && partnerUp) return; - if (appData.clockMode) { + if (appData.clockMode && highlight < 2) { // highlight used as kludge to force printing of message if (tinyLayout == 2) snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%c %s %s", color[0], TimeString(timeRemaining), flagFell); else snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s:_%s %s", color, TimeString(timeRemaining), flagFell); str = buf; } else { + highlight &= 1; str = color; } p = strchr(str, '_'); @@ -9074,17 +9078,20 @@ StartClockTimer(long millisec) (UINT) millisec, NULL); } +static char clockMsg[2][MSG_SIZ]; + void DisplayWhiteClock(long timeRemaining, int highlight) { HDC hdc; - char *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : ""; + char *msg, *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : ""; if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, - flipClock ? &blackRect : &whiteRect, _("White"), flag); + int m = (clockMsg[0][0] != 0); + DisplayAClock(hdc, timeRemaining, highlight + 2*m, + flipClock ? &blackRect : &whiteRect, m ? clockMsg[0] : _("White"), flag); } if (highlight && iconCurrent == iconBlack) { iconCurrent = iconWhite; @@ -9108,8 +9115,9 @@ DisplayBlackClock(long timeRemaining, int highlight) if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, - flipClock ? &whiteRect : &blackRect, _("Black"), flag); + int m = (clockMsg[1][0] != 0); + DisplayAClock(hdc, timeRemaining, highlight + 2*m, + flipClock ? &whiteRect : &blackRect, m ? clockMsg[1] : _("Black"), flag); } if (highlight && iconCurrent == iconWhite) { iconCurrent = iconBlack; @@ -9123,6 +9131,11 @@ DisplayBlackClock(long timeRemaining, int highlight) PostMessage(hwndConsole, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent); } +void +SetClockMessage (int color, char *msg) +{ + safeStrCpy(clockMsg[n], msg, MSG_SIZ); +} int LoadGameTimerRunning() diff --git a/xaw/xboard.c b/xaw/xboard.c index 87d831e..b5a4e05 100644 --- a/xaw/xboard.c +++ b/xaw/xboard.c @@ -2340,7 +2340,10 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) (timer / 1000) < appData.icsAlarmTime) foregroundOrWarningColor = lowTimeWarningColor; - if (appData.clockMode) { + if(highlight > 1) { + highlight &= 1; + snprintf(buf, MSG_SIZ, "%s", color); + } else if (appData.clockMode) { snprintf(buf, MSG_SIZ, "%s:_%s", color, TimeString(timer)); } else { snprintf(buf, MSG_SIZ, "%s ", color); -- 1.7.0.4