Fix erasing of premove highlights XB
[xboard.git] / dialogs.c
index e9a1718..84ac446 100644 (file)
--- a/dialogs.c
+++ b/dialogs.c
@@ -66,7 +66,7 @@ extern char *getenv();
 
 int values[MAX_OPTIONS];
 ChessProgramState *currentCps;
-char dataDir[MSG_SIZ] = DATADIR, manDir[MSG_SIZ] = MANDIR;
+char manDir[MSG_SIZ] = MANDIR;
 
 //----------------------------Generic dialog --------------------------------------------
 
@@ -546,7 +546,7 @@ Pick (int n)
        }
 
        gameInfo.variant = v;
-       appData.variant = VariantName(v);
+       ASSIGN(appData.variant, VariantName(v));
 
        shuffleOpenings = FALSE; /* [HGM] shuffle: possible shuffle reset when we switch */
        startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */
@@ -555,8 +555,9 @@ Pick (int n)
        appData.NrFiles = filesTmp;
        appData.holdingsSize = sizeTmp;
        appData.pieceToCharTable = NULL;
-       appData.pieceNickNames = "";
-       appData.colorNickNames = "";
+       ASSIGN(appData.pieceNickNames, "");
+       ASSIGN(appData.colorNickNames, "");
+       ASSIGN(appData.men, "");
         PopDown(TransientDlg);
        Reset(True, True);
         return;
@@ -1606,10 +1607,10 @@ static Option shuffleOptions[] = {
 static void
 SetRandom (int n)
 {
-    int r = n==2 ? -1 : random() & (1<<30)-1;
+    int r = n==3 ? -1 : random() & (1<<30)-1;
     char buf[MSG_SIZ];
     snprintf(buf, MSG_SIZ,  "%d", r);
-    SetWidgetText(&shuffleOptions[1], buf, TransientDlg);
+    SetWidgetText(&shuffleOptions[2], buf, TransientDlg);
     SetWidgetState(&shuffleOptions[0], True);
 }
 
@@ -2119,6 +2120,10 @@ void
 ConsoleWrite(char *message, int count)
 {
     if(shellUp[ChatDlg] && chatOptions[CHAT_ICS].type != Skip) { // in Xaw this is a no-op
+       if(*message == 7) {
+           message++; // remove bell
+           if(strcmp(message, "\n")) return;
+       }
        AppendColorized(&chatOptions[CHAT_ICS], message, count);
        SetInsertPos(&chatOptions[CHAT_ICS], 999999);
     }
@@ -2447,6 +2452,7 @@ DisplayTitle (char *text)
 }
 
 char *textPtr;
+char *texEscapes[] = { "s-1", "s0", "&", "*(L", "*(R", NULL };
 
 int
 GetNext(FILE *f)
@@ -2470,9 +2476,10 @@ GetHelpText (FILE *f, char *name)
 {
     char *line, buf[MSG_SIZ], title[MSG_SIZ], text[10000], *p = text, *q = text;
     int len, cnt = 0;
+    while(*name == '\n') name++;
     snprintf(buf, MSG_SIZ, ".B %s", name);
     len = strlen(buf);
-    for(len=1; buf[len] == ' ' || buf[len] == '-' || isalpha(buf[len]) || isdigit(buf[len]); len++);
+    for(len=3; buf[len] && buf[len] != '(' && buf[len] != ':' && buf[len] != '.' && buf[len] != '?' && buf[len] != '\n'; len++);
     buf[len] = NULLCHAR;
     while(buf[--len] == ' ') buf[len] = NULLCHAR;
     snprintf(title, MSG_SIZ, "Help on '%s'", buf+3);
@@ -2485,6 +2492,18 @@ GetHelpText (FILE *f, char *name)
                *p++ = ' '; cnt++;
                while(*line) {
                    if(*line < ' ') { line++; continue;}
+                   if(*line == '\\') {
+                       char **esc;
+                       line++;
+                       for(esc = texEscapes; *esc; esc++) {
+                           len = strlen(*esc);
+                           if(!strncmp(*esc, line, len)) {
+                               line += len;
+                               break;
+                           }
+                       }
+                       continue;
+                   }
                    if(*line == ' ' && p - q > 80) *line = '\n', q = p;
                    *p++ = *line++;
                }
@@ -2530,6 +2549,8 @@ DisplayHelp (char *name)
     } else snprintf(buf, MSG_SIZ, "%s", xboardMan);   // use xboard man
     f = fopen(buf, "r");
     if(f) {
+       char *msg = "Right-clicking menu item or dialog text pops up help on it";
+       ASSIGN(appData.suppress, msg);
        if(strstr(buf, ".gz")) { // man file is gzipped
            if(!manText[n]) {    // unzipped text not buffered yet
                snprintf(tidy, MSG_SIZ, "gunzip -c %s", buf);
@@ -2539,7 +2560,7 @@ DisplayHelp (char *name)
        } else textPtr = NULL;   // use plaintext man file directly
        GetHelpText(f, name);
        fclose(f);
-    }
+    } else if(currentCps) DisplayNote("No manual is installed for this engine");
 }
 
 #define PAUSE_BUTTON "P"