X-Git-Url: http://winboard.nl/cgi-bin?p=xboard.git;a=blobdiff_plain;f=dialogs.c;h=9b4870423bd6e816db4495eb8b7eecdf32dc4d8a;hp=4dce7f460693dc62dd92db6c7c54768e15aef540;hb=HEAD;hpb=b30c8555a01a10761ef8d5030223bdd6a1a408c9 diff --git a/dialogs.c b/dialogs.c index 4dce7f4..9b48704 100644 --- 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; @@ -624,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:") }, @@ -940,10 +941,10 @@ static Option boardOptions[] = { { 0, 0, 200, NULL, (void*) &appData.logoSize, "", NULL, Spin, N_("Logo Size (0=off, requires restart):") }, { 0,-1, 5, NULL, (void*) &appData.overrideLineGap, "", NULL, Spin, N_("Line Gap (-1 = default for board size):") }, { 0, 0, 0, NULL, (void*) &appData.useBitmaps, "", NULL, CheckBox, N_("Use Board Textures") }, -{ 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, ".png", NULL, FileName, N_("Light-Squares Texture File:") }, -{ 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, ".png", NULL, FileName, N_("Dark-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, ".png", (char**)(intptr_t) 1, FileName, N_("Dark-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, ".png", (char**)(intptr_t) 2, FileName, N_("Light-Squares Texture File:") }, { 0, 0, 0, NULL, (void*) &appData.trueColors, "", NULL, CheckBox, N_("Use external piece bitmaps with their own colors") }, -{ 0, 0, 0, NULL, (void*) &appData.pieceDirectory, "", NULL, PathName, N_("Directory with Pieces Images:") }, +{ 0, 0, 0, NULL, (void*) &appData.pieceDirectory, "", (char**)(intptr_t) 3, PathName, N_("Directory with Pieces Images:") }, { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" } }; @@ -1040,6 +1041,7 @@ void SendString (char *p) { char buf[MSG_SIZ], buf2[MSG_SIZ], *q; + if(q = strstr(p, "$name")) { // in Xaw this is already intercepted if(!shellUp[TextMenuDlg] || !clickedWord[0]) return; strncpy(buf2, p, MSG_SIZ); @@ -1222,9 +1224,9 @@ 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 }, +{ 200, T_VSCRL | T_FILL | 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") }, { 0,SAME_ROW,100,NULL, (void*) &changeTags, NULL, NULL, Button, N_("commit changes") }, { 0,SAME_ROW, 0, NULL, (void*) &NewTagsCallback, "", NULL, EndMark , "" } @@ -1277,11 +1279,11 @@ EditTagsPopUp (char *tags, char **dest) } void -EditEnginePopUp (char *tags, char **dest) +EditAnyPopUp (char *tags, char **dest, char *title) { // wrapper to preserve old name used in back-end TagsPopDown(); resPtr = dest; - NewTagsPopup(tags, NULL, _("Registered Engines")); + NewTagsPopup(tags, NULL, title); } void @@ -1606,10 +1608,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); } @@ -1619,6 +1621,154 @@ ShuffleMenuProc () GenericPopUp(shuffleOptions, _("New Shuffle Game"), TransientDlg, BoardWindow, MODAL, 0); } +//--------------------------------------------------- Fonts ------------------------------ + +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) +{ + int i; + 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 0; // suppress normal popdown because already done +} + +static Option fontOptions[] = { + { 0, 60, 200, NULL, (void*) &appData.clockFont, NULL, NULL, TextBox, N_("Clocks (requires restart):") }, + { 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.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") }, + { 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 , "" } +}; + +static char name[MSG_SIZ], *bold, *ital, points; + +static void +BreakUp (char *font) +{ + char *p = name, *norm; + safeStrCpy(name, font, MSG_SIZ); + bold = StrCaseStr(name, "bold"); + ital = StrCaseStr(name, "ital"); + norm = StrCaseStr(name, "normal"); + points = 0; + while(p && *p && !(points = atoi(p))) p = strchr(p+1, ' '); + if(points) p[*p == ' '] = 0; + if(bold) *bold = 0; + if(ital) *ital = 0; + if(norm) *norm = 0; +} + +static void +Collect () +{ + if(bold) strcat(name, "Bold "); + if(ital) strcat(name, "Italic "); + if(!ital && !bold && strlen(name) < 2) strncpy(name, "Normal ", MSG_SIZ); + if(points) sprintf(name + strlen(name), "%d", points); else strcat(name, "%d"); +} + +static void +AdjustFont (int n) +{ + int button = fontOptions[n].value, base = n - button; + char *oldFont; + GetWidgetText(&fontOptions[base], &oldFont); + BreakUp(oldFont); // take apart old font name + switch(button) { + case 1: points++; break; + case 2: points--; break; + case 3: if(bold) bold = NULL; else bold = name; break; + case 4: if(ital) ital = NULL; else ital = name; break; + } + Collect(); + SetWidgetText(&fontOptions[base], name, TransientDlg); + ApplyFont(&fontOptions[base], name); +} + +void +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<7; i++) { + ApplyFont(&fontOptions[6*i], *(char**)fontOptions[6*i].target); + ASSIGN(oldFont[i], *(char**)fontOptions[6*i].target); + } +} + //------------------------------------------------------ Time Control ----------------------------------- static int TcOK P((int n)); @@ -2119,6 +2269,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 +2601,7 @@ DisplayTitle (char *text) } char *textPtr; +char *texEscapes[] = { "s-1", "s0", "&", "*(L", "*(R", NULL }; int GetNext(FILE *f) @@ -2470,20 +2625,34 @@ 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; + 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)) { - while((line = ReadLine(f)) && (cnt == 0 || strncmp(line, ".B ", 3) && strncmp(line, ".SS ", 4))) { + 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; } if(*line == '.') continue; *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++; } @@ -2494,15 +2663,15 @@ 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); } void DisplayHelp (char *name) { - static char *xboardMan, *manText[2]; - char buf[MSG_SIZ], tidy[MSG_SIZ], *eng; + static char *xboardMan, *manText[2], tidy[MSG_SIZ], engMan[MSG_SIZ]; + char buf[MSG_SIZ], adapter[MSG_SIZ], *eng; int n = 0; FILE *f; if(!xboardMan) { @@ -2510,26 +2679,39 @@ DisplayHelp (char *name) if(xboardMan) xboardMan[strlen(xboardMan)-1] = NULLCHAR; // strip off traling linefeed } if(currentCps) { // for engine options we have to look in engine manual - snprintf(tidy, MSG_SIZ, "man -w "); - TidyProgramName(currentCps == &first ? appData.firstChessProgram : appData.secondChessProgram, "localhost", tidy+7); - eng = BufferCommandOutput(tidy, MSG_SIZ); - safeStrCpy(buf, eng, strlen(eng)); - FREE(eng); - n = 1; - } else snprintf(buf, MSG_SIZ, "%s", xboardMan); + snprintf(buf, MSG_SIZ, "man -w "); // get (tidied) engine name in buf + TidyProgramName(currentCps->program, "localhost", adapter); // name of binary we are actually running + TidyProgramName(currentCps == &first ? appData.firstChessProgram : appData.secondChessProgram, "localhost", buf+7); + if(strcmp(buf+7, adapter) && StrCaseStr(name, adapter) == name) { // option starts with name of apparent proxy for engine + safeStrCpy(buf+7, adapter, MSG_SIZ-7); // use adapter manual + name += strlen(adapter); // strip adapter name of option + while(*name == ' ') name++; + } + if(strcmp(buf, tidy)) { // is different engine from last time + FREE(manText[1]); manText[1] = NULL; // so any currently held text is worthless + safeStrCpy(tidy, buf, MSG_SIZ); // remember current engine + eng = BufferCommandOutput(tidy, MSG_SIZ); // obtain path to its man file + if(*eng) + safeStrCpy(engMan, eng, strlen(eng)); // and remember that too + else *engMan = NULLCHAR; + FREE(eng); + } + safeStrCpy(buf, engMan, MSG_SIZ); n = 1; // use engine man + } 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); manText[n] = BufferCommandOutput(tidy, 250000); // store unzipped in buffer } - textPtr = manText[n]; - } else textPtr = NULL; + textPtr = manText[n];// use buffered unzipped text + } else textPtr = NULL; // use plaintext man file directly GetHelpText(f, name); fclose(f); - if(currentCps) free(manText[1]), manText[1] = NULL; // never reuse engine text - } + } else if(currentCps) DisplayNote("No manual is installed for this engine"); } #define PAUSE_BUTTON "P" @@ -3134,10 +3316,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 @@ -3150,7 +3336,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);