Provide help clicks on recently-used-engines menu items
[xboard.git] / dialogs.c
index fddc8fd..8624ff4 100644 (file)
--- a/dialogs.c
+++ b/dialogs.c
@@ -625,9 +625,9 @@ CommonOptionsOK (int n)
 static Option commonEngineOptions[] = {
 { 0,  0,    0, NULL, (void*) &appData.ponderNextMove, "", NULL, CheckBox, N_("Ponder Next Move") },
 { 0,  0, 1000, NULL, (void*) &appData.smpCores, "", NULL, Spin, N_("Maximum Number of CPUs per Engine:") },
-{ 0,  0,    0, NULL, (void*) &appData.polyglotDir, "", NULL, PathName, N_("Polygot Directory:") },
+{ 0,  0,    0, NULL, (void*) &appData.polyglotDir, NULL, NULL, PathName, N_("Polygot Directory:") },
 { 0,  0,16000, NULL, (void*) &appData.defaultHashSize, "", NULL, Spin, N_("Hash-Table Size (MB):") },
-{ 0,  0,    0, NULL, (void*) &egtPath, "", NULL, PathName, N_("EGTB Path:") },
+{ 0,  0,    0, NULL, (void*) &egtPath, NULL, NULL, PathName, N_("EGTB Path:") },
 { 0,  0, 1000, NULL, (void*) &appData.defaultCacheSizeEGTB, "", NULL, Spin, N_("EGTB Cache Size (MB):") },
 { 0,  0,    0, NULL, (void*) &appData.usePolyglotBook, "", NULL, CheckBox, N_("Use GUI Book") },
 { 0,  0,    0, NULL, (void*) &appData.polyglotBook, ".bin", NULL, FileName, N_("Opening-Book Filename:") },
@@ -1223,7 +1223,7 @@ NewMove ()
     addToBookFlag = !addToBookFlag;
 }
 
-static Option tagsOptions[] = {
+Option tagsOptions[] = {
 {   0,   0,   0, NULL, NULL, NULL, NULL, Label,  NULL },
 { 200, T_VSCRL | T_FILL | T_WRAP | T_TOP, 200, NULL, (void*) &tagsText, NULL, (char **) &TagsClick, TextBox, "", &appData.tagsFont },
 {   0,   0, 100, NULL, (void*) &NewMove,    NULL, NULL, Button, N_("add next move") },
@@ -1624,23 +1624,43 @@ ShuffleMenuProc ()
 
 static void AdjustFont P((int n));
 
+static char *oldFont[7];
+
+static int
+NewFont (int n, int fnr, char *font)
+{   // figure out if font changed, and if so, store it in the fonts table as a side effect
+    if(!strcmp(oldFont[n], font)) return 0; // not changed
+    ASSIGN(fontTable[fnr][initialSquareSize], font);
+    fontIsSet[fnr] = fontValid[fnr][initialSquareSize] = True;
+    return 1; // changed
+}
+
 static int
 FontsOK (int n)
 {
-    extern Option historyOptions[], engoutOptions[], gamesOptions[], chatOptions[];
     int i;
-    DisplayBothClocks();
-    ApplyFont(&mainOptions[W_MESSG], NULL);
-    for(i=1; i<6; i++) ApplyFont(&mainOptions[W_BUTTON+i], NULL);
-    ApplyFont(&tagsOptions[1], NULL);
-    ApplyFont(&historyOptions[0], NULL);
-    ApplyFont(&engoutOptions[5], NULL);
-    ApplyFont(&engoutOptions[12], NULL);
-    ApplyFont(&gamesOptions[0], NULL);
-    ApplyFont(&chatOptions[11], appData.icsFont);
-    AppendColorized(&chatOptions[6], NULL, 0); // kludge to replace font tag
+    PopDown(TransientDlg); // Early popdown to prevent expose events frommasking each other
+    LockBoardSize(0);
+    if(NewFont(0, CLOCK_FONT,   appData.clockFont)) DisplayBothClocks();
+    if(NewFont(1, MESSAGE_FONT, appData.font)) {
+       ApplyFont(&mainOptions[W_MESSG], NULL);
+       for(i=1; i<6; i++) ApplyFont(&mainOptions[W_BUTTON+i], NULL);
+    }
+    LockBoardSize(1); // unlock
+    if(NewFont(3, EDITTAGS_FONT,    appData.tagsFont))    ApplyFont(&tagsOptions[1], NULL);
+    if(NewFont(4, COMMENT_FONT,     appData.commentFont)) ApplyFont(&commentOptions[0], NULL);
+    if(NewFont(5, MOVEHISTORY_FONT, appData.historyFont)) {
+       ApplyFont(&historyOptions[0], NULL);
+       ApplyFont(&engoutOptions[5], NULL);
+       ApplyFont(&engoutOptions[12], NULL);
+    }
+    if(NewFont(6, GAMELIST_FONT, appData.gameListFont)) ApplyFont(&gamesOptions[0], NULL);
+    if(NewFont(2, CONSOLE_FONT,  appData.icsFont)) {
+       ApplyFont(&chatOptions[11], appData.icsFont);
+       AppendColorized(&chatOptions[6], NULL, 0); // kludge to replace font tag
+    }
     DrawPosition(TRUE, NULL); // for coord font
-    return 1;
+    return 0; // suppress normal popdown because already done
 }
 
 static Option fontOptions[] = {
@@ -1649,37 +1669,45 @@ static Option fontOptions[] = {
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.font, NULL, NULL, TextBox, N_("Message (above board):") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.icsFont, NULL, NULL, TextBox, N_("ICS Chat/Console:") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.tagsFont, NULL, NULL, TextBox, N_("Edit tags / book / engine list:") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.commentFont, NULL, NULL, TextBox, N_("Edit comments:") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.historyFont, NULL, NULL, TextBox, N_("Move history / Engine Output:") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
   { 0,         60, 70, NULL, (void*) &appData.gameListFont, NULL, NULL, TextBox, N_("Game list:") },
   {    1, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("+") },
   {    2, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("-") },
   {    3, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("B") },
   {    4, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("I") },
-  {   0,  0,    0, NULL, NULL, NULL, NULL, Label, N_("\nGeneric type-face names are Sans, Monospace and Serif") },
+  {  666, SAME_ROW, 0, NULL, (void*) &AdjustFont, NULL, NULL, Button, N_("*") },
+  {   0,  0,    0, NULL, NULL, NULL, NULL, Label, N_("\nThe * buttons will set the font to the one selected below:") },
+  {   0,  0,    0, NULL, NULL, NULL, NULL, Button, "fontsel" },
   { 0, 0, 0, NULL, (void*) &FontsOK, "", NULL, EndMark , "" }
 };
 
@@ -1734,7 +1762,10 @@ FontsProc ()
     int i;
     if(strstr(appData.font, "-*-")) { DisplayNote(_("This only works in the GTK build")); return; }
     GenericPopUp(fontOptions, _("Fonts"), TransientDlg, BoardWindow, MODAL, 0);
-    for(i=0; i<6; i++) ApplyFont(&fontOptions[5*i], *(char**)fontOptions[5*i].target);
+    for(i=0; i<7; i++) {
+       ApplyFont(&fontOptions[6*i], *(char**)fontOptions[6*i].target);
+       ASSIGN(oldFont[i], *(char**)fontOptions[6*i].target);
+    }
 }
 
 //------------------------------------------------------ Time Control -----------------------------------
@@ -2598,10 +2629,10 @@ GetHelpText (FILE *f, char *name)
     len = strlen(buf);
     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;
+    while(buf[--len] == ' ') buf[len] = NULLCHAR; len++;
     snprintf(title, MSG_SIZ, "Help on '%s'", buf+3);
     while((line = ReadLine(f))) {
-       if(!strncmp(line, buf, ++len) || !strncmp(line, ".SS ", 4) && !strncmp(line+4, buf+3, len-3)
+       if(!strncmp(line, buf, len) || !strncmp(line, ".SS ", 4) && !strncmp(line+4, buf+3, len-3)
                              || !strncmp(line, ".IX Item \"", 10) && !strncmp(line+10, buf+3, len-3)) {
            while((line = ReadLine(f)) && (cnt == 0 || strncmp(line, ".B ", 3) && strncmp(line, ".SS ", 4) && strncmp(line, ".IX ", 4))) {
                if(!*line) { *p++ = '\n'; *p++ = '\n'; q = p; continue; }
@@ -2631,7 +2662,7 @@ GetHelpText (FILE *f, char *name)
            return;
        }
     }
-    snprintf(text, MSG_SIZ, "No help on '%s'\n", buf+3);
+    snprintf(text, MSG_SIZ, "No help available on '%s'\n", buf+3);
     DisplayNote(text);
 }
 
@@ -3282,10 +3313,14 @@ DirSelProc (int n, int sel)
 void
 StartDir (char *filter, char *newName)
 {
-    static char *gamesDir, *trnDir, *imgDir, *bookDir;
+    static char *gamesDir, *trnDir, *imgDir, *bookDir, *dirDir;
     static char curDir[MSG_SIZ];
     char **res = NULL;
     if(!filter || !*filter) return;
+    if(strstr(filter, "dir")) {
+       res = &dirDir;
+       if(!dirDir) dirDir= strdup(dataDir);
+    } else
     if(strstr(filter, "pgn")) res = &gamesDir; else
     if(strstr(filter, "bin")) res = &bookDir; else
     if(strstr(filter, "png")) res = &imgDir; else
@@ -3298,7 +3333,9 @@ StartDir (char *filter, char *newName)
                ASSIGN(*res, newName);
                for(p=*res; q=strchr(p, '/');) p = q + 1; *p = NULLCHAR;
            }
-           if(*curDir) chdir(curDir);
+       }
+       if(*curDir) {
+           chdir(curDir);
            *curDir = NULLCHAR;
        } else {
            getcwd(curDir, MSG_SIZ);