X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=dialogs.c;h=c1d093017cb46f18f86eaa67dcfeef92928d9492;hb=v4.9.x;hp=11a3be351b4a9f755b46962128058e01ac359214;hpb=406c6ab4dfbef3ace867dbe2ffd54072e4e48113;p=xboard.git diff --git a/dialogs.c b/dialogs.c index 11a3be3..753b331 100644 --- a/dialogs.c +++ b/dialogs.c @@ -64,6 +64,7 @@ extern char *getenv(); #endif +int initialSquareSize; int values[MAX_OPTIONS]; ChessProgramState *currentCps; char manDir[MSG_SIZ] = MANDIR; @@ -494,10 +495,12 @@ static Option variantDescriptors[] = { { VariantFairy, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("fairy")}, { VariantXiangqi, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFFF", NULL, Button, N_("xiangqi (9x10)")}, { VariantLion, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("mighty lion")}, -{ VariantCourier, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("courier (12x8)")}, +{ VariantJanggi, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFFF", NULL, Button, N_("Janggi (9x10)")}, // dummy, to have good alignment { VariantChuChess, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("elven chess (10x10)")}, -{ VariantChu, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("chu shogi (12x12)")}, +{ VariantCourier, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("courier (12x8)")}, +{ VariantDuck, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("Duck Chess")}, //{ -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment +{ VariantChu, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("chu shogi (12x12)")}, // optional buttons for engine-defined variants { 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" }, { 0, SAME_ROW, 0, NULL, NULL, NULL, NULL, Skip, ""}, @@ -625,9 +628,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:") }, @@ -849,7 +852,7 @@ static Option soundOptions[] = { { 0, 0, 0, NULL, (void*) &appData.soundIcsAlarm, (char*) soundFiles, soundNames, ComboBox, N_("Alarm:") }, { 0, 0, 0, NULL, (void*) &appData.soundChallenge, (char*) soundFiles, soundNames, ComboBox, N_("Challenge:") }, { 0, SAME_ROW, 0, NULL, NULL, NULL, NULL, Break, "" }, -{ 0, 0, 0, NULL, (void*) &appData.soundDirectory, "", NULL, PathName, N_("Sounds Directory:") }, +{ 0, 0, 0, NULL, (void*) &appData.soundDirectory, NULL, NULL, PathName, N_("Sounds Directory:") }, { 0, 0, 0, NULL, (void*) &appData.soundShout, (char*) soundFiles, soundNames, ComboBox, N_("Shout:") }, { 0, 0, 0, NULL, (void*) &appData.soundSShout, (char*) soundFiles, soundNames, ComboBox, N_("S-Shout:") }, { 0, 0, 0, NULL, (void*) &appData.soundChannel, (char*) soundFiles, soundNames, ComboBox, N_("Channel:") }, @@ -866,7 +869,9 @@ static void Test (int n) { GenericReadout(soundOptions, 1); + mute <<= 1; // temporarily enable if(soundFiles[values[2]]) PlaySoundFile(soundFiles[values[2]]); + mute >>= 1; } void @@ -941,10 +946,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, NULL, (char**)(intptr_t) 3, PathName, N_("Directory with Pieces Images:") }, { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" } }; @@ -1041,6 +1046,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); @@ -1212,7 +1218,7 @@ static int NewTagsCallback (int n) { if(bookUp) SaveToBook(tagsText), DisplayBook(currentMove); else - if(resPtr) { ASSIGN(*resPtr, tagsText); } else + if(resPtr) { ASSIGN(*resPtr, tagsText); if(resPtr == &firstChessProgramNames) SaveEngineList(); } else ReplaceTags(tagsText, &gameInfo); return 1; } @@ -1223,9 +1229,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 , "" } @@ -1242,9 +1248,7 @@ static void changeTags (int n) { GenericReadout(tagsOptions, 1); - if(bookUp) SaveToBook(tagsText), DisplayBook(currentMove); else - if(resPtr) { ASSIGN(*resPtr, tagsText); } else - ReplaceTags(tagsText, &gameInfo); + NewTagsCallback(0); } void @@ -1278,11 +1282,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 @@ -1492,28 +1496,33 @@ RefreshSettingsDialog (ChessProgramState *cps, int val) //----------------------------------------------- Load Engine -------------------------------------- -char *engineDir, *engineLine, *nickName, *params; +char *engineDir, *engineLine, *nickName, *params, *protocolChoice; Boolean isUCI, isUSI, hasBook, storeVariant, v1, addToList, useNick, secondEng; static void EngSel P((int n, int sel)); static int InstallOK P((int n)); +static char *protocols[] = { "autodetect", "WB", "UCI", "USI/UCCI", "WB v1", NULL }; + static Option installOptions[] = { { 0,LR|T2T, 0, NULL, NULL, NULL, NULL, Label, N_("Select engine from list:") }, { 300,LR|TB,200, NULL, (void*) engineMnemonic, (char*) &EngSel, NULL, ListBox, "" }, { 0,SAME_ROW, 0, NULL, NULL, NULL, NULL, Break, NULL }, { 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") }, +{ 0, 0, 0, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine Command:") }, +{ 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("------------- User preferences (optional) ---------------") }, { 0, 0, 0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Nickname (optional):") }, { 0, 0, 0, NULL, (void*) &useNick, NULL, NULL, CheckBox, N_("Use nickname in PGN player tags of engine-engine games") }, -{ 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("Engine Directory:") }, -{ 0, 0, 0, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine Command:") }, -{ 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when empty)") }, -{ 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") }, -{ 0, 0, 0, NULL, (void*) &isUSI, NULL, NULL, CheckBox, N_("USI/UCCI (uses specified -uxiAdapter)") }, -{ 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (do not wait for engine features)") }, +{ 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") }, { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") }, -{ 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, +{ 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("--------- Advanced (only change in exceptional cases) ----------") }, +{ 0, 0, 5, NULL, (void*) &protocolChoice, (char*) protocols, protocols, ComboBox, N_("Engine Protocol:") }, +{ 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("Engine Directory:") }, +{ 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when empty)") }, +//{ 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") }, +//{ 0, 0, 0, NULL, (void*) &isUSI, NULL, NULL, CheckBox, N_("USI/UCCI (uses specified -uxiAdapter)") }, +//{ 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (do not wait for engine features)") }, { 0, 0, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" } }; @@ -1522,6 +1531,12 @@ InstallOK (int n) { if(n && (n = SelectedListBoxItem(&installOptions[1])) > 0) { // called by pressing OK, and engine selected ASSIGN(engineLine, engineList[n]); + } else switch(values[12]) { + case 0: isUCI = 3; break; + case 2: isUCI = 1; break; + case 3: isUSI = 1; break; + case 4: v1 = 1; + case 1: break; } PopDown(TransientDlg); // early popdown, to allow FreezeUI to instate grab if(isUSI) { @@ -1553,10 +1568,13 @@ EngSel (int n, int sel) static void LoadEngineProc (int engineNr, char *title) { + int p = appData.defProtocol; + if(*engineListFile) ParseSettingsFile(engineListFile, &engineListFile); // contains engine list + if(p >= 0 && p < 5) protocolChoice = protocols[p]; isUCI = isUSI = storeVariant = v1 = useNick = False; addToList = hasBook = True; // defaults secondEng = engineNr; if(engineLine) free(engineLine); engineLine = strdup(""); - if(engineDir) free(engineDir); engineDir = strdup("."); + if(engineDir) free(engineDir); engineDir = strdup(appData.defEngDir); if(nickName) free(nickName); nickName = strdup(""); if(params) free(params); params = strdup(""); ASSIGN(engineMnemonic[0], ""); @@ -1624,62 +1642,90 @@ 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[] = { - { 0, 60, 200, NULL, (void*) &appData.clockFont, NULL, NULL, TextBox, N_("Clocks:") }, + { 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") }, - { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("Generic 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 , "" } }; @@ -1732,8 +1778,12 @@ 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<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 ----------------------------------- @@ -2131,8 +2181,10 @@ ChatOK (int n) // from here on it could be back-end if(line[strlen(line)-1] == '\n') line[strlen(line)-1] = NULLCHAR; SaveInHistory(line); - if(hidden || !*chatPartner[activePartner]) snprintf(buf, MSG_SIZ, "%s\n", line); else // command for ICS - if(!strcmp("whispers", chatPartner[activePartner])) + if(hidden || !*chatPartner[activePartner]) { // command for ICS + snprintf(buf, MSG_SIZ, "%s\n", line); + if(!remoteEchoOption) ConsoleWrite(buf, strlen(buf)); + } else if(!strcmp("whispers", chatPartner[activePartner])) snprintf(buf, MSG_SIZ, "whisper %s\n", line); // WHISPER box uses "whisper" to send else if(!strcmp("shouts", chatPartner[activePartner])) snprintf(buf, MSG_SIZ, "shout %s\n", line); // SHOUT box uses "shout" to send @@ -2487,12 +2539,12 @@ DisplayMoveError (String message) void DisplayFatalError (String message, int error, int status) { - char buf[MSG_SIZ]; + char buf[MSG_SIZ], logout = appData.icsActive; if(status == 666) { // ignore this error when ICS Console window is up if(shellUp[ChatDlg]) return; status = 0; - } + } else if(status == 6666) status = logout = 0; // 6666 = kludge that indicates ICS connection already closed errorExitStatus = status; if (error == 0) { @@ -2505,7 +2557,7 @@ DisplayFatalError (String message, int error, int status) } if(mainOptions[W_BOARD].handle) { if (appData.popupExitMessage) { - if(appData.icsActive) SendToICS("logout\n"); // [HGM] make sure no new games will be started + if(logout) SendToICS("logout\n"); // [HGM] make sure no new games will be started ErrorPopUp(status ? _("Fatal Error") : _("Exiting"), message, TRUE); } else { ExitEvent(status); @@ -2597,10 +2649,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; } @@ -2630,7 +2682,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); } @@ -2658,7 +2710,9 @@ DisplayHelp (char *name) 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 @@ -2970,30 +3024,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 ? msg : clockMsg[!n], MSG_SIZ); +} //--------------------------------------------- @@ -3281,10 +3344,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 @@ -3297,7 +3364,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); @@ -3352,3 +3421,11 @@ ActivateTheme (int col) DrawPosition(True, NULL); } +char * +Shorten (char *s) +{ + static char buf[MSG_SIZ]; + if(strstr(s, dataDir) != s) return s; + snprintf(buf, MSG_SIZ, "~~%s", s + strlen(dataDir)); + return buf; +}