Allow printing of arbitrary messages in clocks
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 7 Apr 2020 09:44:05 +0000 (11:44 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 7 Apr 2020 09:44:05 +0000 (11:44 +0200)
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
frontend.h
gtk/xboard.c
winboard/winboard.c
xaw/xboard.c

index 84b63fc..4fa93c3 100644 (file)
--- 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);
+}
 
 //---------------------------------------------
 
index 2147dbc..e801e7e 100644 (file)
@@ -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));
index 8d3909a..04f188d 100644 (file)
@@ -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("<span font=\"%s\" background=\"%s\" foreground=\"%s\">%s</span>", appData.clockFont,
                                         bgcolor, fgcolor, buf);
index 39af55b..58508d6 100644 (file)
@@ -2070,6 +2070,7 @@ static int TranslatePieceToFontPiece( int piece )
     case WhiteLance:\r
 \r
 \r
+\r
         return PM_WL;\r
     case WhiteFalcon:\r
         return PM_WV;\r
@@ -6486,6 +6487,7 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        appData.icsActive = FALSE;\r
       } else {\r
        MessageBox(hDlg, _("Choose an option, or cancel to exit"),\r
+\r
                   _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
        return TRUE;\r
       }\r
@@ -7087,6 +7089,7 @@ HMENU
 LoadIcsTextMenu(IcsTextMenuEntry *e)\r
 {\r
   HMENU hmenu, h;\r
+\r
   int i = 0;\r
   hmenu = LoadMenu(hInst, "TextMenu");\r
   h = GetSubMenu(hmenu, 0);\r
@@ -7772,13 +7775,14 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight,
   HFONT oldFont;\r
 \r
   if (twoBoards && partnerUp) return;\r
-  if (appData.clockMode) {\r
+  if (appData.clockMode && highlight < 2) { // highlight used as kludge to force printing of message\r
     if (tinyLayout == 2)\r
       snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%c %s %s", color[0], TimeString(timeRemaining), flagFell);\r
     else\r
       snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s:_%s %s", color, TimeString(timeRemaining), flagFell);\r
     str = buf;\r
   } else {\r
+    highlight &= 1;\r
     str = color;\r
   }\r
   p = strchr(str, '_');\r
@@ -9074,17 +9078,20 @@ StartClockTimer(long millisec)
                             (UINT) millisec, NULL);\r
 }\r
 \r
+static char clockMsg[2][MSG_SIZ];\r
+\r
 void\r
 DisplayWhiteClock(long timeRemaining, int highlight)\r
 {\r
   HDC hdc;\r
-  char *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : "";\r
+  char *msg, *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : "";\r
 \r
   if(appData.noGUI) return;\r
   hdc = GetDC(hwndMain);\r
   if (!IsIconic(hwndMain)) {\r
-    DisplayAClock(hdc, timeRemaining, highlight, \r
-                       flipClock ? &blackRect : &whiteRect, _("White"), flag);\r
+    int m = (clockMsg[0][0] != 0); \r
+    DisplayAClock(hdc, timeRemaining, highlight + 2*m, \r
+                       flipClock ? &blackRect : &whiteRect, m ? clockMsg[0] : _("White"), flag);\r
   }\r
   if (highlight && iconCurrent == iconBlack) {\r
     iconCurrent = iconWhite;\r
@@ -9108,8 +9115,9 @@ DisplayBlackClock(long timeRemaining, int highlight)
   if(appData.noGUI) return;\r
   hdc = GetDC(hwndMain);\r
   if (!IsIconic(hwndMain)) {\r
-    DisplayAClock(hdc, timeRemaining, highlight, \r
-                       flipClock ? &whiteRect : &blackRect, _("Black"), flag);\r
+    int m = (clockMsg[1][0] != 0); \r
+    DisplayAClock(hdc, timeRemaining, highlight + 2*m, \r
+                       flipClock ? &whiteRect : &blackRect, m ? clockMsg[1] : _("Black"), flag);\r
   }\r
   if (highlight && iconCurrent == iconWhite) {\r
     iconCurrent = iconBlack;\r
@@ -9123,6 +9131,11 @@ DisplayBlackClock(long timeRemaining, int highlight)
     PostMessage(hwndConsole, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent);\r
 }\r
 \r
+void\r
+SetClockMessage (int color, char *msg)\r
+{\r
+  safeStrCpy(clockMsg[n], msg, MSG_SIZ);\r
+}\r
 \r
 int\r
 LoadGameTimerRunning()\r
index 87d831e..b5a4e05 100644 (file)
@@ -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);